当发生约束冲突时,如何调用触发器



我有一种情况,用户不允许输入重复的值。如果用户试图添加重复的值,系统会在审核表中保存用户的详细信息。触发器用于此。我的代码低于

create or replace trigger tr_add_on_audit_table
before insert on lds_consultant
for each row
declare
uname varchar2(30);
begin
select username into uname from lds_consultant where username = :NEW.USERNAME;
if uname <> '' or uname <> null then
insert into audit_table values(null, null, 'nishan', 'insert', null, null, 'cmd', null, 'LDS_CONSULTANT', 'CONSULTANT_ID',null, null, null);
end if;
end;

但这段代码并没有将数据插入审计表。

我怎样才能做到这一点?

NULL不等于也不不同于任何东西。您应该使用IS NULLIS NOT NULL,而不是<>=

类似这样的东西:

create or replace trigger tr_add_on_audit_table
before insert on lds_consultant
for each row
declare
uname varchar2(30);
begin
select username 
into uname 
from lds_consultant 
where username = :NEW.USERNAME;
if uname is not null then          --> this!
insert into audit_table 
values(null, null, 'nishan', 'insert', null, null, 'cmd', null, 'LDS_CONSULTANT', 'CONSULTANT_ID',null, null, null);
end if;
exception
when no_data_found then
null;
end;

我包含了异常处理程序部分,以防SELECT不返回任何内容;如果不太可能,请将其移除(或正确处理;我什么都不做(NULL;(。此外,如有必要,还应处理其他异常。

此外,我建议您命名要插入的所有列。今天,你知道什么值会去哪里,但一两个月后,你就会忘记第三个NULL值的含义。

此外,您说过用户不允许输入重复的值——好吧,这段代码不会实现这一点。

最简单的选项是在USERNAME列上创建唯一键约束,并让Oracle处理重复项。

如果你想自己做,你应该例如

raise_application_error(-20000, 'Duplicate username is not allowed);

但是,这不会将INSERT保存到表中,因为所有内容都将回滚。为了解决此问题,请创建一个使用pragma autonomous_transaction的过程,并将insert提交到审核表中。

一切看起来都是这样的:

create or replace procedure p_audit as
pragma autonomous_transaction;
begin
insert into audit_table 
values(null, null, 'nishan', 'insert', null, null, 'cmd', null, 'LDS_CONSULTANT', 'CONSULTANT_ID',null, null, null);
commit;
end;
/
create or replace trigger tr_add_on_audit_table
before insert on lds_consultant
for each row
declare
uname varchar2(30);
begin
select username 
into uname 
from lds_consultant 
where username = :NEW.USERNAME;
if uname is not null then
p_audit;
raise_application_error(-20000, 'Duplicates are not allowed')
end if;
exception
when no_data_found then
null;
end;
/

但是,再一次,为什么要麻烦呢?唯一性是这里的关键词。

最新更新