触发器语法
1 | CREATE [OR REPLACE] TRIGGER trigger_name |
应用场景
复杂的安全性检查
禁止在非工作时间插入数据
1 | /** |
raise_application_error用于在 plsql 使用程序中自定义不正确消息,语法为:
1 | raise_application_error(error_number,message[,[truefalse]]); |
- error_number用于定义错误代码, 必须是在-20000到-20999之间的负整数;
- message用于指定错误消息,并且该消息的长度无法超过2048字节;
数据确认
工资不能越涨越少
分析: 首先确认下触发器的类型, 因为需要对每一条数据进行确认,所以是个行级触发器, 需要 for each row
1 | /** |
数据库审计
创建基于值的触发器
1 | create table xzm_record(info varchar2(256)) ; |
数据的备份和同步
当给员工涨完工资后,自动备份到备份表中
1 | create table xzm_test_bak as select * from xzm_test ; |
oracle中还有个利用快照备份,是异步的。 而利用触发器,是同步的。
其他
建立一个触发器, 当职工表 emp 表被删除一条记录时,把被删除记录写到职工表删除日志表中去。
1 | CREATE TABLE emp_his AS SELECT * FROM EMP WHERE 1=2; |
限制对Departments表修改(包括INSERT,DELETE,UPDATE)的时间范围,即不允许在非工作时间修改departments表。
1 | CREATE OR REPLACE TRIGGER tr_dept_time |
限定只对部门号为80的记录进行行触发器操作。
1 | CREATE OR REPLACE TRIGGER tr_emp_sal_comm |
利用行触发器实现级联更新。在修改了主表regions中的region_id之后(AFTER),级联的、自动的更新子表countries表中原来在该地区的国家的region_id。
1 | CREATE OR REPLACE TRIGGER tr_reg_cou |
在触发器中调用过程。
1 | CREATE OR REPLACE PROCEDURE add_job_history |