1

使用 Oracle 数据库,需要以小写形式存储所有行。所有INSERT并且UPDATE应该插入和更新带有小写数据的行。我写了一个触发器来做到这一点。阅读很多关于使用触发器的表突变的内容。非常困惑,这段代码是否会引发突变错误。请写在这里,如果可以的话。

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

3 回答 3

3

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

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

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

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

于 2013-11-13T09:10:45.100 回答
2

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

于 2013-11-13T09:07:38.873 回答
0

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

注意:在某些情况下BEFORE,对于 SAME 行,触发器的触发次数不止一次。为了保证一致性,Oracle 必须证明您的触发器主体是“幂等的”:在同一输入上的每次执行都会给出相同的结果。

于 2013-11-13T09:11:03.820 回答