触发器已成功编译但仍未按要求触发

时间:2017-10-28 04:59:50

标签: plsql oracle-sqldeveloper database-trigger

这是我用于演示目的的简单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');

OUTPUT:/

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

2 个答案:

答案 0 :(得分:0)

请勿在{{1​​}}内使用DBMS_OUTPUT.PUT_LINE来检查是否已被解雇。即使您使用trigger,某些IDE(如SQL developer)也可能无法输出消息。

但它可以在SET SERVEROUTPUT ON上运行。当我尝试时,它确实在sqlplus中显示消息。因此,这不是数据库或触发器的问题。

sqlplus

如果您在交易中发出SQL> insert into cust values('John'); Trigger hit on insert commit,则消息可能会显示在rollback中。

我建议,如果你可以创建一个日志表并尝试在其中插入记录而不是使用sql developer,那就更好了。

dbms_output

答案 1 :(得分:0)

您无法使用 DBMS_OUTPUT.PUT_LINE ,因为当您向表中插入数据时,没有显示触发器执行的提示或屏幕。这适用于过程,函数,触发器。

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

另外,请确保您不要在触发器中修改同一个表。它也会因为改变数据而抛出异常。

示例代码

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; 
/