oracle-触发器总结

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;