PLSQL触发器(表级、行级、替换、模式、数据库级)

1.触发器

触发器是一种在事件发生时自动执行的PLSQL块,不接收参数,不能被调用。触发器的类型有:DML触发器(表级触发器、行级触发器、替换触发器)、模式(DDL)触发器、数据库级触发器。

表级触发器无论受影响的行数是多少,都只执行一次没有for each row语句,在begin代码段中不可以使用:new和:old。

create or replace trigger 名称 before|after update or insert or delete on 表名
declare
begin
    触发器代码;
end;
​
--给dept表创建一个触发器,当dept表中的数据被修改、删除、插入时打印该操作
create trigger t1 before insert or update or delete on dept
begin
   if inserting then
      dbms_output.put_line('插入');
   end if;
   if updating then
      dbms_output.put_line('修改');
   end if;
   if deleting then
      dbms_output.put_line('删除');
   end if;
end;

行级触发器对DML语句修改的每个行执行一次,有for each row语句,在begin代码段中可以使用:new和:old。

create or replace trigger 名称 before|after update or delete or insert on 表名 for each row
begin
    触发器代码;
end;
​
--给dept添加行级触发器,当修改dept的部门编号时,员工表的部门编号也发生变化,当删除部门时,员工表中改部门的员工被删除
create or replace trigger t1 before update or delete on dept for each row 
declare
begin
  if updating then
    update emp set deptno=:new.deptno where deptno=:old.deptno;
  elsif deleting then
    delete from emp where deptno=:old.deptno;
  end if;
end;

替换触发器使用在视图上,而且是行级的触发器.

create or replace trigger 名称 instead of insert or update or delete on 视图名 for each row
begin
    触发器代码;
end;
​
--创建一个显示员工编号、员工姓名、所在部门号及部门名的视图,利用触发器实现向该视图中添加数据的操作。
create view v1 as select empno,ename,e.deptno,dname from dept d,emp e where d.deptno=e.deptno;
create or replace trigger t4_1 instead of insert on v1 for each row 
declare
begin
  insert into emp(empno,ename) values(:new.empno,:new.ename);
  insert into dept(deptno,dname) values(:new.deptno,:new.dname);
end;

模式触发器在模式中执行DDL语句时执行。

create or replace trigger 名称 before alter or drop or create on schema
begin
    insert into dropped_obj values(ora_dict_obj_name,ora_dict_obj_type,sysdate);
end;

数据库级触发器在发生打开、关闭、登录和退出数据库等系统事件时执行。

startup打开 关闭shutdown 登录logon 退出logoff

--用户登陆触发器
create or replace trigger tr_logon after logon on database
begin 
   insert into log_table(username,logon_time) values(ora_login_user,  sysdate);
end;
ALTER TRIGGER 触发器名字 DISABLE;    --禁用触发器
ALTER TRIGGER 触发器名字 ENABLE;     --启用触发器
DROP TRIGGER aiu_itemfile;      --删除触发器

你可能感兴趣的:(PLSQL,数据库,oracle)