oracle instead of update触发器,ORACLE INSTEAD OF 触发器

查看了Docs,看到ORACLE也支持这个类型的触发器,但这个只能建立到视图上,不能基于表建立,我要的功能肯定是可以

实现的,在这里我把原表进行了rename,引如了两张视图,名字就是以前的表名,这样对于他们前台应用就做了个

透明的切换,然后在两个视图上建立INSTEAD触发器,将任何两个视图上的更新都传播到后面的两个基表,这样不管你更新那个

视图,我都可以捕获到数据,以代码在后面更新,也不存在互相触发,因为触发器修改的对象已经转移到表了,而此时表上是没有

trigger的,呵呵!!!

过程如下

--创建测试表

SQL> create table mytest1(row_num number,row_name

varchar2(50));

表被创建

SQL> create table mytest2(row_num number,row_name

varchar2(50));

表被创建

--测试数据

SQL> INSERT INTO MYTEST1 VALUES(1,'Fuck!!!');

1 行 已插入

SQL> INSERT INTO MYTEST2 VALUES(1,'Watch your

mouth!!!');

1 行 已插入

SQL> COMMIT;

提交完成

--先在一个表上创建触发器

SQL> CREATE OR REPLACE TRIGGER TRI_TEST1

2 BEFORE UPDATE

3 ON MYTEST1

4 FOR EACH ROW

5 DECLARE

6 lv_new VARCHAR2(20);

7 lv_parent

VARCHAR2(20);

8 BEGIN

9 lv_new := :new.row_name;

10 lv_parent := :OLD.row_name;

11 IF lv_new <> lv_parent THEN

12 UPDATE MYTEST2

13 SET ROW_NAME = :NEW.ROW_NAME

14 WHERE ROW_NUM = :NEW.ROW_NUM;

15 END IF;

16 DBMS_OUTPUT.PUT_LINE(lv_new || lv_parent);

17 END;

18 /

触发器被创建

--测试更新

SQL> set serveroutput on

SQL> UPDATE MYTEST1 SET ROW_NAME = 'DO it!!!';

DO it!!! Fuck!!!

1 行 已更新

--更新成功

SQL> SELECT * FROM MYTEST2;

ROW_NUM ROW_NAME

---------- --------------------------------------------------

1 DO it!!!

--另外张表创建触发器

SQL> CREATE OR REPLACE TRIGGER

TRI_TEST2 2 BEFORE

UPDATE 3 ON

MYTEST2 4 FOR EACH

ROW 5 DECLARE 6 lv_new

VARCHAR2(20); 7 lv_parent

VARCHAR2(20);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值