我们要求仅针对在ORACLE中运行的特定过程禁用触发器。
我们有表A和表B。
触发器被设计为针对表A的每次插入或更新插入表B。
该过程在表A中进行输入。
How to enable/disable trigger in procedure?
上面的链接说明了在此过程中如何启用和禁用触发器。
但是我的要求是在此过程运行期间,如果表A中还有其他插入,则触发器应按预期运行。
这可能吗?如果可能的话,请帮助您实现相同的目标。
答案 0 :(得分:2)
您可以使用DBMS_APPLICATION_INFO
和SYS_CONTEXT
在过程中设置任何参数,然后在TRIGGER
中检查该参数,以查看是否应在触发器中采取任何措施或不如下:
表说明:
SQL> DESC AA;
Name Null? Type
----------------------------------------- -------- ----------------------------
COL1 NOT NULL NUMBER
SQL>
触发代码:
SQL> CREATE OR REPLACE TRIGGER AA_TRG BEFORE
2 INSERT OR UPDATE ON AA
3 FOR EACH ROW
4 BEGIN
5 IF SYS_CONTEXT(
6 'USERENV',
7 'ACTION'
8 ) = 'DISABLE_TRIGGER' THEN
9 DBMS_OUTPUT.PUT_LINE('TRIGGER DISABLED');
10 ELSE
11 DBMS_OUTPUT.PUT_LINE('TRIGGER ENABLED');
12 END IF;
13
14 DBMS_APPLICATION_INFO.SET_ACTION(ACTION_NAME => NULL);
15 END;
16 /
Trigger created.
SQL>
禁用的触发过程代码:
SQL> CREATE OR REPLACE PROCEDURE AA_DISABLED_TRIGGER_PROC AS
2 BEGIN
3 DBMS_APPLICATION_INFO.SET_ACTION(ACTION_NAME => 'DISABLE_TRIGGER');
4 INSERT INTO AA VALUES ( 3 );
5
6 ROLLBACK;
7 END;
8 /
Procedure created.
SQL>
已启用触发过程代码:
SQL> CREATE OR REPLACE PROCEDURE AA_ENABLED_TRIGGER_PROC AS
2 BEGIN
3 INSERT INTO AA VALUES ( 3 );
4
5 ROLLBACK;
6 END;
7 /
Procedure created.
SQL>
调用过程:
SQL>
SQL> SET SERVEROUT ON
SQL> BEGIN
2 AA_ENABLED_TRIGGER_PROC;
3 END;
4 /
TRIGGER ENABLED
PL/SQL procedure successfully completed.
SQL>
SQL> SET SERVEROUT ON
SQL> BEGIN
2 AA_DISABLED_TRIGGER_PROC;
3 END;
4 /
TRIGGER DISABLED
PL/SQL procedure successfully completed.
SQL>
SQL> SET SERVEROUT ON
SQL> BEGIN
2 AA_ENABLED_TRIGGER_PROC;
3 END;
4 /
TRIGGER ENABLED
PL/SQL procedure successfully completed.
SQL>
答案 1 :(得分:0)
不可能。如果触发器被禁用,则它被禁用,并且将不起作用。
但是,如果您更改表并添加一列来说明谁在其中插入行,则可以使用触发器的WHEN
子句将此过程与其他 inserters 和其他方法区分开是否触发扳机。当然,这意味着触发器始终保持启用状态。