首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >仅为特定oracle过程禁用触发器

仅为特定oracle过程禁用触发器
EN

Stack Overflow用户
提问于 2020-11-11 14:09:06
回答 2查看 71关注 0票数 0

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

我们有A表和B表。

触发器被设计为在每次插入或更新表A时插入到表B中。

该过程将条目写入表A。

How to enable/disable trigger in procedure?

上面的链接解释了如何在该过程中启用和禁用触发器。

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

这个是可能的吗?如果可能的话,请帮助我们实现同样的目标。

EN

回答 2

Stack Overflow用户

发布于 2020-11-11 15:22:24

您可以使用DBMS_APPLICATION_INFOSYS_CONTEXT在过程中设置任何参数,然后在TRIGGER中检查该参数,以确定是否应在触发器中执行任何操作,如下所示:

表描述:

代码语言:javascript
复制
SQL> DESC AA;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 COL1                                      NOT NULL NUMBER

SQL>

触发器代码:

代码语言:javascript
复制
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>

禁用的触发器过程代码:

代码语言:javascript
复制
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>

启用的触发器过程代码:

代码语言:javascript
复制
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>

调用过程的

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2020-11-11 14:45:57

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64781330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档