Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

...

Можно использовать скрипты, которые выполнят данную операцию. Но, автору данной инструкции удобнее использовать программу TOAD. В которой для схемы supermag - отбираются (поочередно) все ограничения и триггеры - и производится их отключение.


Информация

Вот скрипт Скрипт для отключения отключения всех включённых ограничений в схеме supermag. Он отключает ограничения в безопасном порядке: сначала внешние ключи (чтобы не зависеть от родительских ограничений), затем первичные/уникальные ключи, потом проверочные.


sql


SET
SERVEROUTPUT ON;
DECLARE v_sql VARCHAR2(4000); BEGIN FOR c IN (SELECT table_name, constraint_name, constraint_type FROM user_constraints WHERE status = 'ENABLED' ORDER BY CASE constraint_type WHEN 'R' THEN 1 -- сначала внешние ключи WHEN 'P' THEN 2 -- затем первичные WHEN 'U' THEN 3 -- уникальные WHEN 'C' THEN 4 -- проверочные ELSE 5 END) LOOP BEGIN v_sql := 'ALTER TABLE "' || c.table_name || '" DISABLE CONSTRAINT "' || c.constraint_name || '"'; EXECUTE IMMEDIATE v_sql; DBMS_OUTPUT.PUT_LINE('Отключено ограничение: ' || c.constraint_name || ' на таблице ' || c.table_name); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Ошибка отключения ' || c.constraint_name || ': ' || SQLERRM); END; END LOOP; END; /

Что делает скрипт:

  • Находит все включённые (status = 'ENABLED') ограничения в текущей схеме.

  • Отключает их в порядке: внешние ключи → первичные ключи → уникальные ограничения → проверочные. Это позволяет избежать ошибок из-за зависимостей (например, отключение первичного ключа, на который ссылается включённый внешний ключ, невозможно; сначала нужно отключить внешний ключ).

  • Выполняет ALTER TABLE ... DISABLE CONSTRAINT ... без дополнительных параметров.

  • Выводит результат или ошибку.

 

Импорт данных.

create or replace directory dir as 'C:\BASE';

...

Можно использовать скрипты, которые выполнят данную операцию. Но, автору данной инструкции удобнее использовать программу TOAD. В которой для схемы supermag - отбираются (поочередно) все ограничения и триггеры - и производится их активация (включение).


Информация

Н иже Ниже представлен PL/SQL-скрипт для включения всех отключённых ограничений в схеме схеме supermag (Oracle 19) без проверки уже существующих данных (опция ENABLE NOVALIDATE).

Скрипт предполагает выполнение от имени владельца схемы supermag. Если вы подключаетесь под другим пользователем, замените user_constraints на all_constraints с фильтром по owner = 'SUPERMAG'.


sql


SET SERVEROUTPUT ON;
DECLARE
   v_sql VARCHAR2(4000);
BEGIN
   FOR c IN (SELECT table_name, constraint_name, constraint_type
             FROM user_constraints 
             WHERE status = 'DISABLED'
             ORDER BY CASE constraint_type 
                        WHEN 'P' THEN 1   -- первичные ключи
                        WHEN 'U' THEN 2   -- уникальные
                        WHEN 'R' THEN 3   -- внешние ключи
                        WHEN 'C' THEN 4   -- проверочные
                        ELSE 5
                      END)
   LOOP
      BEGIN
         v_sql := 'ALTER TABLE "' || c.table_name || '" ENABLE NOVALIDATE CONSTRAINT "' || c.constraint_name || '"';
         EXECUTE IMMEDIATE v_sql;
         DBMS_OUTPUT.PUT_LINE('Включено ограничение: ' || c.constraint_name || ' на таблице ' || c.table_name);
      EXCEPTION
         WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('Ошибка включения ' || c.constraint_name || ': ' || SQLERRM);
      END;
   END LOOP;
END;
/

Что делает скрипт:

  • Находит все отключённые (status = 'DISABLED') ограничения в текущей схеме.

  • Упорядочивает их по типу: сначала первичные и уникальные ключи, затем внешние, затем проверочные. Это позволяет избежать ошибок при включении внешних ключей (для них необходимо, чтобы родительский ключ уже был активен).

  • Для каждого ограничения выполняет ALTER TABLE ... ENABLE NOVALIDATE CONSTRAINT ..., что включает констрейнт без проверки соответствия существующих данных.

  • Выводит в консоль результат (успех или ошибку).

Важные замечания:

  • ENABLE NOVALIDATE гарантирует, что все новые операции DML будут проверяться ограничением, а старые данные остаются нетронутыми (даже если они нарушают ограничение). Вы указали, что данные заведомо корректны, поэтому никаких проблем не возникнет.

  • Для первичных и уникальных ключей при включении будет создан уникальный индекс (если он был удалён при предыдущем отключении). Поскольку данные уникальны, операция пройдёт успешно.

  • Если какой-то внешний ключ ссылается на ограничение в другой схеме или таблице, убедитесь, что родительское ограничение уже активно (наш порядок включения минимизирует риск, но при кросс-схемных ссылках может потребоваться отдельная обработка).

  • Скрипт не требует дополнительных привилегий, если выполняется от владельца схемы.

 

Промышленная эксплуатация.

...