Как отключить все ограничения таблиц в Oracle с помощью одной команды? Это может быть либо одна таблица, список таблиц, либо все таблицы.
96
Лучше избегать записи временных файлов спула. Используйте блок PL / SQL. Вы можете запустить это из SQL * Plus или поместить в пакет или процедуру. Присоединение к USER_TABLES необходимо, чтобы избежать ограничений просмотра.
Маловероятно, что вы действительно хотите отключить все ограничения (включая NOT NULL, первичные ключи и т. Д.). Вам следует подумать о том, чтобы поместить constraint_type в предложение WHERE.
BEGIN
FOR c IN
(SELECT c.owner, c.table_name, c.constraint_name
FROM user_constraints c, user_tables t
WHERE c.table_name = t.table_name
AND c.status = 'ENABLED'
AND NOT (t.iot_type IS NOT NULL AND c.constraint_type = 'P')
ORDER BY c.constraint_type DESC)
LOOP
dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" disable constraint ' || c.constraint_name);
END LOOP;
END;
/
Снова включить ограничения немного сложнее - вам нужно включить ограничения первичного ключа, прежде чем вы сможете ссылаться на них в ограничении внешнего ключа. Это можно сделать с помощью ORDER BY для constraint_type. «P» = первичный ключ, «R» = внешний ключ.
BEGIN
FOR c IN
(SELECT c.owner, c.table_name, c.constraint_name
FROM user_constraints c, user_tables t
WHERE c.table_name = t.table_name
AND c.status = 'DISABLED'
ORDER BY c.constraint_type)
LOOP
dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" enable constraint ' || c.constraint_name);
END LOOP;
END;
/
AND NOT (t.iot_type IS NOT NULL AND c.constraint_type = 'P')
в первый сегмент кода.Чтобы учесть зависимости между ограничениями:
источник
Это не отдельная команда, но вот как я это делаю. Следующий сценарий разработан для работы в SQL * Plus. Обратите внимание, я специально написал это, чтобы работать только в рамках текущей схемы.
Чтобы ограничить то, что вы отбрасываете, добавьте фильтр в оператор select: -
Чтобы работать в более чем текущей схеме, измените оператор select, чтобы выбрать из all_constraints, а не user_constraints.
Примечание. По какой-то причине я не могу заставить подчеркивание НЕ действовать как курсив в предыдущем абзаце. Если кто-то знает, как это исправить, пожалуйста, отредактируйте этот ответ.
источник
Используйте следующий курсор, чтобы отключить все ограничения .. И изменить запрос для включения ограничений ...
источник
Это может быть написано в PL / SQL довольно просто на основе системного представления DBA / ALL / USER_CONSTRAINTS, но различные детали не так тривиальны, как кажется. Вы должны быть осторожны с порядком, в котором это делается, а также учитывать наличие уникальных индексов.
Порядок важен, потому что вы не можете удалить уникальный или первичный ключ, на который ссылается внешний ключ, и могут быть внешние ключи в таблицах в других схемах, которые ссылаются на первичные ключи в ваших собственных, поэтому, если у вас нет привилегии ALTER ANY TABLE, тогда вы не может отказаться от этих ПК и Великобритании. Кроме того, вы не можете переключить уникальный индекс на неуникальный индекс, поэтому вам придется отбросить его, чтобы снять ограничение (по этой причине почти всегда лучше реализовать уникальные ограничения как «реальное» ограничение, которое поддерживается не -уникальный указатель).
источник
Не похоже, что вы можете сделать это с помощью одной команды, но вот самое близкое к этому, что я смог найти.
источник
Это еще один способ отключения ограничений (он пришел с https://asktom.oracle.com/pls/asktom/f?p=100:11:2402577774283132::::P11_QUESTION_ID:399218963817 )
работает как шарм
источник
В сценарии "disable" предложение order by должно быть таким:
Цель этого пункта - отключить ограничения в правильном порядке.
источник
Этот оператор возвращает команды, которые отключают все ограничения, включая первичный ключ, внешние ключи и другие ограничения.
источник
с курсором для цикла (пользователь = 'TRANEE', table = 'D')
(Если вы измените disable на enable, вы можете включить все ограничения)
источник
Вы можете выполнить все команды, возвращаемые следующим запросом:
выберите «ALTER TABLE» || substr (c.table_name, 1,35) || 'ОТКЛЮЧИТЬ ОГРАНИЧЕНИЕ' || имя_ограничения || ' ; ' from user_constraints c --where c.table_name = 'TABLE_NAME';
источник