ITPub博客

首页 > 数据库 > Oracle > PLSQL Language Referenc-PL/SQL静态SQL-自治事务-自治事务触发器

PLSQL Language Referenc-PL/SQL静态SQL-自治事务-自治事务触发器

原创 Oracle 作者: luisedalian 时间:2014-03-18 00:09:42 0 删除 编辑

自治事务触发器

运行DCL或DDL语句的触发器必须是自治的;为了运行DDL语句,触发器必须使用本地动态SQL(EXECUTE IMMEDIATE)。

触发器的用途之一就是明确地记录事件,例,将所有的更新操作记录到表中,即使它被回滚了。

--自治触发器日志插入语句

DROP TABLE emp;

CREATE TABLE emp AS SELECT * FROM employees;

 

DROP TABLE log;

CREATE TABLE log (

    log_id   NUMBER(6),

    up_date  DATE,

    new_sal  NUMBER(8,2),

    old_sal  NUMBER(8,2)

);

 

-- 表上的自治触发器

CREATE OR REPLACE TRIGGER log_sal

    BEFORE UPDATE OF salary ON emp FOR EACH ROW

DECLARE

    PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

    INSERT INTO log (log_id, up_date, new_sal, old_sal)

    VALUES (:old.employee_id, SYSDATE, :new.salary,:old.salary);

    COMMIT;

END;

/

UPDATE emp

SET salary = salary * 1.05

WHERE employee_id = 115;

 

COMMIT;

 

UPDATE emp

SET salary = salary * 1.05

WHERE employee_id = 116;

 

ROLLBACK;

 

--查看提交和回滚的更新

SELECT * FROM log

WHERE log_id = 115 OR log_id = 116;

 

--自治触发器为了执行DDL而使用本地动态SQL

DROP TABLE temp;

CREATE TABLE temp

(

    temp_id NUMBER(6),

    up_date DATE

);

 

CREATE OR REPLACE TRIGGER drop_temp_table

    AFTER INSERT ON log

DECLARE

    PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

    EXECUTE IMMEDIATE 'DROP TABLE temp';

    COMMIT;

END;

/

--测试

SELECT * FROM temp;

INSERT INTO log VALUES(999, SYSDATE, 5000, 4500);

SELECT * FROM temp;

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17013648/viewspace-1123697/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    1986
  • 访问量
    6044094