触发器无法停止 table 插入
Trigger not working for stopping table insert
我使用以下代码停止使用触发器将空值插入 table。但是当我传递空值时,插入进行得很好。知道我在这里做错了什么吗?
create table test
(col1 number,
col2 varchar2(40)
)
create or replace trigger test_trg
after insert on test
for each row
declare
excp exception;
pragma autonomous_transaction;
begin
if :new.col2 is null then
RAISE excp;
end if;
exception
when excp then
dbms_output.put_line('error');
rollback;
end;
(请注意,我承认在 col2 上使用 not null 或检查约束是更好的解决方案。我只是想在这个看似正确的代码中找出错误背后的原因)
你必须将触发器定义为 BEFORE INSERT
才能在执行插入之前触发,删除 pragma autonomouse_transaction
和 rollback
(它们在这里没有意义,因为你没有任何 DML),然后在异常处理程序中重新引发异常
不要在触发器中回滚,只需在记录后重新引发异常:
create or replace trigger test_trg
after insert on test
for each row
declare
excp exception;
pragma autonomous_transaction;
begin
if :new.col2 is null then
RAISE excp;
end if;
exception
when excp then
dbms_output.put_line('error');
raise; -- propagate error
end;
当您在代码中放置 "exception ... end;" 块时,您对 PL/SQL 说管理此错误的后果是您的责任。因此,如果您没有从处理原始错误的代码中引发任何错误,对于 PL/SQL 这意味着关于此错误的所有操作都已在您的代码中完成,一切正常并且必须插入记录。
您可以在 this SQLFiddle 中尝试。
我使用以下代码停止使用触发器将空值插入 table。但是当我传递空值时,插入进行得很好。知道我在这里做错了什么吗?
create table test
(col1 number,
col2 varchar2(40)
)
create or replace trigger test_trg
after insert on test
for each row
declare
excp exception;
pragma autonomous_transaction;
begin
if :new.col2 is null then
RAISE excp;
end if;
exception
when excp then
dbms_output.put_line('error');
rollback;
end;
(请注意,我承认在 col2 上使用 not null 或检查约束是更好的解决方案。我只是想在这个看似正确的代码中找出错误背后的原因)
你必须将触发器定义为 BEFORE INSERT
才能在执行插入之前触发,删除 pragma autonomouse_transaction
和 rollback
(它们在这里没有意义,因为你没有任何 DML),然后在异常处理程序中重新引发异常
不要在触发器中回滚,只需在记录后重新引发异常:
create or replace trigger test_trg
after insert on test
for each row
declare
excp exception;
pragma autonomous_transaction;
begin
if :new.col2 is null then
RAISE excp;
end if;
exception
when excp then
dbms_output.put_line('error');
raise; -- propagate error
end;
当您在代码中放置 "exception ... end;" 块时,您对 PL/SQL 说管理此错误的后果是您的责任。因此,如果您没有从处理原始错误的代码中引发任何错误,对于 PL/SQL 这意味着关于此错误的所有操作都已在您的代码中完成,一切正常并且必须插入记录。
您可以在 this SQLFiddle 中尝试。