【问题标题】:Disabling trigger only for specific oracle procedure仅针对特定 oracle 过程禁用触发器
【发布时间】:2020-11-11 06:09:05
【问题描述】:
我们需要为在 ORACLE 中运行的特定过程禁用触发器。
我们有表 A 和表 B。
触发器旨在为表 A 的每次插入或更新插入表 B。
该过程对表 A 进行条目。
How to enable/disable trigger in procedure?
以上链接说明了如何在此过程中启用和禁用触发器。
但我的要求是在此过程运行期间,如果表 A 中还有其他插入,则触发器应按预期运行。
这可能吗?如果可能的话,请帮助如何实现同样的目标。
【问题讨论】:
标签:
oracle
triggers
procedure
【解决方案1】:
您可以使用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>
【解决方案2】:
不可能。如果触发器被禁用,那么它被禁用并且不会工作。
但是,如果您更改表并添加一列,说明谁在向其中插入行,那么您可以使用触发器的 WHEN 子句将此过程与其他插入器区分开来,然后触发触发与否。当然,这意味着该触发器始终保持启用状态。