plsql 触发器介绍 语句级别触发器、行级别触发器。

/*
分类:
    1、DDL触发器
      执行create,alter,drop操作时,会激活的触发器
    2、DML触发器
      执行增、删除、修改时,激活的触发器
    3、系统事件触发器
      执行特定的系统事件时(启动、加载、登录、退出)
构成:
    1、触发事件:会引起触发器执行的操作;DDL操作,DML操作,系统事件;
    2、触发时间:before ,after, instead of:替代
    3、触发条件:where 条件
    4、触发对象:表、视图、数据库对象
    5、触发频率:语句级别(表级别):执行一次,行级别:for each row :满足条件的每一行操作都会激活触发器;
    6、触发操作:触发器中执行的操作;

*/
-- 1、语句级别的触发器。(执行一次)     
--  before触发器  和   after触发器   刚执行语句 触发器跟着执行(1.判断语句是否执行 2.不给语句执行的机会) 和  语句可以先执行后设置的事件    
-- 理解:当用户执行某个操作时,会执行我所写的触发器

                                                -- oracle中创建一个触发器   create or replace    关键字trigger + 触发器的名字。 
create or replace trigger  insertInterceptor
 after delete on emp                            -- 定义触发器的时间种类。   xx xx on xx 表名。
declare
    v_money emp.sal%type;
    row1 emp%rowtype;
    cursor c(no emp.deptno%type) is select * from emp where deptno=no;   
begin                                           
  insert into emp (empno,ename,job,sal) values(20,'学习','张三',2000);
  
  open c(20);
  loop
  fetch c into row1;
  exit when c%notfound;
  dbms_output.put_line(
    'cursor index=='||c%rowcount||
    '姓名=='||row1.ename||
    '--------工资=='||row1.sal||
    '--------工作=='||row1.job
  );
  
  end loop;
  close c;
end;

                                                  -- 测试效果:删除20后新填入一个20在emp表中  并输出emp表中对应部门的 相关的  数据 
delete from emp where empno=20;


--练习   禁止用户在emp中的删除数据  tg01 
alter trigger tg01 enable;
alter trigger tg01 disable;
delete from emp where empno=2;

-- 禁止用户在emp中  update数据   
create or replace trigger updateMessage
  before update on emp
declare
  
begin
  raise_application_error(-20010,'禁止用户在emp中  update数据');     --注意oracle错误码   20000--20999;
end;

--测试
update emp set ename='哈哈' where empno=7788;
alter trigger updateMessage disable;


-- 2、行级别触发器  for each row :满足条件的每一行操作都会激活触发器;
create or replace trigger rowMessage
  before update or insert on emp for each row      
declare
  
begin         -- 如果条件执行  就给出相应的提示
  if updating then 
    dbms_output.put_line('执行了更新的操作');
  if:old.sal>:new.sal then                            -- 逻辑表
    raise_application_error(-20002,'禁止给员工降工资!');
    end if;
  elsif inserting then
    dbms_output.put_line('执行了录入的操作');
  end if;
end;

--关闭触发器
alter trigger updateMessage disable;
alter trigger insertInterceptor disable;

update emp set sal=sal+1 where deptno=20;
commit; 

insert into emp (empno,ename,sal)values(5,'嘻嘻',500);


select * from emp;
select sal from emp where deptno=20;

-- 删除触发器
drop trigger tg02;

     

原文地址:https://www.cnblogs.com/ZXF6/p/11240300.html