仅针对特定的oracle过程禁用触发器

时间:2020-11-11 06:09:05

标签: oracle triggers procedure

我们要求仅针对在ORACLE中运行的特定过程禁用触发器。

我们有表A和表B。

触发器被设计为针对表A的每次插入或更新插入表B。

该过程在表A中进行输入。

How to enable/disable trigger in procedure?

上面的链接说明了在此过程中如何启用和禁用触发器。

但是我的要求是在此过程运行期间,如果表A中还有其他插入,则触发器应按预期运行。

这可能吗?如果可能的话,请帮助您实现相同的目标。

2 个答案:

答案 0 :(得分:2)

您可以使用DBMS_APPLICATION_INFOSYS_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 和其他方法区分开是否触发扳机。当然,这意味着触发器始终保持启用状态。