- 浏览: 504076 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (285)
- 数据库 (49)
- dwr (1)
- js (35)
- security (6)
- freemaker (4)
- 网站建设 (15)
- css (5)
- javaEE (56)
- 生活点滴 (12)
- 安装与配置 (16)
- ssh2 (13)
- 开源软件 (6)
- web 应用服务器 (6)
- 开发模式和设计模式 (2)
- linux (5)
- 项目管理 (7)
- 计算机杂症 (0)
- appScan (1)
- idea (3)
- android (1)
- java @override 报错处理 (1)
- lucene (5)
- java (2)
- groovy (1)
- Extjs (7)
- asp (2)
- php (2)
- Memcached (1)
- 名言 (1)
- 面试 (1)
- Jmeter (0)
- 微信支付 (1)
- app开发 (1)
- branch分支合并到trunk主干 (1)
- 自动化测试 (1)
- springClond (1)
- ELK (2)
最新评论
-
skykufo:
坑爹啊,我也因为写多了一个div,在ie8浪费了一天
jQuery加载(load、get、post)页面显示空白原因 -
yeyinzhu3211:
帅哥,我想问下,是怎么去除呀?能详细说明下吗?
IntelliJ IDEA 10.5.1 无法断点或停止不动 -
sshitaime:
怎么下载不了啊,能给我一个安装包吗
oracle 10g透明网关组件下载地址(新) -
fuanyu:
xiaohuafyle 写道被你的头像吓尿了 哥们有这么可怕呀 ...
netstat -aon -
wanlt_software:
谢谢。。。。。
oracle 10g透明网关组件下载地址(新)
关键字: oracle 触发器语法
来自:http://bocolijun.iteye.com/blog/364217
一 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 |
发表评论
-
linux下Mongodb的安装与启动
2018-05-18 15:32 706Linux下Mongodb的安装与启动 1、根据lin ... -
Mysql 远程登录及常用命令
2017-01-16 15:25 685来自:http://www.cnblogs.com/good ... -
win7下mysql 不是内部或外部命令解决办法
2017-01-16 15:14 872来自:http://blog.csdn.net/homedj ... -
left join的第二表中符合条件的第一条记录
2015-10-20 16:59 6611表1 parking的数据 通过left join第二表 ... -
oracle 查询当前节点的所有子节点(或父节点)的语句
2015-05-28 14:02 1442描述tb_doc_catalog表(cat_id,cat_n ... -
MySQL命令行导出数据库
2015-02-02 23:56 762MySQL命令行导出数据库:1,进入MySQL目录下的bin ... -
ORACLE11G设置IP访问限制
2014-12-17 18:26 824出于数据安全考虑,对oracle数据库的IP做一些限制,只有 ... -
oracle定时备份-增量备份
2014-12-10 17:59 878在进行数据库维护的过程中经常会遇到数据库备份的问题。先介绍 ... -
ORA-12519: TNS:no appropriate service handler found 解决
2014-11-17 09:53 824有时候连得上数据库,有时候又连不上. 可能是数据库上当前的 ... -
ORA-28056的解决办法
2014-11-10 10:54 1413客户端一直无法连接,查看alert日志,错误日志如下: ... -
plsql不用配置netManager直接访问oracle
2014-10-14 11:38 1581plsql不用配置netManager直接访问oracle ... -
oracle库中只读用户需要的权限
2013-08-28 23:23 4521业务中要求建立一个只读用户,此用户对其他用户的对象有只读权限 ... -
oracle10 集群 jdbc数据库连接包
2012-12-29 15:46 1198常用JDBC JAR 信息 序号 常用JDBC驱动包 ... -
oracle集群url配置
2012-12-29 15:37 1292oracle集群中plsql和java程序连接方式非集群中pl ... -
oracle常用的bug问题解决
2012-10-17 18:11 1039oracle常用的bug问题解决:测试中所用到的都是win20 ... -
sql 过滤重复数据
2012-06-15 15:57 0sql 过滤重复数据 distinct或group by ... -
Oracle定时任务(转)
2012-04-09 17:16 1031创建表 Sql代码 create tab ... -
(原)mssql数据迁移到oracle
2012-02-10 17:36 1364迁移过程中遇到两种Microsoft OLE DB Prov ... -
JDBC Driver For MSSQL2000/2005/2008(downmoon)
2012-02-08 10:48 2200机器上配置的JDK为1.6,S ... -
oracle 10g透明网关组件下载地址(新)
2012-01-13 15:56 3632oracle 10g透明网关组件下载地址,需要oracle注册 ...
相关推荐
### Oracle触发器语法要点 #### 一、触发器概述 Oracle触发器是一种存储过程,它在特定的数据库事件(如INSERT、UPDATE或DELETE)发生时自动执行。触发器可以用于实施复杂的业务规则、数据完整性检查或者自动生成...
"Oracle触发器语法详解" Oracle 触发器是一种特殊的存储过程,它在插入、删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。触发器可以基于数据库的值使用户具有操作...
Oracle触发器是数据库管理系统Oracle中的一种重要特性,用于在特定数据操作(如插入、删除、更新)发生时自动执行预定义的SQL语句或PL/SQL代码块。这些语句或代码块通常用来实现复杂的数据完整性规则、安全性控制、...
Oracle触发器语法.pdf
oracle 触发器语法及 for each row 详细说明
下面将详细阐述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 ...