- 浏览: 264084 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
cannysqurrel:
http://wizkm.com/wizkm/invite/4 ...
缺一个整理日常翻阅资料的工具 -
54sunboy:
这些资料我都是用evernote收集和归类的。电子书或文档暂时 ...
缺一个整理日常翻阅资料的工具 -
tuo_bing:
请问 ,如果 Tomcat的配置为 : <Cont ...
tomcat 发布多个项目时抛的webAppRootKey错误 -
syzxf1996:
thank you ,想收藏,没有成功,只能留言了。希望下回还 ...
display tag中去除不需要的参数 -
Alanのjava:
谢谢!楼主
javascript视频教程下载
一 Oracle触发器语法
触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。
功能:
1、 允许/限制对表的修改
2、 自动生成派生列,比如自增字段
3、 强制数据一致性
4、 提供审计和日志记录
5、 防止无效的事务处理
6、 启用复杂的业务逻辑
触发器触发时间有两种:after和before。
1、触发器的语法:
CREATE [OR REPLACE] TIGGER触发器名 触发时间 触发事件
ON表名
[FOR EACH ROW]
BEGIN
pl/sql语句
END
其中:
触发器名:触发器对象的名称。
由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
触发时间:指明触发器何时执行,该值可取:
before---表示在数据库动作之前触发器执行;
after---表示在数据库动作之后出发器执行。
触发事件:指明哪些数据库动作会触发此触发器:
insert:数据库插入会触发此触发器;
update:数据库修改会触发此触发器;
delete:数据库删除会触发此触发器。
表 名:数据库触发器所在的表。
for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。
2、举例:
下面的触发器在更新表auths之前触发,目的是不允许在周末修改表:
create triggerauth_secure before insert or update or delete //对整表更新前触发 on auths begin if(to_char(sysdate,'DY')='SUN' RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表auths'); end if; end |
例子:
CREATE OR REPLACE TRIGGER CRM.T_SUB_USERINFO_AUR_NAME AFTER UPDATE OF STAFF_NAME ON CRM.T_SUB_USERINFO REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW declare begin if :NEW.STAFF_NAME!=:OLD.STAFF_NAME then begin |
- 客户投诉
update T_COMPLAINT_MANAGE set SERVE_NAME=:NEW.STAFF_NAME where SERVE_SEED=:OLD.SEED; |
- 客户关怀
update T_CUSTOMER_CARE set EXECUTOR_NAME=:NEW.STAFF_NAME where EXECUTOR_SEED=:OLD.SEED; |
- 客户服务
update T_CUSTOMER_SERVICE set EXECUTOR_NAME=:NEW.STAFF_NAME where EXECUTOR_SEED=:OLD.SEED; end; end if; end T_sub_userinfo_aur_name; / |
二 Oracle触发器详解
开始:
create triggerbiufer_employees_department_id beforeinsertorupdateofdepartment_idonemployees referencingoldasold_value newasnew_value for each row when (new_value.department_id<>80 ) begin :new_value.commission_pct :=0; end; / |
1、触发器的组成部分:
1、 触发器名称
2、 触发语句
3、 触发器限制
4、 触发操作
1.1、触发器名称
create trigger biufer_employees_department_id |
命名习惯:
biufer(before insert update for each row) |
employees表名
department_id列名
1.2、触发语句
比如:
表或视图上的DML语句
DDL语句
数据库关闭或启动,startup shutdown等等
before insert or update of department_id on employees referencing old as old_value new as new_value for each row |
说明:
1、 无论是否规定了department_id,对employees表进行insert的时候
2、 对employees表的department_id列进行update的时候
1.3、触发器限制
when (new_value.department_id<>80 ) |
限制不是必须的。此例表示如果列department_id不等于80的时候,触发器就会执行。
其中的new_value是代表更新之后的值。
1.4、触发操作
是触发器的主体
begin :new_value.commission_pct :=0; end; |
主体很简单,就是将更新后的commission_pct列置为0
触发:
insert into employees(employee_id,last_name,first_name,hire_date,job_id,email, department_id,salary,commission_pct ) values( 12345,’Chen’,’Donny’, sysdate, 12, ‘donny@hotmail.com’,60,10000,.25); select commission_pct from employees where employee_id=12345; |
触发器不会通知用户,便改变了用户的输入值。
2、触发器的类型有:
触发器类型:
1、 语句触发器
2、 行触发器
3、INSTEAD OF触发
4、 系统条件触发器
5、 用户事件触发器
2.1、语句级触发器.(语句级触发器对每个DML语句执行一次)
是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。能够与INSERT、UPDATE、DELETE或者组合上进行关联。但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次。比如,无论update多少行,也只会调用一次update语句触发器。
实例:
create or replace trigger tri_test after insert or update or delete on test begin if updating then dbms_output.put_line('修改'); elsif deleting then dbms_output.put_line('删除'); elsif inserting then dbms_output.put_line('插入'); end if; end; |
2.2、行级触发器.(行级触发器对DML语句影响的每个行执行一次)
实例一:
- 触发器
- 行级触发器
create table test(sid number,sname varchar2(20));--创建一个表 create sequence seq_test;--创建序列 create or replace trigger tri_test--创建触发器 before insert or update of sid on test for each row--触发每一行 begin if inserting then select seq_test.nextval into:new.sid from dual; else raise_application_error(-20020,'不允许更新ID值!');--中断程序 end if; end; |
触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程。本文继续介绍Oracle 触发器语法及实例。
- 测试,插入几条记录
insert into test values(0,'ff'); insert into test values(0,'ff'); insert into test values(0,'tt'); |
实例二:
- 创建一个触发器,无论用户插入新记录,还是修改emp表的job列,都将用户指定的job列的值转换成大写.
create or replace trigger trig_job before insert or update of job on emp for each row begin if inserting then :new.job:=upper(:new.job); else :new.job:=upper(:new.job); end if; end; |
2.3、instead of触发器.
(此触发器是在视图上而不是在表上定义的触发器,它是用来替换所使用实际语句的触发器.)
语法如下:
create or replace triggertrig_test instead ofinsert or update on表名 referencing new as n for each row declare .......... begin ........ end; |
2.4、模式触发器.
可以在模式级的操作上建立触发器.
实例如下:
create or replace trigger log_drop_obj after drop on schema begin insert into ..... end; |
2.5、数据库级触发器.
可以创建在数据库事件上的触发器,包括关闭,启动,服务器错误,登录等.这些事件都是实例范围的,不与特定的表或视图关联.
实例:
create or replace trigger trig_name after startup on database begin ........... end; |
2.6、例子:
需要对在表上进行DML操作的用户进行安全检查,看是否具有合适的特权。
Create table foo(a number); Create trigger biud_foo Before insert or update or delete On foo Begin If user not in (‘DONNY’) then Raise_application_error(-20001, ‘You don’t have access to modify this table.’); End if; End; / |
即使SYS,SYSTEM用户也不能修改foo表
2.7、[试验]
对修改表的时间、人物进行日志记录。
1、 建立试验表
create table employees_copy as select *from hr.employees |
2、 建立日志表
create table employees_log( who varchar2(30), when date); |
3、 在employees_copy表上建立语句触发器,在触发器中填充employees_log表。
Create or replace trigger biud_employee_copy Before insert or update or delete On employees_copy Begin Insert into employees_log(Who,when) Values( user, sysdate); End; / |
4、 测试
update employees_copy set salary= salary*1.1; select *from employess_log; |
5、 确定是哪个语句起作用?
即是INSERT/UPDATE/DELETE中的哪一个触发了触发器?
可以在触发器中使用INSERTING / UPDATING / DELETING条件谓词,作判断:
begin if inserting then ----- elsif updating then ----- elsif deleting then ------ end if; end; if updating(‘COL1’) or updating(‘COL2’) then ------ end if; |
2.8、[试验]
1、 修改日志表
alter table employees_log add (action varchar2(20)); |
2、 修改触发器,以便记录语句类型。
then l_action:=’Delete’; else raise_application_error(-20001,’You should never ever get this error.’); Insert into employees_log(Who,action,when) Values( user, l_action,sysdate); End;Create or replace trigger biud_employee_copy Before insert or update or delete On employees_copy Declare L_action employees_log.action%type; Begin if inserting then l_action:=’Insert’; elsif updating then l_action:=’Update’; elsif deleting / |
3、 测试
insert into employees_copy( employee_id, last_name, email, hire_date, job_id) values(12345,’Chen’,’Donny@hotmail’,sysdate,12); select *from employees_log |
发表评论
-
OracleDBConsole[SID]服务启动报错
2010-06-29 00:36 1797OracleDBConsole[SID]服务简介 Orac ... -
oralce Connect by
2010-05-07 12:33 1276--connect by 使用详解/*START WITH 表 ... -
Oracle游标使用
2009-12-19 15:17 1145从游标提取数据 从 ... -
Oracle的日期函数
2009-11-17 17:45 735相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可 ... -
Oracle to_date方法
2009-08-11 18:44 1596日期格式参数 含义说明 D 一周中的星期几 DAY 天的名字, ... -
Oracle中TO_DATE格式
2009-06-12 10:22 946TO_DATE格式(以时间:2007-11-02 ... -
SQL语句按时间查询
2009-03-18 10:21 2725以前没太注意SQL语句中按时间条件查询,结果写了个SQL查询报 ... -
ORA-01008: not all variables bound
2009-03-12 09:52 5051ORA-01008: not all variables bo ... -
PowerDesign高级应用
2009-02-26 11:22 874PowerDesign高级应用 1、去掉Oracle生成 ... -
powerDesign
2009-02-26 11:16 982PowerDesigner系列产品提供了一个完整的建模解决方案 ... -
深入浅出oracle锁原理篇
2008-11-14 12:38 1433在现代的多用户多任务系统中,必然会出现多个用户同时访问共享的某 ... -
在ORACLE中实现Select TOP N
2008-10-23 09:59 1211在ORACLE中实现Select TOP N ... -
clob和blob两个字段的区别
2008-10-22 15:33 3552转载自:http://www.bokebb.com/dev/c ... -
SQL截取字符串
2008-10-21 11:05 2567SUBSTRING 返回字符、binary、text ... -
数据库字符串拼接
2008-10-21 10:37 1629表wf_oasheetmain中有一字段file_code 某 ... -
sql日期的详细解释
2008-05-15 10:00 1009Select /* * 输出格式: x年x周 * 如:2 ... -
sql语句中的日期处理
2008-05-15 09:07 2733一.日期處理函數 1.日期 ... -
JDBC driver连接SQL Server 2000数据库
2007-12-15 22:28 3146(这是我在网上找的一篇,希望能对需要的人有所帮助) 连接前我 ...
相关推荐
Oracle触发器语法
oracle触发器语法要点
Oracle触发器语法.pdf
oracle 触发器语法及 for each row 详细说明
触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。数据库触发器有以下的作用:
这是个pdf格式的文件,主要描述了Oracle 触发器语法及实例基础知识。希望能够给大家带来帮助(*^__^*)
ORACLE触发器语法 建立的方法, 格式
oracle高级语法(事物、函数、存储过程、触发器、异常)[参照].pdf
本文是触发器的概念,语法,实例 进行剖析
3,触发器语法和功能 3 4,例一:行级触发器之一 4 5,例二:行级触发器之二 4 6,例三:INSTEAD OF触发器 6 7,例四:语句级触发器之一 8 8,例五:语句级触发器之二 9 9,例六:用包封装触发器代码 10 10,...
主要介绍了Oracle触发器用法,结合实例形式详细分析了Oracle触发器的概念,功能,语法及相关使用技巧,需要的朋友可以参考下
oracle 存储过程的基本语法,关于oracle存储过程的若干问题备忘,oracle 存储过程语法总结及练习;oracle语法:Oracle触发器语法及实例基础知识(一)。
包含Oracle 函数,Oracle 优化,Oralce连接管理器,Ora 10G 错误代码,Oracle 触发器语法及实例,ORACLE的执行计划等..
:NEW 和:OLD使用方法和意义,new 只出现在insert和update时,old只出现在update和delete时。在insert时new表示新插入的行数据,update时new表示要替换的新数据、old表示要被更改的原来的数据行,delete时old表示要被...
这一部分概述了 Transact-SQL 和 PL/SQL 语言语法之间的相同点和不同点,并给出转换策略。 要将 Oracle DML 语句和 PL...9. 把 PL/SQL 触发器转换为 Transact-SQL 触发器。 10. 使用 SET SHOWPLAN 语句,优化查询性能。
介绍了oracle存储过程的实现、存储过程的调用和触发器语法及实例的基础知识
每当一个特定的数据操作语句(insert update delete)在指定的表上发出时,Oracle自动执行触发器中定义的语句序列。 举个简单的例子: 当员工表中新增一条记录后,自动打印“成功插入新员工” create or replace ...
Oracle 常用命令举例 标题 基本语法 %type用法,%rowtype用法,TYPE用法 游标的使用 for 循环 loop循环 while循环 if / else 的用法 case 的用法 标题 错误定义 error的设定 exception用法 ...
Oracle基本语法及应用示例。(建库,建表,新建用户,表空间,分配用户权限,游标,索引,视图,存储过程,触发器等)。保证下载后绝不让你失望哦!
oracle_PLSQL_语法详细手册 目 录 第一部分 SQL语法部分 3 一、 CREATE TABLE 语句 3 二、 CREATE SEQUENCE语句 5 三、 CREATE VIEW语句 6 四、 INSERT语句: 7 五、 UPDATE语句: 9 六、 DELETE语句: 10 七、 ...