使用此触发器 oracle 数据库更改表

Posted

技术标签:

【中文标题】使用此触发器 oracle 数据库更改表【英文标题】:mutating table with this trigger oracle database 【发布时间】:2013-11-13 08:59:09 【问题描述】:

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

【问题讨论】:

试图理解,但也许这个链接有用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 回滚和触发

创建触发器以保存oracle中表的CONSTRAINTs更改

触发器实现对插入数据的字段更改 Oracle+SQL Server

特定表的 Oracle 11g 审计跟踪

在 Oracle 触发器中动态评估伪记录 (:OLD, :NEW)

Oracle中,多表关联删除该怎么写?