- 浏览: 268345 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
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 1823OracleDBConsole[SID]服务简介 Orac ... -
oralce Connect by
2010-05-07 12:33 1303--connect by 使用详解/*START WITH 表 ... -
Oracle游标使用
2009-12-19 15:17 1170从游标提取数据 从 ... -
Oracle的日期函数
2009-11-17 17:45 762相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可 ... -
Oracle to_date方法
2009-08-11 18:44 1619日期格式参数 含义说明 D 一周中的星期几 DAY 天的名字, ... -
Oracle中TO_DATE格式
2009-06-12 10:22 979TO_DATE格式(以时间:2007-11-02 ... -
SQL语句按时间查询
2009-03-18 10:21 2757以前没太注意SQL语句中按时间条件查询,结果写了个SQL查询报 ... -
ORA-01008: not all variables bound
2009-03-12 09:52 5099ORA-01008: not all variables bo ... -
PowerDesign高级应用
2009-02-26 11:22 916PowerDesign高级应用 1、去掉Oracle生成 ... -
powerDesign
2009-02-26 11:16 1015PowerDesigner系列产品提供了一个完整的建模解决方案 ... -
深入浅出oracle锁原理篇
2008-11-14 12:38 1460在现代的多用户多任务系统中,必然会出现多个用户同时访问共享的某 ... -
在ORACLE中实现Select TOP N
2008-10-23 09:59 1242在ORACLE中实现Select TOP N ... -
clob和blob两个字段的区别
2008-10-22 15:33 3584转载自:http://www.bokebb.com/dev/c ... -
SQL截取字符串
2008-10-21 11:05 2588SUBSTRING 返回字符、binary、text ... -
数据库字符串拼接
2008-10-21 10:37 1658表wf_oasheetmain中有一字段file_code 某 ... -
sql日期的详细解释
2008-05-15 10:00 1032Select /* * 输出格式: x年x周 * 如:2 ... -
sql语句中的日期处理
2008-05-15 09:07 2771一.日期處理函數 1.日期 ... -
JDBC driver连接SQL Server 2000数据库
2007-12-15 22:28 3172(这是我在网上找的一篇,希望能对需要的人有所帮助) 连接前我 ...
相关推荐
### Oracle触发器语法要点 #### 一、触发器概述 Oracle触发器是一种存储过程,它在特定的数据库事件(如INSERT、UPDATE或DELETE)发生时自动执行。触发器可以用于实施复杂的业务规则、数据完整性检查或者自动生成...
"Oracle触发器语法详解" Oracle 触发器是一种特殊的存储过程,它在插入、删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。触发器可以基于数据库的值使用户具有操作...
Oracle触发器是数据库管理系统Oracle中的一种重要特性,用于在特定数据操作(如插入、删除、更新)发生时自动执行预定义的SQL语句或PL/SQL代码块。这些语句或代码块通常用来实现复杂的数据完整性规则、安全性控制、...
Oracle触发器语法.pdf
oracle 触发器语法及 for each row 详细说明
在深入探讨ORACLE触发器语法之前,我们先来理解一下触发器的基本概念。触发器是数据库中的一个存储过程,它会在特定的事件(如数据插入、更新或删除)发生时自动执行。ORACLE触发器是一种强大的工具,允许数据库管理...
下面将详细阐述Oracle触发器的基本语法和实例。 1. **触发器定义**: - 触发器由`CREATE TRIGGER`语句创建,它包括触发器名、触发事件、触发时间(BEFORE或AFTER)、触发条件和触发动作(PL/SQL代码块)。 - 示例...
### Oracle触发器Before和After应用详解 #### 引言 Oracle数据库系统中,触发器是一项核心功能,用于响应特定事件的自动执行代码块。本文旨在深入解析Oracle触发器中的Before和After两种触发时机,以及它们在...
在`oracle触发器语法.txt`中,你应该能找到关于触发器的创建、删除以及不同类型的触发器(如行级和语句级)的详细语法。 通过学习这些例子,你将能够更好地理解和应用Oracle中的函数、游标和触发器。实践是掌握这些...
【Oracle触发器的创建与使用】是数据库管理中不可或缺的一部分,尤其在Oracle数据库系统中,触发器扮演着关键角色。触发器是一种存储过程,当特定的数据库事件发生时(如INSERT、UPDATE或DELETE操作),它会被自动...
Oracle 高级语法是指在 Oracle 数据库管理系统中使用的高级语法结构,包括事务、函数、存储过程、触发器、异常等。这些语法结构是 Oracle 数据库开发和管理的核心内容,对于数据库开发者和管理员来说是必备的知识。 ...
根据给定的文件信息,我们将深入探讨Oracle数据库中的触发器和内置程序包,重点解析触发器的概念、创建方法以及其在数据库管理中的作用。 ### 触发器:自动化执行的存储过程 触发器是一种特殊类型的存储过程,它在...
### Oracle触发器详解 在Oracle数据库管理中,触发器是一种非常强大的工具,它允许你在特定的数据库事件(如数据插入、更新或删除)发生时自动执行预定义的SQL语句或PL/SQL代码块。这使得数据库能够在无需外部程序...
Oracle 触发器的概念和类型 Oracle 触发器是一种特殊的存储过程,它在插入、删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。数据库触发器有以下几种作用: 1. ...
### Oracle触发器详解 在数据库管理系统中,Oracle触发器是一种特殊类型的存储过程,它自动执行对数据的操作,当特定事件发生时(如插入、更新或删除数据)在数据库表上执行。触发器可以用于实现复杂的数据完整性...
5. 触发器语法: - `CREATE TRIGGER trigger_name [BEFORE | AFTER] {INSERT | UPDATE [OF column_list] | DELETE} ON table_name [FOR EACH ROW]` - `trigger_name`:触发器的名称。 - `BEFORE`或`AFTER`:...
Oracle触发器是数据库对象之一,它允许在特定的数据库事件(如INSERT、UPDATE或DELETE)发生时自动执行一段PL/SQL代码。触发器是数据库级的程序,可以在数据更改前或后执行,用来实现复杂的业务规则和逻辑。在这个...
Oracle触发器是数据库管理系统Oracle中的一个重要特性,它允许在特定事件(如数据修改DML操作:INSERT、UPDATE或DELETE)发生时自动执行预定义的PL/SQL代码块。触发器可以用来实现复杂的业务规则,审计跟踪,或者在...
通过阅读`ORACLE 触发器语法及实例.txt`和`Oracle触发器语法(一) .txt`文件,你可以更深入地了解Oracle触发器的各种细节和更多实用示例。这些文档可能会涵盖如复合触发器、行级和语句级触发器的差异、如何禁用和启用...
Oracle 触发器的语法和功能: * 触发器的语法类似存储过程,使用 CREATE TRIGGER 语句创建。 * 触发器可以执行多种操作,例如插入、更新、删除、合并等。 * 触发器可以使用 WHEN 子句来指定触发条件。 Oracle ...