Oracle11g学习-触发器

Oracle

1  触发器

1.1      语法

【语法】

    CREATE [OR REPLACE] TRIGGER <触发器名>

    BEFORE|AFTER

    INSERT|DELETE|UPDATE [OF <列名>] ON <表名>

    [FOR EACH ROW]

<pl/sql块>

【说明】

     关键字"BEFORE"在操作完成前触发;"AFTER"则是在操作完成后触发;

     关键字"FOR EACH ROW"指定触发器每行触发一次,若不指定则为表级触发器.

     关键字"OF <列名>" 不写表示对整个表的所有列.

pl/sql块中不能使用commit;

【特殊变量】

     :new --为一个引用最新的行值;

     :old --为一个引用以前的行值;

这些变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而insert只有:new ,delect 只有:old;

1.2      行级触发器

【示例1】涨工资

/*

触发器使用:给员工涨工资(涨后工资应该大于涨前)后,在后台输出更新前和更新后的工资

*/

create or replace trigger tri_emp_upd_sal

after

update of sal on emp

for each row

begin

if :old.sal <:new.sal then

    dbms_output.put_line('更新前工资为:'||:old.sal||',更新后工资为:'||:new.sal);

else

    raise_application_error(-20002,'工资不能越涨越低!');

end if;

end;

/

 

-- 更新工资值,并触发行级触发器

update emp set sal =8888where empno =1002;

【示例2】触发器+序列实现主键自增长

/*

触发器使用:给emp表的empno添加触发器,在插入记录时自动填入值

*/

-- 1、创建序列

create sequence seq_emp_empno;

 

-- 2、创建触发器

create or replace trigger tri_emp_ins_empno

before

insert on emp

for each row

begin

-- 给将要插入表的记录:new 中的empno设置sequence中的值

select seq_emp_empno.nextval into:new.empno from dual;

end;

/

 

-- 新增员工数据,测试触发器+序列的组合使用

insertinto emp(ename,sal)values('itcast002',2000);

commit;

1.3     表级触发器

/*

触发器使用:删除表的同时备份表数据到另一张备份表

*/

-- 1、从emp表结果中创建一张表并复制数据

create table emp2  as select from emp;

 

-- 2、创建备份表emp_bak

create table emp_bak as select from emp2 where1=2;

 

-- 3、创建表触发器,当对表操作时触发

create or replace trigger tri_emp2_del

before

delete on emp2

begin

-- 将emp2表中的数据备份到emp_bak

insert into emp_bak select * from emp2;

end;

/

 

-- 4、测试删除emp2表的数据

delete from emp2;

select from emp2;

select from emp_bak;

1.4    开启禁用触发器

禁用某个触发器

ALTER TRIGGER <触发器名> DISABLE

【示例】

alter trigger tri_emp_upd_sal disable;

update emp set sal =8888 where empno =1002;

重新启用触发器

ALTER TRIGGER <触发器名> ENABLE

【示例】

alter trigger tri_emp_upd_sal enable;

update emp set sal =8888where empno =1002;

禁用表的所有触发器

ALTER TABLE <表名> DISABLE ALL TRIGGERS;

【示例】

alter table emp disable all triggers;

启用表的所有触发器

ALTER TABLE <表名> ENABLE ALL TRIGGERS;

【示例】

alter table emp enable all triggers;

删除触发器

DROP TRIGGER <触发器名>;

【示例】

drop trigger tri_emp_upd_sal;

猜你喜欢

转载自blog.csdn.net/chenzuyibao/article/details/80628495