我可以暂时禁用 oracle 存储过程中的触发器吗?

Posted

技术标签:

【中文标题】我可以暂时禁用 oracle 存储过程中的触发器吗?【英文标题】:Can I temporarily disable a trigger in an oracle stored procedure? 【发布时间】:2011-11-12 00:31:44 【问题描述】:

我可以在 oracle 存储过程中临时禁用触发器吗?

示例(伪代码):

MyProcedure

    disable MyTrigger;
    
    //doStuff
    
    enable MyTrigger;

;

【问题讨论】:

【参考方案1】:

您可以使用 EXECUTE IMMEDIATE 语法通过动态 SQL 发出 DDL,例如“ALTER TRIGGER”语句。

这里有一个描述: http://download.oracle.com/docs/cd/B12037_01/appdev.101/b10807/13_elems017.htm

PROCEDURE myProcedure
IS
BEGIN
   EXECUTE IMMEDIATE 'ALTER TRIGGER triggername DISABLE';

   -- Do work

   EXECUTE IMMEDIATE 'ALTER TRIGGER triggername ENABLE';
EXCEPTION
   WHEN OTHERS
   THEN
      -- Handle Exceptions
END myProcedure;

如果您愿意,也可以使用 VARCHAR 变量构建动态 SQL:

PROCEDURE myProcedure
IS
   v_triggername VARCHAR2(30) := 'triggername';
BEGIN
   EXECUTE IMMEDIATE 'ALTER TRIGGER '||v_triggername||' DISABLE';

   -- Do work

   EXECUTE IMMEDIATE 'ALTER TRIGGER '||v_triggername||' ENABLE';
EXCEPTION
   WHEN OTHERS
   THEN
      -- Handle Exceptions
END myProcedure;

如果您这样做,那么您还应该查看包 DBMS_ASSERT 以包装触发器名称并帮助强化您的代码以抵御 SQL 注入攻击。

【讨论】:

@giuseppe 小心:Alter 触发器是 ddl -> 它会提交。

以上是关于我可以暂时禁用 oracle 存储过程中的触发器吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在导入过程中禁用Oracle约束条件和触发器

oracle 11g 带触发器的存储过程

Oracle数据库中有关触发器问题

oracle 存储过程与触发器

是否有可能暂时禁用Laravel中的事件?

Oracle 学习之触发器