浏览 2253 次
锁定老帖子 主题:触发器
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-25
最后修改:2010-01-26
概念:
触发器是当特定事件出现时自动执行的存储过程 特定事件可以是执行更新的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 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 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; instead of 触发器==只能针对视图 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; 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |