Creating updatable views using INSTEAD OF triggers[akadia]

INSTEAD OF triggers provide a transparent way of modifying views that cannot be modified directly through UPDATE, INSERT, and DELETE statements. These triggers are called INSTEAD OF triggers because, unlike other types of triggers, Oracle fires the trigger instead of executing the triggering statement. The trigger performs UPDATE, INSERT, or DELETE operations directly on the underlying tables.

Example

We create the VIEW emp_dept, which joins the table emp and dept. An INSERT is only possible with an INSTEAD OF trigger.

Create the view based on emp and dept

CREATE VIEW emp_dept AS
SELECT e.empno,
e.ename,
e.job,
d.deptno,
d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;

Try to insert a row

INSERT INTO emp_dept (empno,ename,job,deptno,dname)
VALUES (9999,'Mayor','Engineer',20,'Agriculture');

ORA-01779: cannot modify a column which maps to a non
key-preserved table

Check if view is updatable -- it is not.

SELECT column_name,
updatable ,
insertable,
deletable
FROM user_updatable_columns
WHERE table_name = 'EMP_DEPT';

COLUMN_NAME UPD INS DEL
------------------------------ --- --- ---
EMPNO NO NO NO
ENAME NO NO NO
JOB NO NO NO
DEPTNO NO NO NO
DNAME NO NO NO

Create the INSTEAD OF trigger

CREATE OR REPLACE TRIGGER trg_emp_dept
INSTEAD OF INSERT ON emp_dept
DECLARE
duplicate_record EXCEPTION;
PRAGMA EXCEPTION_INIT (duplicate_record, -00001);
BEGIN
INSERT INTO emp (empno,ename,job)
VALUES (:NEW.empno,:NEW.ename,:NEW.job);
INSERT INTO dept (deptno,dname)
VALUES (:NEW.deptno,:NEW.dname);
EXCEPTION
WHEN duplicate_record THEN
RAISE_APPLICATION_ERROR (-20001,'Duplicate employee
or departement');
END trg_emp_dept;
/

Try to insert a row

INSERT INTO emp_dept (empno,ename,job,deptno,dname)
VALUES (9999,'Mayor','Engineer',20,'Agriculture');

1 row created.


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

转载于:http://blog.itpub.net/936/viewspace-60594/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值