触发器编译成功但仍未按预期触发

Trigger compiled successfully but still not firing as desired

这是我的简单 PL/SQL 代码,用于演示目的。

create table cust(cname varchar(10));
set SERVEROUTPUT ON;
create or replace trigger tgr
before insert on cust
for each row
enable
begin
dbms_output.put_line('Trigger hit on insert');
end;
/
insert into cust values('John');

输出:/

Table CUST created
Trigger TGR compiled
1 row inserted // *EXPECTING* Trigger hit on insert

不要在 trigger 中使用 DBMS_OUTPUT.PUT_LINE 来检查它是否被触发。某些 IDE,如 SQL developer 可能不会输出消息,即使您使用 SET SERVEROUTPUT ON

但是它可以在 sqlplus 上工作。当我尝试时,它确实在 sqlplus 中显示了消息。所以,这不是数据库或触发器的问题。

SQL> insert into cust values('John');
Trigger hit on insert

如果您在交易中发出 commitrollback,消息可能会出现在 sql developer

我建议,最好创建一个日志 table 并尝试向其中插入记录,而不是使用 dbms_output.

begin
INSERT INTO LOG_TABLE ( log_date,log_message) VALUES  (SYSDATE,'Trigger hit on insert');
end;
/

您不能使用 DBMS_OUTPUT.PUT_LINE,因为当您向 table 插入数据时,没有显示触发器执行的提示或屏幕.这同样适用于过程、函数、触发器。

不要 在 table 中使用 commit。它会抛出异常。如果你想使用 commit 然后触发 pragma autonomous_transaction (我建议不要使用 commit.it 会自动提交).

还要确保您没有在触发器中修改相同的 table。它还会抛出变异数据的异常。

示例代码

create table cust(cname varchar(10));
create table log(log varchar(10));
create or replace trigger tgr
before insert on cust
for each row
enable
begin
insert into log values('test');
end; 
/