使用此触发器预言机数据库的变异表



使用Oracle数据库,需要将所有行以小写形式存储。所有INSERTUPDATE都应插入和更新具有小写数据的行。我写了一个触发器来做到这一点。阅读大量关于使用触发器的表突变的信息。很困惑,这段代码会不会引发变异错误。如果愿意,请写在这里。

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

触发器不会引发更改表错误,因为您没有从触发器所在的表中进行选择; 您只是重新分配值,这就是触发器的设计目的。

值得注意的是,这也可以通过 CHECK 约束来实现,这将强制每个人更新或插入到表中以小写所有内容:

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

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

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

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

注意:在某些情况下BEFORE同一行触发触发器的次数超过一次。为了保证一致性,Oracle必须证明你的触发器主体是"幂等的":即对同一输入的每个执行都会给出相同的结果。

最新更新