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
Иногда вам нужно ОТКЛЮЧИТЬ триггер в некоторых условиях, например,
-
Объект, на который ссылается триггер, недоступен.
-
Вы должны выполнить большую загрузку данных и хотите, чтобы она выполнялась быстро, без срабатывания триггеров.
-
Вы загружаете данные в таблицу, к которой применяется триггер.
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 |
ВКЛЮЧЕНО |