Oracle触发器

--触发器的分类
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 :createalterdrop 返回激活触发器的DDL操作的对象类型。
 dictionary_obj_name :createalterdrop 返回激活触发器的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;
 
 
 
 



  
原文地址:https://www.cnblogs.com/gynbk/p/6556179.html