`
Sehoney
  • 浏览: 40198 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

触发器

SQL 
阅读更多
概念:
触发器是当特定事件出现时自动执行的存储过程
特定事件可以是执行更新的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;
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics