Oracle 为什么在插入行之前触发我的触发器,即使在触发器声明中指定了[AFTER]?

Oracle 为什么在插入行之前触发我的触发器,即使在触发器声明中指定了[AFTER]?,oracle,plsql,triggers,Oracle,Plsql,Triggers,问题:SQL触发器输出混乱(下面发布的代码) FILE.SQL包含以下代码: 打开服务器输出; -- 落桌学生; 创建表学生 ( 斯奈姆·瓦尔查尔2(20) ) / 创建或替换触发器MYTRIGGER 在插入学生姓名后 每行 开始 dbms_output.put_行(“”); 结束; / 插入学生值(“Myname”); 问题:插入值后立即执行触发器。因此,如果我正确理解了理论,那么输出应该是: 1 row created. <<Trigger Executed.>>

问题:SQL触发器输出混乱(下面发布的代码)

FILE.SQL包含以下代码:

打开服务器输出;
-- 
落桌学生;
创建表学生
(
斯奈姆·瓦尔查尔2(20)
)
/
创建或替换触发器MYTRIGGER
在插入学生姓名后
每行
开始
dbms_output.put_行(“”);
结束;
/
插入学生值(“Myname”);
问题:插入值后立即执行触发器。因此,如果我正确理解了理论,那么输出应该是:

1 row created.
<<Trigger Executed.>>
1行已创建。
而不是

<<Trigger Executed.>>
1 row created.

创建了1行。
从逻辑上讲,这是正确的

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

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

发生的是

  • 插入新行
  • 触发器被触发并打印
  • 命令被终止,SQL*Plus将打印
    “创建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行。
    
    发生的是

  • 插入新行
  • 触发器被触发并打印
  • 命令被终止,SQL*Plus将打印
    “创建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.