博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(trigger)触发器的定义和作用
阅读量:6580 次
发布时间:2019-06-24

本文共 4631 字,大约阅读时间需要 15 分钟。

第一:触发器(trigger)

触发器(trigger)是指隐含执行的存储过程procedure,当定义触发器时必须要指定触发事件和触发的操作,通常触发事件包括insert,update,delete语句,触发器实际上就是一个pl/sql(procedure language/Structured Query Language).create trigger来创建触发器;

 

第二:触发器的作用;

a.允许/限制对表的修改

b.自动派生列,如自增字段

c.强制数据的一致性

d.提供审计和日志记录

e.防止无效的事务处理

f.启动复杂的业务逻辑

 

第三:触发器的语法;

  

Sql代码  
  1. create or replace trigger temp_trigger ---定义一个触发器 temp_trigger   
  2. after|before|instead of                         ---指定触发时机和触发类型   
  3. insert|update|delete                            ---指定触发事件   
  4. of columns_name on table_name         ---of & on 监控的表单和表列   
  5. referencing   
  6. old as old_value   
  7. new as new_value   
  8. for each row|for each statement         ---指定触发次数(行和语句)   
  9. begin  
  10. codes   
  11. end;  
create or replace trigger temp_trigger ---定义一个触发器 temp_triggerafter|before|instead of                         ---指定触发时机和触发类型insert|update|delete                            ---指定触发事件of columns_name on table_name         ---of & on 监控的表单和表列referencingold as old_valuenew as new_valuefor each row|for each statement         ---指定触发次数(行和语句)begincodesend;

 

instead of 是一种单独的出发机制,用来管理和执行view类型的数据表单

of &on 监控关键字 of 可以省区,on是必须留下的

 

第四:例子instance

 

a:创建一个行触发器 tri

Sql代码  
  1. create or replace trigger tri                   ---trigger tri   
  2. before insert or update on employee    
  3. referencing old as old_value   
  4.                    new as new_value   
  5. for each row   
  6. when(new_value.empid<>'14')             ---当插入的empid不等于14   
  7. begin  
  8. :new_value.salary:=2001;                    ---将插入的的salary更改成2001   
  9. end;  
create or replace trigger tri                   ---trigger tribefore insert or update on employee referencing old as old_value                   new as new_valuefor each rowwhen(new_value.empid<>'14')             ---当插入的empid不等于14begin:new_value.salary:=2001;                    ---将插入的的salary更改成2001end;

 

触发事件:

Sql代码  
  1. insert into employee values(emp_seq.nextval,'Janney',10,'1');   ---插入一条数据   
  2.   
  3. update employee set employee.empname='Alex' where employee.empid='12';  --根新empid=15的数据  
insert into employee values(emp_seq.nextval,'Janney',10,'1');   ---插入一条数据update employee set employee.empname='Alex' where employee.empid='12';  --根新empid=15的数据

结果:

分析:

对比发现,无论你修改或增加数据只要empid!=14,salary都固定在2001。

 

 b:创建一个语句触发器

  创建一表单 idiot

Sql代码  
  1. create table idiot(   
  2. i_id varchar2(255) primary key,   
  3. i_name varchar2(255),   
  4. i_add varchar2(255)   
  5. )  
create table idiot(i_id varchar2(255) primary key,i_name varchar2(255),i_add varchar2(255))

 

  创建触发器 tri_idiot

Sql代码  
  1. create or replace trigger tri_idiot   
  2. before update or insert on idiot   
  3. begin  
  4. if user not in ('hjd'then  
  5. Raise_application_error(-20001,'You don’t have access to modify this table.');   
  6. end if;   
  7. end;  
create or replace trigger tri_idiotbefore update or insert on idiotbeginif user not in ('hjd') thenRaise_application_error(-20001,'You don’t have access to modify this table.');end if;end;

 触发事件

Sql代码  
  1. insert into idiot values(idi_seq.nextval,'daniel','武汉');   
  2. insert into idiot values(idi_seq.nextval,'justin','武汉');   
  3. insert into idiot values(idi_seq.nextval,'alex','南昌');  
insert into idiot values(idi_seq.nextval,'daniel','武汉');insert into idiot values(idi_seq.nextval,'justin','武汉');insert into idiot values(idi_seq.nextval,'alex','南昌');

 结果:

(在非hjd的用户下执行)

此处的trigger是控制权限的
 
c:创建一个触发器log修改操作人员和时间和行为

Sql代码  
  1. ---复制一张表格 命名为tem_employee 为操作的表格--   
  2. create table tem_employee as select * from employee  
---复制一张表格 命名为tem_employee 为操作的表格--create table tem_employee as select * from employee

  

Sql代码  
  1. --创建一张 tem_employee_log记录变化--   
  2. create table tem_employee_log(   
  3. l_who varchar2(50),   
  4. l_when date  
  5. )  
--创建一张 tem_employee_log记录变化--create table tem_employee_log(l_who varchar2(50),l_when date)

   

Sql代码  
  1. ---增加一column---   
  2. alter table tem_employee_log add(action varchar2(20));  
---增加一column---alter table tem_employee_log add(action varchar2(20));

  创建触发器 tri

Sql代码  
  1. create or replace trigger tri   
  2. before insert or update or delate on temp_employee   
  3. declare                                                          -----声明一变量   
  4. l_action tem_employee_log.action%type;   
  5. begin  
  6. if inserting then l_action:='insert';   
  7. elsif updating then l_action:='update';             --此处用elsif   
  8. elsif deleting then l_action:='delete';   
  9. else raise_application_error(-20001,'You should never ever get this error.');   
  10. end if;   
  11. insert into tem_employee_log values(user,sysdate,l_action);   
  12. end;  
create or replace trigger tribefore insert or update or delate on temp_employeedeclare                                                          -----声明一变量l_action tem_employee_log.action%type;beginif inserting then l_action:='insert';elsif updating then l_action:='update';             --此处用elsifelsif deleting then l_action:='delete';else raise_application_error(-20001,'You should never ever get this error.');end if;insert into tem_employee_log values(user,sysdate,l_action);end;

 

触发语句

Sql代码  
  1. delete from tem_employee where tem_employee.empid='4';  
delete from tem_employee where tem_employee.empid='4';

 结果:

转载于:https://www.cnblogs.com/zhengguangITelite/p/3209249.html

你可能感兴趣的文章
突然停电或死机导致没保存的文件怎么找回
查看>>
dockerfile文件创建镜像详解
查看>>
kudu
查看>>
HashMap底层实现原理,以及和Hashtable的比较
查看>>
jquery.validate.min.js表单验证使用
查看>>
在JS中捕获console.log的输出
查看>>
Python扫描IP段指定端口是否开放(一次扫描20个B网段没问题)
查看>>
一些常用的WebServices
查看>>
CentOS7使用firewalld打开关闭防火墙与端口
查看>>
maven 添加阿里云maven镜像
查看>>
wireshark lua插件
查看>>
mac上安装consolas字体
查看>>
对向量、矩阵求导
查看>>
各版本linux下载地址大全
查看>>
CentOS 6.X 关闭不需要的 TTY 方法
查看>>
我的友情链接
查看>>
分区技术学习一
查看>>
Juniper 高级选项
查看>>
中国区GitHub前100名到底是什么样的人?
查看>>
编程能力的四种境界
查看>>