【问题标题】:Why does my trigger get fired before insert of a row, even though specified [AFTER] in trigger declaration?为什么我的触发器在插入行之前被触发,即使在触发器声明中指定了 [AFTER]?
【发布时间】:2017-12-11 00:06:32
【问题描述】:

问题:在 SQL 触发器的输出中混淆(下面发布的代码

SQL> insert into STUDENT VALUES('NAME');

Output: 
<<Trigger Executed>>
1 row created.

为了便于阅读和理解,我创建了一个足够简单的触发器和一个表:

正在执行程序:[ORACLE 10g SQL 命令行]

SQL:> start F:/FILE.SQL

FILE.SQL 包含(以下代码):

set serveroutput ON;

-- <<DROPING ANY TABLE IF ALREADY EXIST>>
DROP TABLE STUDENT ;

CREATE TABLE STUDENT  
(
    sname varchar2(20) 
)
/

CREATE OR REPLACE TRIGGER MYTRIGGER
AFTER INSERT ON STUDENT 
FOR EACH ROW 
BEGIN
    dbms_output.put_line('<<Trigger Executed>> '); 
END;
/
insert into STUDENT values('Myname');

问题:因为触发器在插入值后立即执行。所以,如果我正确理解了理论,输出应该是:

1 row created.
<<Trigger Executed.>>

而不是

<<Trigger Executed.>>
1 row created.

逻辑上是正确的。

尝试过:我在触发器声明中尝试了BEFOREAFTER 以获得所需的输出,但每次都得到相同的结果。

我知道触发器是如何工作的,我只是对执行顺序感到困惑。

【问题讨论】:

  • 执行的输出结果取决于服务器,一切都发生在服务器中,然后将执行结果发送给客户端(在 I/U/D/S 的情况下。) .由于触发器是一个服务器事件,它在服务器向客户端发送受插入命令影响的行数之前输出 dbms_ouput,因此您看到的输出。
  • @JorgeCampos 来自其中一个答案,我理解了执行顺序,插入操作首先执行然后触发,最后 SQL 发送多少行受到影响,正如您在评论中提到的那样。非常感谢您对 Stack Overflow 的帮助。

标签: oracle plsql triggers


【解决方案1】:

无论触发器做什么,都会在事务窗口中发生。事实上,触发器与触发语句是原子的:也就是说,如果任何触发器失败,则整个语句都会失败。

1 row created. 只是语句已完成的 SQL*Plus 消息。在原子操作完成之前无法显示它。这就是触发器的输出在 SQL*Plus 消息之前的原因

【讨论】:

  • 很棒的答案,值得为“而创建 1 行。只是 SQL*Plus 消息”投票。
【解决方案2】:

会发生什么

  1. 新行已插入。
  2. 触发器被触发并打印"&lt;&lt;Trigger Executed.&gt;&gt;"
  3. 命令终止,SQL*Plus 打印"1 row created"

即,“1 行已创建” 在插入行并运行触发器后打印。如果要查看触发触发器时是否已插入行,请打印学生姓名。类似的东西

CREATE OR REPLACE TRIGGER MYTRIGGER
    AFTER INSERT ON STUDENT 
    FOR EACH ROW
BEGIN
   dbms_output.put_line('<<Trigger executed, student = ' || :new.sname || ' >>');
END;

现在应该是输出

<<Trigger executed, student = Myname >>  
1 row created.

【讨论】:

  • 那么1 row created 是一条与执行无关的简单消息吗?
  • 在所有操作终止后打印(插入 + 触发器),而不是在插入行时打印。
  • @APC,它打算在触发器中。现在添加了触发器标题行。
猜你喜欢
  • 1970-01-01
  • 2012-06-06
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 2017-08-15
  • 1970-01-01
相关资源
最近更新 更多