PL/SQL:如何启用模式中的所有触发器?

Posted

技术标签:

【中文标题】PL/SQL:如何启用模式中的所有触发器?【英文标题】:PL/SQL: How to enable all triggers in the schema? 【发布时间】:2019-11-15 22:47:06 【问题描述】:

我正在尝试创建一个使用游标的过程,该游标可以启用我的架构中的所有触发器。但是,我在第 16 行收到此错误:PL/SQL: SQL Statement ignored 这是我使用 fetch 的行。

   CREATE OR REPLACE PROCEDURE enable_trigg_proc
   IS
    v_trigger_name trigger_name.user_triggers%TYPE;

    CURSOR enable_trigg_cur
    IS
    SELECT TRIGGER_NAME INTO v_trigger_name
    FROM user_triggers
    WHERE STATUS = 'DISABLED';


    BEGIN
     OPEN enable_trigg_cur;
    LOOP
     FETCH enable_trigg_cur INTO v_trigger_name ;
      EXIT WHEN enable_trigg_cur%NOTFOUND;

EXECUTE IMMEDIATE  'ALTER TRIGGER v_trigger_name  ENABLE';
    END LOOP;
  close enable_trigg_cur;
END;

【问题讨论】:

显式游标不能包含 'INTO' 子句 - 这就是你得到 sql 语句被忽略问题的原因。 【参考方案1】:

你不需要那么多代码:

SQL> begin
  2    for cur_r in (select trigger_name from user_triggers) loop
  3      execute immediate 'alter trigger ' || cur_r.trigger_name || ' enable';
  4    end loop;
  5  end;
  6  /

PL/SQL procedure successfully completed.

SQL>

您的代码有什么问题? INTO 在 PL/SQL 的 SELECT 语句中是必需的,但在游标声明中不是。此外,您以错误的方式声明了变量;应该是

SQL> CREATE OR REPLACE PROCEDURE enable_trigg_proc
  2  IS
  3      CURSOR enable_trigg_cur
  4      IS
  5      SELECT TRIGGER_NAME
  6      FROM user_triggers
  7      WHERE STATUS = 'DISABLED';
  8
  9      v_trigger_name user_triggers.trigger_name%TYPE;
 10  BEGIN
 11      OPEN enable_trigg_cur;
 12      LOOP
 13        FETCH enable_trigg_cur INTO v_trigger_name ;
 14        EXIT WHEN enable_trigg_cur%NOTFOUND;
 15
 16        EXECUTE IMMEDIATE  'ALTER TRIGGER ' || v_trigger_name || ' ENABLE';
 17      END LOOP;
 18      close enable_trigg_cur;
 19  END;
 20  /

Procedure created.

SQL> exec enable_trigg_proc;

PL/SQL procedure successfully completed.

SQL>

【讨论】:

我现在看到了我的错误。谢谢。

以上是关于PL/SQL:如何启用模式中的所有触发器?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PL/SQL 中的触发器回滚列

如何通过 PL/SQL 中的触发器发送电子邮件

PL/SQL 如何比较触发器中的表达式?

PL/SQL 中的触发器

“如何修复 oracle pl/sql 中的触发器?

如何创建验证另一个表中的列的 PL/SQL 行触发器