Before insert or update or delete On employees_copy Declare L_action employees_log.action%type; Begin if inserting then l_action:='Insert'; elsif updating then l_action:='Update'; elsif deleting then l_action:='Delete'; else raise_application_error(-20001,'You should never ever get this error.'); Insert into employees_log( Who,action,when) Values( user, l_action,sysdate); End; / 3、 测试 insert into employees_copy( employee_id, last_name, email, hire_date, job_id) values(12345,'Chen','Donny@hotmail',sysdate,12); select *from employees_log update employees_copy set salary=50000 where employee_id = 12345; 2、 行触发器 是指为受到影响的各个行激活的触发器,定义与语句触发器类似,有以下两个例外: 1、 定义语句中包含FOR EACH ROW子句 2、 在BEFORE……FOR EACH ROW触发器中,用户可以引用受到影响的行值。 比如: 定义: create trigger biufer_employees_department_id before insert or update of department_id on employees_copy referencing old as old_value new as new_value for each row when (new_value.department_id<>80 ) begin :new_value.commission_pct :=0; end; / Referencing 子句: 执行DML语句之前的值的默认名称是 :old ,之后的值是 :new insert 操作只有:new delete 操作只有 :old update 操作两者都有 referencing子句只是将new 和old重命名为new_value和old_value,目的是避免混淆。比如操作一个名为 new的表时。 作用不很大。 [试验]:为主健生成自增序列号 drop table foo; create table foo(id number, data varchar2(20)); create sequence foo_seq; create or replace trigger bifer_foo_id_pk before insert on foo for each row begin select foo_seq.nextval into :new.id from dual; end; / insert into foo(data) values(‘donny'); insert into foo values(5,'Chen'); select * from foo; 3、 INSTEAD OF 触发器更新视图 Create or replace view company_phone_book as Select first_name||', '||last_name name, email, phone_number, employee_id emp_id From hr.employees; 尝试更新email和name update hr.company_phone_book set name='Chen1, Donny1' where emp_id=100 create or replace trigger update_name_company_phone_book INSTEAD OF Update on hr.company_phone_book Begin Update hr.employees Set employee_id=:new.emp_id, First_name=substr(:new.name, instr(:new.name,',')+2), last_name= substr(:new.name,1,instr(:new.name,',')-1), phone_number=:new.phone_number, email=:new.email where employee_id=:old.emp_id; end; 4、 系统事件触发器 系统事件:数据库启动、关闭,服务器错误 create trigger ad_startup after startup on database begin -- do some stuff end; / 5、 用户事件触发器 用户事件:用户登陆、注销,CREATE / ALTER / DROP / ANALYZE / AUDIT / GRANT / REVOKE / RENAME / TRUNCATE / LOGOFF 例子:记录删除对象 1. 日志表 create table droped_objects( object_name varchar2(30), object_type varchar2(30), dropped_on date); 2.触发器 create or replace trigger log_drop_trigger before drop on donny.schema begin insert into droped_objects values( ora_dict_obj_name, -- 与触发器相关的函数 ora_dict_obj_type, sysdate); end; / 3. 测试 create table drop_me(a number); create view drop_me_view as select *from drop_me; drop view drop_me_view; drop table drop_me; select *from droped_objects 禁用和启用触发器 alter trigger <trigger_name> disable; alter trigger <trigger_name> enable; 事务处理: 在触发器中,不能使用commit / rollback 因为ddl语句具有隐式的commit,所以也不允许使用 视图: dba_triggers |