Oracle 为什么在插入行之前触发我的触发器,即使在触发器声明中指定了[AFTER]?
问题:SQL触发器输出混乱(下面发布的代码) FILE.SQL包含以下代码:Oracle 为什么在插入行之前触发我的触发器,即使在触发器声明中指定了[AFTER]?,oracle,plsql,triggers,Oracle,Plsql,Triggers,问题:SQL触发器输出混乱(下面发布的代码) FILE.SQL包含以下代码: 打开服务器输出; -- 落桌学生; 创建表学生 ( 斯奈姆·瓦尔查尔2(20) ) / 创建或替换触发器MYTRIGGER 在插入学生姓名后 每行 开始 dbms_output.put_行(“”); 结束; / 插入学生值(“Myname”); 问题:插入值后立即执行触发器。因此,如果我正确理解了理论,那么输出应该是: 1 row created. <<Trigger Executed.>>
打开服务器输出;
--
落桌学生;
创建表学生
(
斯奈姆·瓦尔查尔2(20)
)
/
创建或替换触发器MYTRIGGER
在插入学生姓名后
每行
开始
dbms_output.put_行(“”);
结束;
/
插入学生值(“Myname”);
问题:插入值后立即执行触发器。因此,如果我正确理解了理论,那么输出应该是:
1 row created.
<<Trigger Executed.>>
1行已创建。
而不是
<<Trigger Executed.>>
1 row created.
创建了1行。
从逻辑上讲,这是正确的
尝试:我在触发器声明中尝试了之前
和之后
,以获得所需的输出,但每次都得到相同的结果
我知道触发器是如何工作的,我只是对执行顺序感到困惑。发生的是
“
“创建1行”
CREATE OR REPLACE TRIGGER MYTRIGGER
AFTER INSERT ON STUDENT
FOR EACH ROW
BEGIN
dbms_output.put_line('<<Trigger executed, student = ' || :new.sname || ' >>');
END;
创建或替换触发器MYTRIGGER
在插入学生姓名后
每行
开始
dbms_output.put_行(“”);
结束;
输出现在应该是
<<Trigger executed, student = Myname >>
1 row created.
创建了1行。
发生的是
“
“创建1行”
CREATE OR REPLACE TRIGGER MYTRIGGER
AFTER INSERT ON STUDENT
FOR EACH ROW
BEGIN
dbms_output.put_line('<<Trigger executed, student = ' || :new.sname || ' >>');
END;
创建或替换触发器MYTRIGGER
在插入学生姓名后
每行
开始
dbms_output.put_行(“”);
结束;
输出现在应该是
<<Trigger executed, student = Myname >>
1 row created.
创建了1行。
无论触发器在事务窗口中执行什么操作。事实上,触发器与firing语句是原子的:也就是说,如果任何触发器失败,整个语句都会失败
而
1行已创建。
只是语句已完成的SQL*Plus消息。在原子操作完成之前,它无法显示。这就是为什么无论触发器在事务窗口中执行什么操作,触发器的输出都会在SQL*Plus消息之前。事实上,触发器与firing语句是原子的:也就是说,如果任何触发器失败,整个语句都会失败
而
1行已创建。
只是语句已完成的SQL*Plus消息。在原子操作完成之前,它无法显示。这就是为什么触发器的输出在SQL*Plus消息之前执行的输出结果由服务器决定,服务器中发生的一切,然后它将执行结果发送到客户端(在I/U/D/s情况下)。由于触发器是一个服务器事件,它在服务器向客户端发送受insert命令影响的行数之前输出dbms输出,因此您看到的输出。@JorgeCampos从其中一个答案中,我了解了执行顺序,insert操作首先执行,然后触发,最后SQL发送您在注释中提到的受影响的行数。非常感谢yew对堆栈溢出的帮助。执行的输出结果由服务器决定,服务器中发生的一切,然后它将执行结果发送到客户端(在I/U/D/S情况下)。由于触发器是一个服务器事件,它在服务器向客户端发送受insert命令影响的行数之前输出dbms输出,因此您看到的输出。@JorgeCampos从其中一个答案中,我了解了执行顺序,insert操作首先执行,然后触发,最后SQL发送您在注释中提到的受影响的行数。非常感谢红豆杉对堆栈溢出的帮助。1行创建的消息是否简单,与执行无关?它是在所有操作结束后打印的(插入+触发器),而不是在插入行时打印。@APC,它应该在触发器中。现在添加了触发器标题行。那么创建的1行是否是一条与执行无关的简单消息?它在所有操作结束后打印(插入+触发),而不是在插入行时打印。@APC,它应该在触发器中。现在添加了触发器标题行。非常棒的答案,值得投票支持“创建了1行,只是SQL*Plus消息”。非常棒的答案,值得投票支持“创建了1行,只是SQL*Plus消息”。
<<Trigger executed, student = Myname >>
1 row created.