26.触发器
数据库触发器是一个与表关联的plsql代码段,当特定的数据库语句(insert,delete,update)执行时,Oracle会自动执行触发器里面的代码。
26.1.触发器可用于:
数据确认
实施复杂的安全性检查
做审计,跟踪表上所做的数据操作
数据的备份和同步
26.2.类型
1.语句级:在指定操作语句之前或之后执行一次,不管该语句有多大影响
2.行级:触发语句对应的每一条记录都会触发,在行级触发器中用old和new作为伪记录变量,识别值的状态。
26.3.语法:
create or replace trigger 触发器名
before/after
update/insert/delete [of 列名]
on 表名
[for each row [when ...]]
begin
plsql代码
end 触发器名;
例:
简单的触发器:效果:在person表中插入新数据时打印‘要插入新数据了’
create or replace trigger insertmess
before insert on person
begin
dbms_output.put_line('要插入新数据了');
end insertmess;
例2:效果:读取入职时间(当前时间)的值,如果为休息日则不能插入信息
create or replace trigger valid_insert_p
before insert on person
declare
varday varchar2(10);
begin
select to_char(sysdate,'day') into varday from dual;
if varday = 'sunday' then --注:一般这样写(在星期天)然后插入语句时,还是能插入语句,因为to_char输出的字符串会在最后加几个空格,这边有两个解决方法 1.运行一遍select语句直接把输出的复制粘贴到这边写Sunday的地方 2.在varday前加上trim(去空格)函数(个人更倾向于这种方法)
raise_application_error(-20001,'今天礼拜,不能插入数据');
end if;
end valid_insert_p;(可不写触发器名)
例3.行级触发器
create or replace trigger triggertest
before update on person
begin
if :new.sal<=:old.sal then--注:new与':'之间不要有空格,不然会报错
raise_application_error(-20002,'这不是涨工资,这是降工资!');
end if;
end ;--这里同样可以不写