使用Oracle数据库,需要以小写形式存储所有行。所有INSERT
和UPDATE
都应插入并更新包含小写数据的行。我写了一个触发器来做到这一点。用触发器阅读了很多关于表变异的内容。很困惑,这段代码是否会引发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;
/
答案 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。在同一输入上的每次执行都会产生相同的结果。