触发器编译成功但仍未按预期触发
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
如果您在交易中发出 commit
或 rollback
,消息可能会出现在 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;
/
这是我的简单 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
如果您在交易中发出 commit
或 rollback
,消息可能会出现在 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;
/