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

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

示例(伪代码):

MyProcedure{

    disable MyTrigger;
    
    //doStuff
    
    enable MyTrigger;

};

【问题讨论】:

    标签: oracle stored-procedures triggers


    【解决方案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 -> 它会提交。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 2013-12-30
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多