使用此触发器 oracle 数据库更改表
Posted
技术标签:
【中文标题】使用此触发器 oracle 数据库更改表【英文标题】:mutating table with this trigger oracle database 【发布时间】:2013-11-13 08:59:09 【问题描述】:使用 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;
/
【问题讨论】:
试图理解,但也许这个链接有用asktom.oracle.com/pls/asktom/… 【参考方案1】:触发器不会引发变异表错误,因为您没有从触发器所在的表中进行选择;您只是在重新分配值,这就是触发器的设计目的。
值得注意的是,这也可以通过 CHECK 约束来完成,这将强制每个人更新或插入表中以小写所有内容:
alter table employee_name
add constraint chk_emp_name_lastname
check ( lastname = lower(lastname) )
虽然这会增加更新/插入时间(不一定超过使用触发器),但它不会默默地更改正在输入的数据,而是抱怨数据不正确。这有时是更好的方法。
【讨论】:
【参考方案2】:此代码不会引发异常 因为你没有尝试从触发执行的表中选择
【讨论】:
【参考方案3】:这不应引发任何错误。当您从 BEFORE
触发器读取(或修改)其他一些行时,会发生变异错误。
注意:在某些情况下,BEFORE
触发器对同一行的触发次数不止一次。
为了保证一致性,Oracle 必须证明您的触发器主体是“幂等的”:e.i.在同一输入上的每次执行都会产生相同的结果。
【讨论】:
以上是关于使用此触发器 oracle 数据库更改表的主要内容,如果未能解决你的问题,请参考以下文章
创建触发器以保存oracle中表的CONSTRAINTs更改
触发器实现对插入数据的字段更改 Oracle+SQL Server