/*============================================================
示例 行级触发器
============================================================*/
CREATE OR REPLACE TRIGGER aiud_emp_row
AFTER INSERT OR UPDATE OR DELETE
ON emp
FOR EACH ROW
BEGIN
IF UPDATING THEN
DBMS_OUTPUT.PUT_LINE('ORDER_MASTER 中的数据已更新');
ELSIF DELETING THEN
DBMS_OUTPUT.PUT_LINE('ORDER_MASTER 中的数据已删除');
ELSIF INSERTING THEN
DBMS_OUTPUT.PUT_LINE('数据已插入 ORDER_MASTER');
END IF;
END;
--删除emp表所有记录
delete from emp;
--回滚删除的数据
rollback;
--删除触发器
drop trigger aiud_emp_row
/*============================================================
示例 语句级触发器
============================================================*/
--语句级触发器
CREATE OR REPLACE TRIGGER aiud_emp
AFTER INSERT OR UPDATE OR DELETE
ON emp
BEGIN
IF UPDATING THEN
DBMS_OUTPUT.PUT_LINE('ORDER_MASTER 中的数据已更新');
ELSIF DELETING THEN
DBMS_OUTPUT.PUT_LINE('ORDER_MASTER 中的数据已删除');
ELSIF INSERTING THEN
DBMS_OUTPUT.PUT_LINE('数据已插入 ORDER_MASTER');
END IF;
END;
--删除emp表所有记录
delete from emp;
--回滚删除的数据
rollback;
--删除触发器
drop trigger aiud_emp
/*============================================================
示例 INSTEAD OF触发器
============================================================*/
1.创建复杂视图
create or replace view dept_emp as
select a.deptno,a.dname,b.empno,b.ename
from dept a inner join emp b
on a.deptno=b.deptno;
2.通过视图插入纪录----失败。
insert into dept_emp values(50,'ADMIN','1223','MARY');
--失败原因,因为该视图涉及到2个表,emp是键保留表,dept是非键保留表。如果插入键保留表的数据,则不会报错,如果插入非键保留表的数据,则报错。
--什么是键保留表,是复杂视图(使用多个表创建的视图)中的其中一个表,该表的主键在视图中都是唯一且非空的,也是视图中的键,则该表是一个键保留表,如emp表。
--下面例子通过视图修改键保留表的列----成功
update dept_emp set ename='aaa' where empno=7788;
3.通过INSTEAD OF触发器添加-----成功
/*
通过对视图的插入语句触发INSTEAD OF触发器实现:
如果添加的部门不存在,则插入部门表
如果添加的雇员不存在,则插入雇员;如果存在,则报主键重复错误
*/
create or replace trigger tr_in_dept_emp
instead of insert on dept_emp
for each row
declare
v_temp int;
begin
--如果添加的部门不存在,则插入部门表
select count(*) into v_temp from dept
where deptno=:new.deptno;
if v_temp=0 then
insert into dept (deptno,dname)values
(:new.deptno,:new.dname);
end if;
--如果添加的雇员不存在,则插入雇员;如果存在,则报主键重复错误
select count(*) into v_temp from emp
where empno=:new.empno;
if v_temp=0 then
insert into emp
(empno,ename,deptno) values (:new.empno,:new.ename,:new.deptno);
else
raise_application_error(-20001,'主键重复');
end if;
end tr_in_dept_emp;
4.再执行插入记录-----成功
insert into dept_emp values(50,'ADMIN','1223','MARY');
5.查询插入后dept和emp表
select * from dept;
select * from emp;