-----触发器 ----
/*
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,
它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。
触发器经常用于加强数据的完整性约束和业务规则等。
触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。SQL3的触发器是一个能由系统自动执行对数据库修改的语句。
*/
----DML ----------------------
----
create or replace trigger emp_trigger_update
before update on emp for each row ---- 行级触发器 before 当某一行数据 发生 update 语句之前 先调用触发器
begin
dbms_output.put_line('--- emp before 行级触发器 update ---');
dbms_output.put_line('old'||:old.ename); --- :old 修改之前的 emp 对象
dbms_output.put_line('new'||:new.ename); --- :new 修改之后的 emp 对象
end;
update emp set ename='强' where empno=8888
create or replace trigger emp_trigger_update_after
after update on emp for each row ---- 行级触发器 before 当某一行数据 发生 update 语句之前 先调用触发器
begin
dbms_output.put_line('--- emp after 行级触发器 update ---');
dbms_output.put_line('old'||:old.ename); --- :old 修改之前的 emp 对象
dbms_output.put_line('new'||:new.ename); --- :new 修改之后的 emp 对象
end;
----- 语句级 触发器
create or replace trigger emp_trigger_before
before update on emp --- 语句触发器 before
begin
dbms_output.put_line('--- 语句级 语句触发器 before update ---');
----- 语句级 没有 :old :new
--dbms_output.put_line('old'||:old.ename); --- :old 修改之前的 emp 对象
--dbms_output.put_line('new'||:new.ename); --- :new 修改之后的 emp 对象
end;
create or replace trigger emp_trigger_after
after update on emp --- 语句触发器 after
begin
dbms_output.put_line('--- 语句级 语句触发器 after update ---');
----- 语句级 没有 :old :new
--dbms_output.put_line('old'||:old.ename); --- :old 修改之前的 emp 对象
--dbms_output.put_line('new'||:new.ename); --- :new 修改之后的 emp 对象
end;
--- 当所有行 没有收影响时 行级出发器不触发 语句级 只要语法正确 都会执行一次
update emp set ename='强' where deptno=10
---- 条件触发器
create or replace trigger emp_trigger_before
before delete on emp for each row ---- 条件触发器 只能用于 行级
when (old.deptno=30)
begin
dbms_output.put_line('---条件触发器 before delete ---');
end;
delete from emp where deptno=30
select *from emp where deptno=30;
------ 设计 工作职位的 更改 提醒 你从 那个 job 调到 那个 job
create or replace trigger emp_trigger_job_update
after update on emp for each row
when (old.job<>new.job) --- when ()
declare
begin
dbms_output.put_line(:old.ename||'从 '||:old.job||'调到'||:new.job);
end;
update emp set job ='攻城狮' where deptno=40;
---- 涨薪提醒 谁从 多少工资 涨到了多少 涨了多钱
create or replace trigger sal_trigger
after update on emp for each row
when (old.sal<new.sal)
declare
v_sal number(7,2) :=:new.sal-:old.sal;
begin
dbms_output.put_line(:old.ename||'工资从 '||:old.sal||'涨到了'||:new.sal ||'涨了'||v_sal);
end;
update emp set sal =sal-100 where empno=8888;
----- old new 别名
create or replace trigger sal_trigger
after update on emp
referencing old as o new as n
for each row
when (o.sal<n.sal)
declare
v_sal number(7,2) :=:n.sal-:o.sal;
begin
dbms_output.put_line(:o.ename||'工资从 '||:o.sal||'涨到了'||:n.sal ||'涨了'||v_sal);
end;
----------------- 综合触发器 ---
create or replace trigger dept_all_trigger
before update or insert or delete on dept for each row
begin
if inserting then
dbms_output.put_line(' 添加。。。');
elsif updating then
dbms_output.put_line('更新。。。');
else
dbms_output.put_line('删除');
end if;
end;
update dept set dname ='技术' where deptno=40
delete from dept where deptno=50
----- 视图 触发器 --- 针对 不能对视图 进行 DML
create or replace view my_view as select *from emp ;
create or replace trigger view_trigger
instead of delete on my_view for each row
begin
delete from emp where deptno=:old.deptno;
dbms_output.put_line('删除');
end;
delete from my_view where deptno=30 ---- 更新 视图 和 相关联的表
select *from emp;
select *from my_view;
----- 系统触发器 创建语句
create or replace trigger oracle_trigger
after create on database
begin
dbms_output.put_line(DICTIONARY_OBJ_TYPE); --- 对象类型
dbms_output.put_line(DICTIONARY_OBJ_NAME); -- 名称
end;
create or replace view my_view1 as select *from emp ;
------ oracle 启动和关闭 必须登录管理员
startup ---
shutdown immediate
-----
create or replace trigger start_up
after startup on database
begin
insert into emp(empno,ename) values(1112,'强兄');
commit;
end;
create or replace trigger shut_down
before shutdown on database
begin
insert into emp(empno,ename) values(1114,'强糖兄');
commit;
end;
---- 解决 学生添加时 班级不存在的问题 自动添加班级
create or replace trigger stu_trigger_insert
before insert on stu_tab
begin
end;