我们要求仅为ORACLE中运行的特定过程禁用触发器。
我们有A表和B表。
触发器被设计为在每次插入或更新表A时插入到表B中。
该过程将条目写入表A。
How to enable/disable trigger in procedure?
上面的链接解释了如何在该过程中启用和禁用触发器。
但我的要求是,在此过程运行期间,如果存在对表A的其他插入,则触发器应按预期运行。
这个是可能的吗?如果可能的话,请帮助我们实现同样的目标。
发布于 2020-11-11 15:22:24
您可以使用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>发布于 2020-11-11 14:45:57
不可能。如果触发器被禁用,那么它将被禁用并且不会工作。
但是,如果您修改了表并添加了一列,表明谁在向其中插入行,那么可以使用触发器的WHEN子句将此过程与其他插入器区分开来,并触发或不触发触发器。当然,这意味着触发器始终保持启用状态。
https://stackoverflow.com/questions/64781330
复制相似问题