今天 我们深入点了解到触发器 虽然很多有用的地方 由于是自动的 只要满足条件的话
就会被执行
那么在这里修改了数据
因为我们这样修改的数据时不受我们控制的 会发生我们不期待的事情 比如数据完整性被修改了 存人的数据时我们想要的
那么我们增加一个业务的话 我们要修改成触发器禁止的数据样式 那么我们是插入不进去的 如果有监控插入的触发器
所以还是少用 那么在哪些地方能用呢 ?
我们使用的地方一般的就是那种主键的增加 以及主键按照我们的要求来增加
以及对数据修改的监控 还有就是日志的操作
--自动编号的触发器
添加部门,部门为原来{zd0}部门号加1
create or replace trigger tr_emp_insert
before insert
on emp
for each row
declare
v_empno emp.empno%type;
begin
select nvl(max(empno),0)+1 into v_empno from emp;
:new.empno := v_empno;
end;
--108. 触发器练习:删除部门时,该部门的所有员工设置到10部门;而10部门则不能删除。
create or replace trigger tr_dele_dept
before delete
on dept
for each row
declare
begin
if
:new.deptno =10 then
null;
else
update emp set emp.deptno = 10 where deptno = :old.deptno;
end
if;
end;
--109. 触发器练习:建立日志表,记录员工表发生变化的工号,事件类型,发生时间。
create table emp_log
(
l_id number primary key ,
l_empno
number(6),
l_thing_type
varchar2(50),
l_date
date,
l_thing
varchar2(1000)
);
create or replace trigger tr_log_emp
before delete or update or insert
on emp
for each row
declare
v_num
number;
v_things varchar2(500);
begin
select
count(*)+1 into v_num from emp_log;
case
when inserting then
v_things := '新加入一个员工'||:new.empno;
insert into emp_log(l_id, l_empno ,l_thing_type, l_date , l_thing
)
values(v_num,:new.empno,'insert',sysdate,v_things );
when updating then
v_things := '修改了这个员工 '||:new.empno;
insert into emp_log( l_id, l_empno ,l_thing_type, l_date , l_thing
)
values( v_num,:new.empno,'update',sysdate,v_things );
when deleting then
v_things := '删除了这个员工 '||:new.empno;
insert into emp_log(l_id, l_empno ,l_thing_type, l_date , l_thing
)
values( v_num,:new.empno,'insert',sysdate,v_things);
end case;
end;
这基本上就是触发器的用处的嘛 反正这个尽量还是不要在其他的地方用
是自动执行的 不好控制