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

Ключ

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

...

Информация

Ниже представлен 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 будут проверяться ограничением, а старые данные остаются нетронутыми (даже если они нарушают ограничение). Вы указали, что данные заведомо корректны, поэтому никаких проблем не возникнет.

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

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

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

 

Проверка структуры БД.

Обязательно, после выполнения всех действий.

Даже, если БД кажется вполне работоспособной. Необходимо выполнить проверку текущей структуры базы данных по сравнению с эталоном.

В качестве эталона должна использоваться заведомо рабочая, проверенная база.

Лучше для этих целей создать новую тестовую БД, и заполнить ее генератором СМ+.

Проверка структуры с эталоном производится в программе "Административный модуль" - "База данных" - "Утилиты" - "Эталон" 

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

...