我可以暂时禁用 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 存储过程中的触发器吗?的主要内容,如果未能解决你的问题,请参考以下文章