【问题标题】: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_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>
    

    【讨论】:

    • 非常感谢您提供的详细信息。将检查并恢复
    【解决方案2】:

    不可能。如果触发器被禁用,那么它被禁用并且不会工作。

    但是,如果您更改表并添加一列,说明谁在向其中插入行,那么您可以使用触发器的 WHEN 子句将此过程与其他插入器区分开来,然后触发触发与否。当然,这意味着该触发器始终保持启用状态。

    【讨论】:

      猜你喜欢
      • 2013-02-09
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 2017-04-08
      • 1970-01-01
      相关资源
      最近更新 更多