ImageVerifierCode 换一换
格式:DOCX , 页数:39 ,大小:27.91KB ,
资源ID:5363678      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5363678.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(oracle 触发器的种类和触发事件dml触发器ddl事件触发器替代触发器查看触发.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

oracle 触发器的种类和触发事件dml触发器ddl事件触发器替代触发器查看触发.docx

1、oracle 触发器的种类和触发事件dml触发器ddl事件触发器替代触发器查看触发oracle 触发器的种类和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发. oracle 数据库开发应用实例,招生录取系统 . | oracle 创建,删除存储过程,参数传递,创 . 2009-04-14oracle 触发器的种类和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发器,关键字: oracle 触发器 种类 触发 事件 dml ddl 事件 替代 查看 触发器的种类和触发事件 触发器必须由事件才能触发。触发器的触发事件分可为3类,分别是DML事件、DDL事件和数据库事件

2、。 每类事件包含若干个事件,如下所示。数据库的事件是具体的,在创建触发器时要指明触发的事件。 种 类 关 键 字 含 义 Sql代码 DML事件(3种) INSERT 在表或视图中插入数据时触发 UPDATE 修改表或视图中的数据时触发 DELETE 在删除表或视图中的数据时触发 DDL事件(3种) CREATE 在创建新对象时触发 ALTER 修改数据库或数据库对象时触发 DROP 删除对象时触发 数据库事件(5种) STARTUP 数据打开时触发 SHUTDOWN 在使用NORMAL或IMMEDIATE选项关闭数据库时触发 LOGON 当用户连接到数据库并建立会话时触发 LOGOFF 当一

3、个会话从数据库中断开时触发 SERVERERROR 发生服务器错误时触发 DML事件(3种) INSERT 在表或视图中插入数据时触发UPDATE 修改表或视图中的数据时触发DELETE 在删除表或视图中的数据时触发DDL事件(3种) CREATE 在创建新对象时触发ALTER 修改数据库或数据库对象时触发DROP 删除对象时触发数据库事件(5种) STARTUP 数据打开时触发SHUTDOWN 在使用NORMAL或IMMEDIATE选项关闭数据库时触发LOGON 当用户连接到数据库并建立会话时触发LOGOFF 当一个会话从数据库中断开时触发SERVERERROR 发生服务器错误时触发触发器的

4、类型可划分为4种:数据操纵语言(DML)触发器、替代(INSTEAD OF)触发器、数据定义语言(DDL)触发器和数据库事件触发器。 各类触发器的作用如下所示。 Sql代码 种 类 简 称 作 用 数据操纵语言触发器 DML触发器 创建在表上,由DML事件引发的触发器 替代触发器 INSTEAD OF触发器 创建在视图上,用来替换对视图进行的插入、删除和修改操作 数据定义语言触发器 DDL触发器 定义在模式上,触发事件是数据库对象的创建和修改 数据库事件触发器 定义在整个数据库或模式上,触发事件是数据库事件 种 类 简 称 作 用数据操纵语言触发器 DML触发器 创建在表上,由DML事件引发的

5、触发器替代触发器 INSTEAD OF触发器 创建在视图上,用来替换对视图进行的插入、删除和修改操作数据定义语言触发器 DDL触发器 定义在模式上,触发事件是数据库对象的创建和修改数据库事件触发器 定义在整个数据库或模式上,触发事件是数据库事件DML触发器的要点 DML触发器是定义在表上的触发器,由DML事件引发。编写DML触发器的要素是: * 确定触发的表,即在其上定义触发器的表。 * 确定触发的事件,DML触发器的触发事件有INSERT、UPDATE和DELETE三种,说明见下。 * 确定触发时间。触发的时间有BEFORE和AFTER两种,分别表示触发动作发生在DML语句执行之前和语句执行

6、之后。 * 确定触发级别,有语句级触发器和行级触发器两种。语句级触发器表示SQL语句只触发一次触发器,行级触发器表示SQL语句影响的每一行都要触发一次。 由于在同一个表上可以定义多个DML触发器,因此触发器本身和引发触发器的SQL语句在执行的顺序上有先后的关系。它们的顺序是: * 如果存在语句级BEFORE触发器,则先执行一次语句级BEFORE触发器。 * 在SQL语句的执行过程中,如果存在行级BEFORE触发器,则SQL语句在对每一行操作之前,都要先执行一次行级BEFORE触发器,然后才对行进行操作。如果存在行级AFTER触发器,则SQL语句在对每一行操作之后,都要再执行一次行级AFTER触

7、发器。 * 如果存在语句级AFTER触发器,则在SQL语句执行完毕后,要最后执行一次语句级AFTER触发器。 DML触发器还有一些具体的问题,说明如下: * 如果有多个触发器被定义成为相同时间、相同事件触发,且最后定义的触发器是有效的,则最后定义的触发器被触发,其他触发器不执行。 * 一个触发器可由多个不同的DML操作触发。在触发器中,可用INSERTING、DELETING、UPDATING谓词来区别不同的DML操作。这些谓词可以在IF分支条件语句中作为判断条件来使用。 * 在行级触发器中,用:new 和:old(称为伪记录)来访问数据变更前后的值。但要注意,INSERT语句插入一条新记录,

8、所以没有:old记录,而DELETE语句删除掉一条已经存在的记录,所以没有:new记录。UPDATE语句既有:old记录,也有:new记录,分别代表修改前后的记录。引用具体的某一列的值的方法是: ld.字段名或:new.字段名 * 触发器体内禁止使用COMMIT、ROLLBACK、SAVEPOINT语句,也禁止直接或间接地调用含有上述语句的存储过程。 定义一个触发器时要考虑上述多种情况,并根据具体的需要来决定触发器的种类。 DML触发器的创建 创建DML触发器需要CREATE TRIGGER系统权限。创建DML触发器的语法如下: CREATE OR REPLACE TRIGGER 触发器名 B

9、EFORE|AFTER|INSTEAD OF 触发事件1 OR 触发事件2. ON 表名 WHEN 触发条件 FOR EACH ROW DECLARE 声明部分 BEGIN 主体部分 END; 其中: OR REPLACE:表示如果存在同名触发器,则覆盖原有同名触发器。 BEFORE、AFTER和INSTEAD OF:说明触发器的类型。 WHEN 触发条件:表示当该条件满足时,触发器才能执行。 触发事件:指INSERT、DELETE或UPDATE事件,事件可以并行出现,中间用OR连接。 对于UPDATE事件,还可以用以下形式表示对某些列的修改会引起触发器的动作: UPDATE OF 列名1,列

10、名2. ON 表名:表示为哪一个表创建触发器。 FOR EACH ROW:表示触发器为行级触发器,省略则为语句级触发器。 触发器的创建者或具有DROP ANY TIRGGER系统权限的人才能删除触发器。删除触发器的语法如下: DROP TIRGGER 触发器名 可以通过命令设置触发器的可用状态,使其暂时关闭或重新打开,即当触发器暂时不用时,可以将其置成无效状态,在使用时重新打开。该命令语法如下: ALTER TRIGGER 触发器名 DISABLE|ENABLE 其中,DISABLE表示使触发器失效,ENABLE表示使触发器生效。 同存储过程类似,触发器可以用SHOW ERRORS 检查编译错

11、误。 行级触发器的应用 在行级触发器中,SQL语句影响的每一行都会触发一次触发器,所以行级触发器往往用在对表的每一行的操作进行控制的场合。若在触发器定义中出现FOR EACH ROW子句,则为语句级触发器。 【训练1】 创建包含插入、删除、修改多种触发事件的触发器DML_LOG,对EMP表的操作进行记录。用INSERTING、DELETING、UPDATING谓词来区别不同的DML操作。 在创建触发器之前,需要先创建事件记录表LOGS,该表用来对操作进行记录。该表的字段含义解释如下: LOG_ID:操作记录的编号,数值型,它是该表的主键,由序列自动生成。 LOG_TABLE:进行操作的表名,字

12、符型,非空,该表设计成可以由多个触发器共享使用。比如我们可以为dept表创建类似的触发器,同样将操作记录到该表。 LOG_DML:操作的动作,即INSERT、DELETE或UPDATE三种之一。 LOG_KEY_ID:操作时表的主键值,数值型。之所以记录表的主键,是因为主键是表的记录的惟一标识,可以识别是对哪一条记录进行了操作。对于emp表,主键是empno。 LOG_DATE:操作的日期,日期型,取当前的系统时间。 LOG_USER:操作者,字符型,取当时的操作者账户名。比如登录SCOTT账户进行操作,在该字段中,记录账户名为SCOTT。 步骤1:在SQL*Plus中登录STUDENT账户,

13、创建如下的记录表LOGS: Sql代码 CREATE TABLE logs( LOG_ID NUMBER(10) PRIMARY KEY, LOG_TABLE VARCHAR2(10) NOT NULL, LOG_DML VARCHAR2(10), LOG_KEY_ID NUMBER(10), LOG_DATE DATE, LOG_USER VARCHAR2(15) ); CREATE TABLE logs(LOG_ID NUMBER(10) PRIMARY KEY,LOG_TABLE VARCHAR2(10) NOT NULL,LOG_DML VARCHAR2(10),LOG_KEY_ID

14、NUMBER(10),LOG_DATE DATE,LOG_USER VARCHAR2(15);执行结果: Sql代码 表已创建。 表已创建。步骤2:创建一个LOGS表的主键序列LOGS_ID_SEQ: Sql代码 CREATE SEQUENCE logs_id_squ INCREMENT BY 1 START WITH 1 MAXVALUE 9999999 NOCYCLE NOCACHE; CREATE SEQUENCE logs_id_squ INCREMENT BY 1START WITH 1 MAXVALUE 9999999 NOCYCLE NOCACHE;执行结果: Sql代码 序列已

15、创建。 序列已创建。步骤3:创建和编译以下触发器: Sql代码 CREATE OR REPLACE TRIGGER DML_LOG BEFORE -触发时间为操作前 DELETE OR INSERT OR UPDATE - 由三种事件触发 ON emp FOR EACH ROW - 行级触发器 BEGIN IF INSERTING THEN INSERT INTO logs VALUES(logs_id_squ.NEXTVAL,EMP,INSERT,:new.empno,SYSDATE,USER); ELSIF DELETING THEN INSERT INTO logs VALUES(log

16、s_id_squ.NEXTVAL,EMP,DELETE,:old.empno,SYSDATE,USER); ELSE INSERT INTO logs VALUES(logs_id_squ.NEXTVAL,EMP,UPDATE,:new.empno,SYSDATE,USER); END IF; END; CREATE OR REPLACE TRIGGER DML_LOGBEFORE -触发时间为操作前DELETE OR INSERT OR UPDATE - 由三种事件触发ON empFOR EACH ROW - 行级触发器BEGINIF INSERTING THENINSERT INTO lo

17、gs VALUES(logs_id_squ.NEXTVAL,EMP,INSERT,:new.empno,SYSDATE,USER);ELSIF DELETING THENINSERT INTO logs VALUES(logs_id_squ.NEXTVAL,EMP,DELETE,:old.empno,SYSDATE,USER);ELSEINSERT INTO logs VALUES(logs_id_squ.NEXTVAL,EMP,UPDATE,:new.empno,SYSDATE,USER);END IF;END;执行结果: 触发器已创建 步骤4:在EMP表中插入记录: Sql代码 INSER

18、T INTO emp(empno,ename,job,sal) VALUES(8001,MARY,CLERK,1000); COMMIT; INSERT INTO emp(empno,ename,job,sal) VALUES(8001,MARY,CLERK,1000);COMMIT;执行结果: Sql代码 已创建1行。 提交完成。 已创建1行。提交完成。步骤5:检查LOGS表中记录的信息: Sql代码 SELECT * FROM LOGS; SELECT * FROM LOGS;执行结果为: Sql代码 LOG_ID LOG_TABLE LOG_DML LOG_KEY_ID LOG_DATE

19、 LOG_USER - - - - - - 1 EMP INSERT 8001 29-3月 -04 STUDENT 已选择 1 行。 LOG_ID LOG_TABLE LOG_DML LOG_KEY_ID LOG_DATE LOG_USER- - - - - -1 EMP INSERT 8001 29-3月 -04 STUDENT已选择 1 行。说明:本例中在emp表上创建了一个由INSERT或DELETE或UPDATE事件触发的行级触发器,触发器的名称是LOG_EMP。对于不同的操作,记录的内容不同。本例中只插入了一条记录,如果用一条不带WHERE条件的UPDATE语句来修改所有雇员的工资,

20、则将逐行触发触发器。 INSERT、DELETE和UPDATE都能引发触发器动作,在分支语句中使用INSERTING、DELETING和UPDATING来区别是由哪种操作引发的触发器动作。 在本例的插入动作中,LOG_ID字段由序列LOG_ID_SQU自动填充为1;LOGS表LOG_KEY_ID字段记录的是新插入记录的主键8001;LOD_DML字段记录的是插入动作INSERT;LOG_TABLE字段记录当前表名EMP;LOG_DATE字段记录插入的时间04年3月1日;LOG_USER字段记录插入者STUDENT。 【练习1】修改、删除刚刚插入的雇员记录,提交后检查LOGS表的结果。 【练习2

21、】为DEPT表创建同样的触发器,使用LOGS表进行记录,并检验结果。 【训练2】 创建一个行级触发器LOG_SAL,记录对职务为CLERK的雇员工资的修改,且当修改幅度超过200时才进行记录。用WHEN条件限定触发器。 在创建触发器之前,需要先创建事件记录表LOGERR,该表用来对操作进行记录。该表的字段含义解释如下: NUM:数值型,用于记录序号。 MESSAGE:字符型,用于记录错误信息。 步骤1:在SQL*Plus中登录STUDENT账户,创建如下的记录表LOGERR: Sql代码 CREATE TABLE logerr( NUM NUMBER(10) NOT NULL, MESSAGE

22、 VARCHAR2(50) NOT NULL ); CREATE TABLE logerr(NUM NUMBER(10) NOT NULL,MESSAGE VARCHAR2(50) NOT NULL);执行结果: Sql代码 表已创建。 表已创建。步骤2:创建和编译以下触发器: Sql代码 CREATE OR REPLACE TRIGGER log_sal BEFORE UPDATE OF sal ON emp FOR EACH ROW WHEN (new.job=CLERK AND (ABS(new.sal-old.sal)>200) DECLARE v_no NUMBER; BEGI

23、N SELECT COUNT(*) INTO v_no FROM logerr; INSERT INTO logerr VALUES(v_no+1,雇员|:new.ename|的原工资:|:old.sal|新工资:|:new.sal); END; CREATE OR REPLACE TRIGGER log_salBEFOREUPDATE OF salON empFOR EACH ROWWHEN (new.job=CLERK AND (ABS(new.sal-old.sal)>200)DECLAREv_no NUMBER;BEGINSELECT COUNT(*) INTO v_no FRO

24、M logerr;INSERT INTO logerr VALUES(v_no+1,雇员|:new.ename|的原工资:|:old.sal|新工资:|:new.sal);END;执行结果: Sql代码 触发器已创建。 触发器已创建。步骤3:在EMP表中更新记录: Sql代码 UPDATE emp SET sal=sal+550 WHERE empno=7788; UPDATE emp SET sal=sal+500 WHERE empno=7369; UPDATE emp SET sal=sal+50 WHERE empno=7876; COMMIT; UPDATE emp SET sal=

25、sal+550 WHERE empno=7788;UPDATE emp SET sal=sal+500 WHERE empno=7369;UPDATE emp SET sal=sal+50 WHERE empno=7876;COMMIT;执行结果: Sql代码 已更新 1 行。 已更新 1 行。 已更新 1 行。 提交完成。 已更新 1 行。已更新 1 行。已更新 1 行。提交完成。步骤4:检查LOGSAL表中记录的信息: Sql代码 SELECT * FROM logerr; SELECT * FROM logerr;执行结果为: Sql代码 NUM MESSAGE - - 1 雇员SMIT

26、H的原工资:800新工资:1300 已选择 1 行。 NUM MESSAGE- -1 雇员SMITH的原工资:800新工资:1300已选择 1 行。 说明:本例中,在emp表的sal列上创建了一个由UPDATE事件触发的行级触发器,触发器的名称是LOG_SAL。该触发器由WHEN语句限定,只有当被修改工资的雇员职务为CLERK,且修改的工资超过200时才进行触发,否则不进行触发。 所以在验证过程中,虽然修改了3条记录,但通过查询语句发现:第一条修改语句修改编号为7788的SCOTT记录,因为SCOTT的职务是ANALYST,不符合WHEN条件,没有引起触发器动作;第二条修改语句修改编号为736

27、9的SMITH的记录,职务为CLERK,因为增加的工资(500)超过了200,所以引起触发器动作,并在LOGERR表中进行了记录;第三条修改语句修改编号为7876的雇员ADAMS的记录,虽然ADAMS的职务为CLERK,但修改的工资(50)没有超过200,所以没有引起触发器动作。 注意:在WHEN条件中引用new和old不需要在前面加“: ”。 在以上实例中,记录了对工资的修改超出范围的信息,但没有限制对工资的修改。那么当对雇员工资的修改幅度不满足条件时,能否直接限制对工资的修改呢?答案是肯定的。 【训练3】 创建触发器CHECK_SAL,当对职务为CLERK的雇员的工

28、资修改超出500至2000的范围时,进行限制。 步骤1:创建和编译以下触发器: Sql代码 CREATE OR REPLACE TRIGGER CHECK_SAL BEFORE UPDATE ON emp FOR EACH ROW BEGIN IF :new.job=CLERK AND (:new.sal<500 OR :new.sal>2000) THEN RAISE_APPLICATION_ERROR(-20001, 工资修改超出范围,操作取消!); END IF; END; CREATE OR REPLACE TRIGGER CHECK_SALBEFOREUPDATEON e

29、mpFOR EACH ROWBEGINIF :new.job=CLERK AND (:new.sal<500 OR :new.sal>2000) THENRAISE_APPLICATION_ERROR(-20001, 工资修改超出范围,操作取消!);END IF;END;执行结果: Sql代码 触发器已创建。 触发器已创建。步骤2:在EMP表中插入记录: Sql代码 UPDATE emp SET sal=800 WHERE empno=7876; UPDATE emp SET sal=450 WHERE empno=7876; COMMIT; UPDATE emp SET sal=800 WHERE empno=7876;UPDATE emp SET sal=450

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1