使用此触发器oracle数据库变异表

时间:2013-11-13 08:59:09

标签: sql oracle plsql triggers

使用Oracle数据库,需要以小写形式存储所有行。所有INSERTUPDATE都应插入并更新包含小写数据的行。我写了一个触发器来做到这一点。用触发器阅读了很多关于表变异的内容。很困惑,这段代码是否会引发mutate错误。请写在这里,如果愿意的话。

create or replace trigger employee_name
before update or insert on employee
for each row
begin
/* convert character values to lower case */
:new.lastname := lower( :new.lastname );
:new.firstname :=lower( :new.firstname );
end;
/

3 个答案:

答案 0 :(得分:3)

触发器将引发变异表错误,因为您没有从触发器所在的表中进行选择;你只是重新分配价值,这就是触发器的目的。

值得注意的是,这也可以通过CHECK约束来完成,这会强制每个人更新或插入表格以减少所有内容:

alter table employee_name 
  add constraint chk_emp_name_lastname 
      check ( lastname = lower(lastname) )

虽然这会增加更新/插入时间(不一定比使用触发器更多),但不会默默地更改输入的数据,而是抱怨数据不正确。这有时是一种更好的方法。

答案 1 :(得分:2)

此代码不会引发异常 因为你没有尝试从触发执行的表中选择

答案 2 :(得分:0)

这不应该引起任何错误。当您从BEFORE触发器读取(或修改)其他一些行时,会发生变异错误。

注意:在某些情况下,BEFORE触发器会针对SAME行触发一次。 为了保证Oracle的一致性,你的触发器体是“幂等的”:e.i。在同一输入上的每次执行都会产生相同的结果。