ORACLE触发器

来源:互联网 发布:ads 差分端口 仿真 编辑:程序博客网 时间:2024/06/11 21:41
 概念: 触发器是当特定事件出现时自动执行的存储过程 特定事件可以是执行更新的DML语句和DDL语句 触发器不能被显式调用 触发器的功能:     自动生成数据     自定义复杂的安全权限     提供审计和日志记录     启用复杂的业务逻辑 触发器由三部分组成:     触发器语句(事件)         定义激活触发器的 DML 事件和 DDL 事件     触发器限制         执行触发器的条件,该条件必须为真才能激活触发器     触发器操作(主体)         包含一些 SQL 语句和代码,它们在发出了触发器语句且触发限制的值为真时运行 要点: /*   new与old对象说明     insert:只有new对象   delete:只有old对象   update:new和old对象都有     DML   行级触发器:拥有old和new对象   语句级触发器:没有new和old对象,因为语句级操作针对一次操作,无法获得任意记录。   ------------------------------------------------------------------   行级触发器要点:1.new和old对象,2.谓语动词“inserting,deleting,updating”的使用   语句级触发器要点:1.没有new和old对象。2.没有for each row   instead of 触发器要点:1.不管有没有加for each row 都是行级类别 概念: 触发器是当特定事件出现时自动执行的存储过程 特定事件可以是执行更新的DML语句和DDL语句 触发器不能被显式调用 触发器的功能:     自动生成数据     自定义复杂的安全权限     提供审计和日志记录     启用复杂的业务逻辑 触发器由三部分组成:     触发器语句(事件)         定义激活触发器的 DML 事件和 DDL 事件     触发器限制         执行触发器的条件,该条件必须为真才能激活触发器     触发器操作(主体)         包含一些 SQL 语句和代码,它们在发出了触发器语句且触发限制的值为真时运行 要点: /*   new与old对象说明     insert:只有new对象   delete:只有old对象   update:new和old对象都有     DML   行级触发器:拥有old和new对象   语句级触发器:没有new和old对象,因为语句级操作针对一次操作,无法获得任意记录。   ------------------------------------------------------------------   行级触发器要点:1.new和old对象,2.谓语动词“inserting,deleting,updating”的使用   语句级触发器要点:1.没有new和old对象。2.没有for each row   instead of 触发器要点:1.不管有没有加for each row 都是行级类别  create or replace trigger role_tri before insert or update  or delete on role   for each row   when (new.roleid>4)   declare  role_name varchar2(20);   begin     role_name:=:new.rolename;      dbms_output.put_line(role_name);       insert into roletest(roletestid,roletestname) values(:new.roleid,:new.rolename);   end;    insert into role(roleid,rolename) values(seq_role.nextval,'经理');   commit;  create or replace trigger role_tri before insert or updateor delete on rolefor each rowwhen (new.roleid>4)declarerole_name varchar2(20);begin    role_name:=:new.rolename;    dbms_output.put_line(role_name);    insert into roletest(roletestid,roletestname) values(:new.roleid,:new.rolename);end;insert into role(roleid,rolename) values(seq_role.nextval,'经理');commit;行级触发器 Sql代码  create or replace trigger role2_tri before insert or update or delete on role   for each row   begin    if inserting then        select seq_role.nextval into :new.roleid from dual;          dbms_output.put_line('--role2---select----');       elsif updating then         dbms_output.put_line('不许更新');          raise_application_error(-20020,'不准更新');       elsif deleting then        dbms_output.put_line('deleting');       end if;   end;   insert into role(roleid,rolename) values(seq_role.nextval,'经理');   commit;    update role set rolename='CEO' where roleid=76;   commit;  create or replace trigger role2_tri before insert or update or delete on rolefor each rowbegin    if inserting then       select seq_role.nextval into :new.roleid from dual;       dbms_output.put_line('--role2---select----');    elsif updating then       dbms_output.put_line('不许更新');       raise_application_error(-20020,'不准更新');    elsif deleting then       dbms_output.put_line('deleting');    end if;end;insert into role(roleid,rolename) values(seq_role.nextval,'经理');commit;update role set rolename='CEO' where roleid=76;commit;语句级触发器 Sql代码  create or replace trigger role3_tri before update or delete on role   begin     --无法获得没有new和old对象       insert into roletest(roletestid,roletestname) values(75,'经理');   end;     update role set rolename='CEO' where roleid=76;   commit;  create or replace trigger role3_tri before update or delete on rolebegin    --无法获得没有new和old对象     insert into roletest(roletestid,roletestname) values(75,'经理');end;update role set rolename='CEO' where roleid=76;commit;instead of 触发器==只能针对视图 Sql代码  create or replace view my_view as  select t.suser,t.name,t.sex,t.email from t_user t,user_role r  where t.suser = r.suser     create or replace trigger my_tri instead of insert or update or delete on my_view   for each row --不管有没有这句,都是行级   begin       if inserting then         dbms_output.put_line(:new.name);      elsif updating then         dbms_output.put_line('--old--'||:old.name||'--new--'||:new.name);       elsif deleting then        dbms_output.put_line(:old.name);       end if;   end;     update my_view t set t.name='dddd' where t.suser='test9';   commit;