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

时间:2018-11-18 20:32:23

标签: sql database oracle plsql triggers

我遇到不允许用户输入重复值的情况。如果用户尝试添加重复值,则系统会将用户的详细信息保存在审核表中。为此使用触发器。我的代码在下面

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;

但是此代码不会将数据插入审核表中。

我该如何实现?

1 个答案:

答案 0 :(得分:1)

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 automation_transaction 的过程,并将插入内容提交到审计表中。

一切都会像这样:

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

但是,为什么又要打扰呢?唯一性是这里的关键词。