--触发器的分类 1、数据库操作语言(DML)触发器。 2、数据库定义语言(DDL)触发器。 3、复合触发器。 4、Instead of 触发器。此类触发器通常作用在视图上。对于多个源表的视图做DML操作 通常是不被允许的,如果遇到这种情况就可以利用 instead of 类型触发器 解决问题。利用它可以把对视图的DML操作转换成对多个源表进行操作。 5、用户和系统事件触发器。 --DML触发器的语法 create [or replace] trigger trg_name {before | After | Instead Of} {Delete | insert | update [of column [,column]...]} [Or {delete | insert | update [of column [,column]...]}] {ON [table_name | View_name]} [for each row] [follows trigger ,trigger] [enable | disable] [when (condition)] trigger_body--触发器函数体 before :触发器类型为前触发。 after :触发器类型为后触发。 instead of :表示触发器类型为替换类型。 Delete | insert | update :表示触发的事件。 [of column [,column] :触发器条件具体到某列。 ON [table_name | View_name] :作用到表和视图 [for each row] :表示行级触发器,省略这为语句级触发器。 [follows trigger ,trigger] :触发器执行的顺序。 [enable | disable] : 触发器是否有效。 [when (condition)] :触发该触发器的条件。 --DDL和数据库事件触发器语法 create [or replace ] trigger trg_name {before | after} {ddl_event [or ddl_event]... | database_event [or database_event]...} on [Schema | database] [Follows trigger ,trigger...] [enable | disable] [when (condition)] trigger_body--触发器函数体 {ddl_event [or ddl_event]... : DDL事件,使用Or链接。 on [Schema | database] :作用在那个模式上或数据库上。 --复合型触发器 create [or replace] trigger trg_name {before | After | Instead Of} {Delete | insert | update [of column [,column]...]} [Or {delete | insert | update [of column [,column]...]}] {ON [table_name | View_name]} compound trigger [before statement is trigger_body end before statement | before each row is trigger_body end before each row |after statement is trigger_body end after statement |after each row is trigger_body end after each row ] compound trigger :复合型触发器关键字。 before statement :前语句级触发。 before each row :前行级触发。 after statement :后语句级触发。 after each row :后行级触发。 --查看触发器 select * from user_objects where object_type='TRIGGER'; --查看触发器源码 select * From user_source where name='触发器名称' order by line; --触发器实例 create trigger pric_test before insert of id on procduct for each row declare v_proc_id number(10,2):=1; begin insert into procduct (id,name) value (:NEW.ID,'小马'); end; --instead of类型触发器是作用于视图的但直接操作与源表 create view vw_procduct as select id,name,age from procduct; create trigger instead_of_trg instead of insert on vw_procduct declare v_id number(10,2); begin select id into v_id from procducttype where code=:NEW.code; insert into procduct values (v_id,'花花',23); end; --DDL类型触发器 create trigger DDl_trg before create or alter or drop or rename on schema begin if SYSEVENT='create' then dbms_output.put_line(Dictionary_obj_name||'创建中...'); elsif sysevent='drop' then if dictionary_obj_name='test' then raise_application_error(-2000,'不允许删除test表'); end if; elsif sysevent='alter' then raise_application_error(-2000,'不允许修改test表'); elsif sysevent='rename' then raise_application_error(-2000,'不允许修改表名'); end if; end; --DDL常用事件 sysevent :所有事件,返回激发触发器的事件名称。 instance_num :所有事件,返回当前数据库的实例号。 database_name :所有事件,返回当前数据库名。 server_error :servererror 错误堆栈的指定位置返回错误号 login_user :所有事件,返回激发触发器的用户名。 dictionary_obj_type :create、alter、drop 返回激活触发器的DDL操作的对象类型。 dictionary_obj_name :create、alter、drop 返回激活触发器的DDL操作对象的名称。 --用户和系统事件触发器 create table log_user( logonid varchar2(20), logonname varchar2(50), logontime date, constraint log_user_pk primary key (logonid) ); create trigger logon_tgr after logon on database begin insert into log_user values(seq_logonid.nextval,sys.login_user,sysdate); end; --删除触发器 drop trigger trg_name;