文章目录
一、不基于视图的操作
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;
来源:CSDN
作者:এ᭄小小常
链接:https://blog.csdn.net/weixin_45721343/article/details/104022518