Oracle PL/SQL - включить и отключить триггеры

Oracle PL / SQL - включение и отключение триггеров

В этой статье показано, как использоватьALTER TRIGGER иALTER TABLE для включения и отключения триггеров.

-- enable / disable a trigger
ALTER TRIGGER trigger_name ENABLE;
ALTER TRIGGER trigger_name DISABLE;

-- enable / disable all triggers for a specific table
ALTER TABLE table_name ENABLE ALL TRIGGERS;
ALTER TABLE table_name DISABLE ALL TRIGGERS;

1. Таблица + триггеры

1.1 Create a table and two triggers on it.

test_data

--Creating test_data table.

CREATE TABLE test_data
(
  id number(5) primary key,
  test_result number(5)
);

trg_test_a

SET SERVEROUTPUT ON;

CREATE OR REPLACE TRIGGER trg_test_a
BEFORE
     UPDATE OR DELETE OR INSERT
ON test_data
  FOR EACH ROW

BEGIN

  -- business logic will be here to perform on any insert/update/delete
  dbms_output.put_line('trg_test_a Trigger called.');

END;

trg_test_b

SET SERVEROUTPUT ON;

CREATE OR REPLACE TRIGGER trg_test_b
BEFORE
     UPDATE OR DELETE OR INSERT
ON test_data
  FOR EACH ROW

BEGIN

  dbms_output.put_line('trg_test_b Trigger called.');

END;

Когда вы создаете триггеры, по умолчанию они будутENABLED.

SELECT TRIGGER_NAME,STATUS FROM USER_TRIGGERS where upper(TRIGGER_NAME) in ('TRG_TEST_A','TRG_TEST_B');
TRIGGER_NAME ПОЛОЖЕНИЕ ДЕЛ

trg_test_a

ВКЛЮЧЕНО

trg_test_b

ВКЛЮЧЕНО

2. ALTER TRIGGER - Включение и отключение триггера

2.1 Example to disable a trigger trg_test_a

ALTER TRIGGER trg_test_a DISABLE;

2.2 Check trigger status.

SELECT TRIGGER_NAME,STATUS FROM USER_TRIGGERS where upper(TRIGGER_NAME) = 'TRG_TEST_A';
TRIGGER_NAME ПОЛОЖЕНИЕ ДЕЛ

TRG_TEST_A

ОТКЛЮЧЕН

Note
Иногда вам нужно ОТКЛЮЧИТЬ триггер в некоторых условиях, например,

  1. Объект, на который ссылается триггер, недоступен.

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

  3. Вы загружаете данные в таблицу, к которой применяется триггер.

2.3 Example to enable a disabled trigger trg_test_a

ALTER TRIGGER trg_test_a ENABLE;

2.4 Check trigger status again.

SELECT TRIGGER_NAME,STATUS FROM USER_TRIGGERS where upper(TRIGGER_NAME) = 'TRG_TEST_A';
TRIGGER_NAME ПОЛОЖЕНИЕ ДЕЛ

TRG_TEST_A

ВКЛЮЧЕНО

3. ALTER TABLE - включить и отключить все триггеры

3.1 Example to disbale all triggers for a specific table test_data

ALTER TABLE test_data DISABLE ALL TRIGGERS;

3.2 Check triggers status.

SELECT TRIGGER_NAME,STATUS FROM USER_TRIGGERS where upper(TRIGGER_NAME) IN ('TRG_TEST_A','TRG_TEST_B');
TRIGGER_NAME ПОЛОЖЕНИЕ ДЕЛ

TRG_TEST_A

ОТКЛЮЧЕН

TRG_TEST_B

ОТКЛЮЧЕН

3.3 Example to enable all triggers for a specific table test_data

ALTER TABLE test_data ENABLE ALL TRIGGERS;

3.4 Check triggers status again.

SELECT TRIGGER_NAME,STATUS FROM USER_TRIGGERS where upper(TRIGGER_NAME) IN ('TRG_TEST_A','TRG_TEST_B');
TRIGGER_NAME ПОЛОЖЕНИЕ ДЕЛ

TRG_TEST_A

ВКЛЮЧЕНО

TRG_TEST_B

ВКЛЮЧЕНО