触发器是一种在事件发生时自动执行的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; --删除触发器