Oracle学习笔记第十九天

Oracle学习笔记第十九天

触发器

**特性: ** 不需要显示调用来执行,而是由一个事件来启动运行

启动事件包括:

   	1. INSERT、UPDATE 及 DELETE 操作火堆视图进行类似的操作。
    	2. 执行DDL操作(create、drop、alter、)
     	3. 数据库的启动与关闭
-- 创建触发器的语法
CREATE [OR REPLACE] TRIGGER  trigger_name
AFTER | BEFORE | INSTEAD OF		-- 触发器的模式 是在什么时候触发
[INSERT] [[OR] UPDATE [OF column_list]] 
[[OR] DELETE]	-- 触发器触发情况
ON  table_or_view_name -- 表或视图的名称
[REFERENCING {OLD [AS] old / NEW [AS] new}] -- 操作的数据是完成前的数据还是完成后的数据,new是完成后的值,old是完成前的值。
[FOR EACH ROW]	-- 是否是每行的,是的话就是行级触发器,不是的话就是语句触发器
[WHEN (condition)]  -- 判断条件,条件为真则触发触发器
pl/sql_block; -- PL/SQL块
触发器一定是基于表或者视图
新增一定是操作完成后的值,
when 条件中数据变量不用加: 
PLSQL中操作的数据需要加上: ,取值方式::new.字段名或者是 :lod.字段名

触发器类型

触发器类型 触发后执行模式
模式(DDL)触发器 在模式中执行DDL语句时执行
数据库级触发器 在发生打开、关闭、登录和退出数据库等系统事件是执行
DML触发器 在对表或试图执行DML语句时执行
行级触发器 对DML语句修改的每个行执行一次
语句级触发器 无论受影响的行数是都少,都执只行一次
INSTEAD OF触发器 用于用户不能直接使用DML语句修改的视图

附:

-- 行级触发器中使用old变量
---依据现有表创建出员工备份表
create table emp_bak
as
select * from emp where 1 = 2; -- where 1=2 表示where后面的条件是false,所有数据都不会复制过去,只会复制表结构。

---创建触发器,一旦有数据删除,自动备份到备份表中
create or replace trigger trg_bak
before delete    -- 触发模式:在删除前触发
on emp
for each row
when (old.deptno <> 10)     --判断条件,这里条件是自己设定的,这里设定的条件是当删除的数据的deptno的值为10时不触发触发器。
begin
    --备份数据
    insert into emp_bak(empno,ename,job,sal,deptno)
    values(:old.empno,:old.ename,:old.job,:old.sal,:old.deptno);
    
    --提交事务
    commit;
end;

----激活触发器 这个触发器是备份删除的数据,所以这里删除表的数据就是激活触发器。
delete from emp;
-- 行级触发器中使用new变量
---创建表跟踪员工工资的变化
create table 
emp_sal_change(empno number(4),
               ename varchar2(20),
               old_sal number(8,2),
               new_sal number(8,2));

----创建触发器
create or replace trigger trg_sal
after update on emp	    -- 在更新后触发 
for each row
begin
   insert into emp_sal_change
   values(:new.empno,:new.ename,:old.sal,:new.sal);
   
   ---提交
   commit;
end;   

----激活触发器
update emp set sal = sal + 100 where deptno = 10;

----查询数据
select * from emp_sal_change;

猜你喜欢

转载自blog.csdn.net/xxydzyr/article/details/85839748