PLSQL-触发器

谁说我不能喝 提交于 2020-01-24 23:49:34

一、不基于视图的操作

1. 案例1:非工作期间不能插入数据

	create or replace trigger sal_emp
	before insert on emp	--当有多个(before insert or delete or update on emp)
	begin
		if(to_char(sysdate,'dy') not in('星期六','星期日')) then
			raise_application_error(-20001,'非工作期间不能插入数据');
		end if;
	end;
	--测试数据
	insert into emp(empno,ename,job,mgr,hiredate,sal)
	values(1002,'ljs','clerk',7902,sysdate,2000);

2. 案例2:非工作期间不能添加、更新、删除、操作数据

	create or replace trigger sal_emp1
	before insert or update or delete on emp
	begin
		if (to_char(sysdate,'hh24:mi') between '08:00' and '17:00')then
			if inserting then
				raise_application_error(-20001,'非工作期间不能添加数据');
			elsif updating then
				raise_application_error(-20002,'非工作期间不能更新数据');
			elsif deleting then
				raise_application_error(-20003,'非工作期间不能删除数据');
			else
				raise_application_error(-20004,'非工作期间不能操作数据');
			end if;
		end if;
	end;
	--测试数据
	insert into emp(empno,ename,job,mgr,hiredate,sal)
	values(1002,'ljs','clerk',7902,sysdate,2000);
	
	update emp set sal=sal+100
	where empno=1;

	delete from emp where empno=1;

二、基于视图的操作

1. 案例1:改变多张表的数据

	create view my_view
	as
	select e.empno,e.ename,e.job,e.sal,e.deptno,d.dname
	from emp e,dept d
	where e.deptno = d.deptno;
	--测试数据
	insert into my_view values(1005,'ljs','clerk',2000,30,'sales');
		--运行时反生错误原因:同时想要添加数据至两张表中
		--结论:在视图上不能同时改变多张表的数据
	--解决
	create or replace trigger sal_emp2
	instead of insert on my_view
	for each row
	begin
		--添加dept表中的数据
		insert into dept(deptno,dname) values(91,'new');
		--添加emp表中的数据
		insert into emp(empno,ename,job,sal,deptno) values(100,'zs','yf',8000,40);
	end;

2. 案例2:通过聚合函数改变表中数据

	create or replace view empv
	as
	select deptno,max(sal) max_s,min(sal) min_s
	from emp
	group by deptno;
	--测试数据
	update empv set min_s = min_s+500
	where deptno=10;
		--运行时发生错误
		--结论:不能通过聚合函数改变表中数据
	--解决
	create or replace trigger sal_emp
	instead or update on empv
	for each row
	begin
		update emp set sal=sal+500
		where sal=(select min(sal)
				   from emp
				   where deptno=10)
		and deptno = 10;
	end;
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!