触发器案例一:复杂的安全性检查
禁止在非工作时间插入新员工
非工作时间:
/*
周末:to_char(sysdate,'day') in('星期六','星期日')
上班前、下班后:to_number(to_char(sysdate,'hh24')) not between 8 and 18
*/
select to_char(sysdate,'day') 周,to_number(to_char(sysdate,'hh24')) 小时 ,sysdate from dual;
Create or repalce trigger securityemp
before insert /*在插入语句之前执行PLSQL语句*/
on emp
declare/*程序中不需要使用变量的话 ,可省略不写*/
begin
if to_char(sysdate,'day') in('星期六','星期日') or
to_number(to_char(sysdate,'hh24')) not between 8 and 18 then
/*禁止insert新员工,Oracle错误的区间代码自定义-20000到-20999*/
raise_application_error(-20001,'禁止在非工作时间插入新员工');
end if;
end;
创建触发器的语法:
有FOR EACH ROW 就表明是行级触发器,没有则是语句级触发器
触发器的类型:
语句级触发器:针对是表
行级触发器:针对是行
create or replace trigger trg
before/after
delete/insert/update(of 列)
on table
for each row(where 条件) --行级触发器 触发语句作用的每一条记录都被触发。 使用:old和:new伪记录变量,识别值的状态。
plsql块
create or replace trigger trg
before/after
delete/insert/update(of 列)
on table
for each row(where 条件) --行级触发器 触发语句作用的每一条记录都被触发。 使用:old和:new伪记录变量,识别值的状态。
plsql块
创建触发器的语法
触发器创建格式:
有for each row 就是行级触发器,没有则是语级触发器(语级触发器只触发一次不管涉及多少行数据; 行级触发器则是由多少行被改动就触发多少次)
创建触发器的语法:
创建触发器的语法:
create (/replace) trigger [trigger_name]
before/after
delete/insert/(update (of column))on [tablename]
on [table_name]
(for each row (when(condition)))
(declare)无变量存在可省略
begin
plsql语句
end
1 存在for each row 语句就是行级触发器,没有就是语句级触发器
2 语句级触发器针对表,行级触发器针对行
例如:往表内插入3条数据
如果是行级触发器则被调用3次
如果是语句级触发器则被调用1次,因为针对表的操作只有一次
触发器笔记
如果是update操作的话还可以跟一个列名,使用of操作符。
触发器详解:
1、语句级触发器:针对表
--在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行
2、行级触发器:针对行
--触发语句作用的每一条记录都被触发。在行级触发器中使用:old和:new伪记录变量,识别值得状态。
before 操作之前
after 操作之后
----------------------
delete 删除操作
insert 插入操作
update 更新操作
---------------------
1、创建触发器的语句块
2.触发器的两种类型
语句级触发器:不管这条语句影响多少行,只执行一次(针对表)
行级触发器:每影响一行,都被触发一次。行级触发器中使用:old :new伪记录变量(针对行)
触发器的创建语法