Oracle12--变异表(五十四)

来源:互联网 发布:淘宝店铺生意不好 编辑:程序博客网 时间:2024/04/29 11:29
  • 啥是变异表
    • 定义:当一张数据表执行了更新操作后,就成为了一张变异表;
    • 问题:如果在变异表上设置了行级触发器,就会出现ORA-04091的异常;
    • 示例1:通过一个程序来说明此问题。定义一张数据表

DROP TABLE info PURGE ;

CREATE TABLE info(

id NUMBER ,

title VARCHAR2(50)

) ;

INSERT INTO info (id,title) VALUES (1,'www.mldnjava.cn') ;

  • 为info表增加一个触发器

CREATE OR REPLACE TRIGGER info_trigger

BEFORE INSERT OR UPDATE OR DELETE

ON info

FOR EACH ROW

DECLARE

v_infocount NUMBER ;

BEGIN

SELECT COUNT(id) INTO v_infocount FROM info ;

END ;

/

  • 执行更新操作

UPDATE info SET id=2 ;

运行结果:

错误报告:

SQL 错误: ORA-04091: 表 SS.INFO 发生了变化, 触发器/函数不能读它

ORA-06512: 在 "SS.INFO_TRIGGER", line 4

ORA-04088: 触发器 'SS.INFO_TRIGGER' 执行过程中出错

  • 该错误,在没有触发器的情况下是不会发生的,但如果设置了行级触发器,则表示每次当表被修改时都会由于每行的更新操作被触发,直到修改操作之前触发器都无法看到数据表的这些改变;
    • 虽然可以继续使用":new"和":old"两个标识符,但是不能读取到表的状态,就会出现ORA-04091异常;
原创粉丝点击