Как отключить все триггеры, которые касаются таблицы в Oracle? - PullRequest
3 голосов
/ 01 апреля 2011

В Postgresql, если я сделаю ALTER TABLE mytable DISBLE TRIGGERS ALL, все триггеры и ограничения, связанные с этой таблицей, будут приостановлены.

В частности, внешние ключи из других таблиц в mytable приостановлены, и я могу удалить из mytable без проблем.У меня есть риск нарушить согласованность базы данных, но я знаю, что делаю, и у меня должны быть привилегии суперпользователя.

Как мне сделать то же самое в Oracle?У меня сложилось впечатление, что ALTER TABLE mytable DISBLE ALL TRIGGERS в Oracle приостановит все триггеры и ограничения, относящиеся к mytable, но не те, которые относятся к mytable, но относятся к другим таблицам (особенно внешним ключам).

Прав ли я и что быбыть в состоянии достичь того же результата, что и в Postgresql в Oracle?

1 Ответ

5 голосов
/ 01 апреля 2011

Синтаксис отключает триггеры в Oracle:

SQL> select trigger_name, status from user_triggers
  2  where table_name='TEST'
  3  /

TRIGGER_NAME                   STATUS
------------------------------ --------
TEST_TRIGGER                   ENABLED

SQL> ALTER TABLE test DISABLE ALL TRIGGERS
  2  /

Table altered.

SQL> select trigger_name, status from user_triggers
  2  where table_name='TEST'
  3  /

TRIGGER_NAME                   STATUS
------------------------------ --------
TEST_TRIGGER                   DISABLED

SQL>

Однако это ничего не даст для внешних ключей или для каких-либо других ограничений. Это связано с тем, что Oracle не использует триггеры для принудительного применения таких вещей. Хорошо, в рамках ограничений оболочки и пользовательских триггеров может использоваться определенный низкоуровневый код ядра. Но на том уровне, о котором мы говорим, это две разные вещи.

Если вы хотите отключить все внешние ключи на столе, боюсь, вам нужно использовать что-то вроде этого:

SQL> select constraint_name, status from user_constraints
  2  where table_name = 'EMP'
  3  and constraint_type = 'R'
  4  /

CONSTRAINT_NAME                STATUS
------------------------------ --------
FK_DEPTNO                      ENABLED


SQL> begin
  2      for r in ( select constraint_name, status from user_constraints
  3                 where table_name = 'EMP'
  4                 and constraint_type = 'R' )
  5      loop
  6          execute immediate 'alter table emp disable constraint '||r.constraint_name;
  7      end loop;
  8* end;
  9  /

PL/SQL procedure successfully completed.

SQL> select constraint_name, status from user_constraints
  2  where table_name = 'EMP'
  3  and constraint_type = 'R'
  4  /

CONSTRAINT_NAME                STATUS
------------------------------ --------
FK_DEPTNO                      DISABLED

SQL>

Это та вещь, которую вы, вероятно, захотите обернуть в пользовательскую функцию, которая принимает TABLE_NAME в качестве параметра. Также вам понадобится аналогичная функция для повторного включения ограничений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...