...
Можно использовать скрипты, которые выполнят данную операцию. Но, автору данной инструкции удобнее использовать программу 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';
...
| Информация |
|---|
Н иже представлен 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 будут проверяться ограничением, а старые данные остаются нетронутыми (даже если они нарушают ограничение). Вы указали, что данные заведомо корректны, поэтому никаких проблем не возникнет.
Для первичных и уникальных ключей при включении будет создан уникальный индекс (если он был удалён при предыдущем отключении). Поскольку данные уникальны, операция пройдёт успешно. Если какой-то внешний ключ ссылается на ограничение в другой схеме или таблице, убедитесь, что родительское ограничение уже активно (наш порядок включения минимизирует риск, но при кросс-схемных ссылках может потребоваться отдельная обработка). Скрипт не требует дополнительных привилегий, если выполняется от владельца схемы.
|
Промышленная эксплуатация.
...