oracle-触发器总结
1、触发器使用场景 复杂的安全性检查 数据确认 实现审计的功能 完成数据的备份和同步
2、触发器是一个特殊的存储过程。
3、触发器类型:语句级的触发器、行级的触发器
4、数据库触发器是一个与表相关联的、存储的pl/sql程序。
5、触发器的作用:每当一个特定的数据操作语句(insert、update、delete)在指定的表上发出的时候,oracle自动的执行触发器中定义的语句序列。
6、第一个触发器:完成功能:每当成功插入一条新员工信息后,自动打印“成功插入新员工”。
Create trigger saynewemp
After insert(表示在执行插入操作之后执行plsql)
On emp(表示在哪个表上操作)
Decalare
Begin
Dbms_output.put_line(“成功插入一条数据!”)
End;
7、触发器应用场景: 复杂的安全性检查 数据的确认 数据的审计 数据的备份和同步
8、创建触发器的语法
Create or replace trigger 触发器的名字
{before|after} 指明在操作之前还是之后 {insert|delete|update[of 列名]} 在执行更新操作的时候可以指定列名。
On 表名 [for each row[when(条件)]] 用于说明触发器的类型是什么 有这条语句代表行级触发器,没有这句语句就代表语句级触发器。
Plsql块
9、语句级的触发器 在指定操作语句之前或是之后执行一次,不管这条语句影响多少行。语句级触发器针对的是表。
10、行级触发器 针对的是行 触发语句作用的每一条记录都被触发。
在行级出发器中使用:old和:new伪记录变量,识别值的状态。
两者的区别:比如一次性向一张表中插入多条数据
如果定义的是语句级触发器,因为是在表的基础上,意味着对表操作了一次,也就触发一次。
如果定义的是行级触发器,因为是在记录的基础上,也就是插入几条记录就会出发几次。
For each row 后面的when条件是指只有满足相应的条件的时候才会触发。
触发器使用案例一:复杂的安全性检查 案例:禁止在非工作时间插入数据
非工作时间:周末 上班前 下班后 比如说九点之前和六点之后,这种情况属于语句级的触发器
Select to_char(sysdate,’day ’) from dual; 表示在周末 使用in(‘星期六’,’星期天’)
Select to_number(to_char(sysdate,’hh24 ’)) from dual; not between 9 and 18
如下: Create or replace trigger securityemp
Before insert On
emp
Declare//不使用自定义变量就不需要写
Begin If(to_char(sysdate,’day ’)) in(‘星期六’,’星期天’) or to_number(to_char(sysdate,’hh24 ’)) not between 9 and 16 then
---禁止插入数据
Raise_application_error(-20001,’禁止在非工作时间插入数据’);
End if;
End;
触发器使用案例二:数据的确认 案例:涨工资不能越涨越少
该触发器属于行级的触发器 每一条记录都需要检查
:old 和 :new 代表的是同一条记录
:old 是代表该行操作之前的值
:new 是代表该行操作之后的值
Create or replace trigger checksalary
Before update
On emp
For each row
Begin If :new.sal6000
then
Insert into 新建的表 values(:new.empno || :new.empname || :new.sal);
End;
触发器使用案例四:数据的备份与同步
主数据库和从数据库 利用触发器实现同步备份(无延时备份)
在同一个数据库中模拟主从数据库 emp表代表主数据库 emp_backup表代表从数据库,用于存放A表的备份 Create table emp_backup as select * from emp;
Create or replace trigger sync_salary
After update
On emp For each row
Begin --当主表更新之后 自动更新从表
Update emp_backup set sal=:new.sal where empno=:new.empno
End;