数据库触发器的分类和区别

数据库触发器的分类和区别
数据库触发器的分类和区别

Oracle触发器的分类和使用

摘要:在Oracle中,触发器是一种特殊的存储过程,它在发生某种数据库事件时由Oracle 系统自动触发。触发器通常用于加强数据的完整性约束和业务规则等,对于表来说,触发器可以实现比CHECK约束更为复杂的约束。本文介绍了Oracle触发器的概念,功能,优缺点,组成等方面。详细解读了Oracle触发器在各方面的应用并配合相关实例。

关键字:Oracle、触发器、介绍、应用

一、触发器的介绍

1.1 触发器的概念

在Oracle中,触发器是一种特殊的存储过程,它在发生某种数据库事件时由Oracle系统自动触发发器,通常用于加强数据的完整性约束和业务规则等。

触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的,而是由一个事件来启动运行。即触发器是当某个时间发生时自动地隐式运行。

1.2 触发器的功能

●允许/限制对表的修改

●自动生成派生列,比如自增字段

●强制数据一致性

●提供审计和日志记录

●防止无效的事务处理

●启用复杂的业务逻辑

1.3 触发器的优缺点

优点:触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用CHECK 约束定义的约束更为复杂的约束。与CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDA TE 或DELETE)允许采取多个不同的对策以响应同一个修改语句。

缺点:触发器功能强大,轻松可靠地实现许多复杂的功能,但是它也具有一些缺点那就是由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作。同时规则、约束、缺省值也是保证数据完整性的重要保障。如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程序。

1.4 触发器的组成

1. 触发事件:引起触发器被触发的事件。例如:DML语句(INSERT, UPDATE, DELETE 语句对表或视图执行数据处理操作)、DDL语句(如CREATE、ALTER、DROP语句在数据库中创建、修改、删除模式对象)、数据库系统事件(如系统启动或退出、异常错误)、用户事件(如登录或退出数据库)。

2. 触发时间:即该TRIGGER是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER的操作顺序。

3. 触发操作:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。例如:PL/SQL块。

4. 触发对象:包括表、视图、模式、数据库。只有在这些对象上发生了符合触发条件的触发事件,才会执行触发操作。

5. 触发条件:由WHEN子句指定一个逻辑表达式。只有当该表达式的值为TRUE时,遇到触发事件才会自动执行触发器,使其执行触发操作。

6. 触发频率:说明触发器内定义的动作被执行的次数。即语句级(STA TEMENT)触发器和行级(ROW)触发器。

1.5 触发器触发次序

I.执行BEFORE语句级触发器;

II.对与受语句影响的每一行

●执行BEFORE行级触发器

●执行DML语句

●执行AFTER行级触发器

I.执行AFTER语句级触发器

二、触发器的种类

Oracle中的触发器的类型主要有DML触发器、替代触发器、系统事件触发器和DDL 触发器。

2.1 DML触发器

DML触发器由DML语句触发,例如INSERT、UPDA TE和DELETE语句。针对所有的DML事件,按触发的时间可以将DML触发器分为BEFORE触发器与AFTER触发器,分别表示在DML事件发生之前与之后采取行动。另外,DML触发器也可以分为语句级触发器与行迹触发器,其中,语句级触发器针对某一条语句触发一次,而行级触发器则针对语句所影响的每一行都触发一次。例如:某条UPDA TE语句修改了表中的100行数据,那么针对该UPDA TE事件的语句级触发器将被触发一次,而行级触发器将被触发100次。

例1: 建立一个触发器, 当职工表emp 表被删除一条记录时,把被删除记录写到职工表删除日志表中去。

CREATE TABLE emp_his AS SELECT * FROM EMP WHERE 1=2;

CREATE OR REPLACE TRIGGER tr_del_emp

BEFORE DELETE --指定触发时机为删除操作前触发

ON scott.emp

FOR EACH ROW --说明创建的是行级触发器

BEGIN --将修改前数据插入到日志记录表del_emp,以供监督使用。

INSERT INTO emp_his(deptno , empno, ename , job ,mgr , sal , comm , hiredate )

V ALUES( :old.deptno, :old.empno, :old.ename , :old.job,:old.mgr, :old.sal, :https://www.360docs.net/doc/6d7261212.html,m, :old.h iredate );

END;

--测试触发器

DELETE emp WHERE empno=7788;

DROP TABLE emp_his;

DROP TRIGGER del_emp;

2.2 替代触发器

INSTEAD OF触发器又称为替代触发器,用于执行一个替代操作来代替触发事件的操作。例如:针对INSERT事件的INSTEAD OF触发器,它由INSERT语句触发,当出现INSERT 语句时,该语句不会被执行,而是执行INSTEAD OF触发器中定义的语句。

创建INSTEAD OF触发器需要注意以下几点:

●只能被创建在视图上,并且该视图没有指定WITH CHECK OPTION选项。

●不能指定BEFORE 或AFTER选项。

●FOR EACH ROW子可是可选的,即INSTEAD OF触发器只能在行级上触发、或只能是

行级触发器,没有必要指定。

●没有必要在针对一个表的视图上创建INSTEAD OF触发器,只要创建DML触发器就可

以了。

2.3 系统事件触发器

系统事件触发器在发生如数据库启动或者关闭等系统事件时触发,包括数据库服务器的启动或关闭,用户的登录与退出、数据库服务错误等。

例2:创建登录、退出触发器。

CREATE TABLE log_event

(user_name V ARCHAR2(10),

address V ARCHAR2(20),

logon_date timestamp,

logoff_date timestamp);

--创建登录触发器

CREATE OR REPLACE TRIGGER tr_logon

AFTER LOGON ON DA TABASE

BEGIN

INSERT INTO log_event (user_name, address, logon_date)

V ALUES (ora_login_user, ora_client_ip_address, systimestamp);

END tr_logon;

--创建退出触发器

CREATE OR REPLACE TRIGGER tr_logoff

BEFORE LOGOFF ON DA TABASE

BEGIN

INSERT INTO log_event (user_name, address, logoff_date)

V ALUES (ora_login_user, ora_client_ip_address, systimestamp);

END tr_logoff;

2.4 DDL触发器

DDL触发器由DDL语句触发,例如:CREA TE、ALTER和DROP语句。DDL触发器同样可以分为BEFORE触发器与AFTER触发器。

三、触发器的应用

Oracle触发器一般应用在以下方面:

3.1 确保数据库的安全性

●可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据。

●可以基于数据库中的数据限制用户的操作,例如不允许价格的升幅一次超过10%。

3.2 实施复杂的安全性授权

●利用触发器控制实体的安全性,可以将权限藉于各种数据库的值。

3.3 提供复杂的审计功能

●审计用户操作数据库的语句。

●把用户对数据库的更新写入审计表。

3.4 维护不同数据库之间同步表

●在不同的数据库之间可以利用快照来实现数据的复制,但有些系统要求两个数据库数据

实时同步,就必须利用触发器从一个数据库中向另一个数据库复制数据。

3.5 实现复杂的数据完整性规则

●实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不

同,触发器可以引用列或数据库对象。

●提供可变的缺省值。

3.6 实现复杂的非标准的数据库相关完整性规则

●触发器可以对数据库中相关的表进行连环更新。例如,在auths表author_code列上的

删除触发器可导致相应删除在其它表中的与之匹配的行。

●触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。当

插入一个与其主健不匹配的外部键时,这种触发器会起作用。

四、编写触发器注意事项

●触发器不接受参数。

●一个表上最多可有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一

个。并各触发器之间不能有矛盾。

●在一个表上的触发器越多,对在该表上的DML操作的性能影响就越大。

●触发器最大为32KB。若确实需要,可以先建立过程,然后在触发器中用CALL语句进

行调用。

●在触发器的执行部分只能用DML语句(SELECT、INSERT、UPDATE、DELETE),

不能使用DDL语句(CREATE、ALTER、DROP)。

●触发器中不能包含事务控制语句(COMMIT,ROLLBACK,SAVEPOINT)。因为触发器

是触发语句的一部分,触发语句被提交、回退时,触发器也被提交、回退了。

●在触发器主体中调用的任何过程、函数,都不能使用事务控制语句。

●在触发器主体中不能申明任何Long和blob变量。新值new和旧值old也不能向表中的

任何long和blob列。

●不同类型的触发器(如DML触发器、INSTEAD OF触发器、系统触发器)的语法格式和

作用有较大区别。

●触犯器声明变量赋值方式和dephi类似,使用:= 符号来赋值。新值new, 旧值old前面

不要忘记:符号。

参考文献

[1] 《Oracle11g 数据库应用简明教程》, 杨少敏王红敏, 清华大学出版社, 2010

[2] 《Oracle触发器在信息系统安全方面的应用》, 谢梅源, 温州职业技术学院学报, 2004

[3] 《基于Oracle数据库存储过程与触发器的应用》, 刘小生张世良, 江西有色金属, 2007

[4] 《Oracle中特殊类型触发器的使用》, 王二暖, 华南金融电脑应用技术, 2007

[5] 《Oracle数据库触发器及其应用》, 王杰文李赫男, 计算机应用研究, 2001

[6] 《Oracle触发器的功能与应用》, 梁桦, 北京电脑技术应用研究所, 2004

SQL Server2008触发器学习笔记

触发器 一﹕触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。 二﹕SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。这两个表由系统来维护﹐它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行完成后﹐与该触发器相关的这两个表也被删除。Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。 三﹕Instead of 和After触发器 SQL Server提供了两种触发器﹕Instead of 和After 触发器。 这两种触发器的差别在于他们被激活的操作﹕ Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外﹐Instead of 触发器也可以用于视图﹐用来扩展视图可以支持的更新操作。 After触发器在一个Insert,Update或Deleted语句之后执行﹐进行约束检查等动作都在After 触发器被激活之前发生。After触发器只能用于表。一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器﹐一个表的每个修改动作都可以有多个After触发器。 INSTEAD OF触发器被用于更新那些没有办法通过正常方式更新的视图。通常不能在一个基于连接的视图上进行DELETE操作,可以编写一个INSTEAD OF DELETE触发器来实现删除。可以访问那些如果视图是一个真正的表时已经被删除的数据行,它将把删除的行存储在deleted临时表中。 本次练习将通过具体的例子介绍如何使用INSTEAD OF触发器,使读者掌握INSTEAD OF 触发器的使用方法。 向student表中插入数据时,检查学号是否存在于student表中,如存在则进行插入操作,否则就不插入,具体语句如下所示: CREATE TRIGGER [checkid] ON dbo.student INSTEAD OF insert AS IF NOT EXISTS(SELECT * FROM dbo.student WHERE ID=(SELECT ID FROM INSERTED)) BEGIN ROLLBACK TRANSACTION PRINT '要处理记录的学号不存在!' END ELSE BEGIN INSERT NTO dbo.student select * from inserted

数据库原理课程设计报告报告实验创建存储过程与触发器

存储过程与触发器实验日期和时间: 2016 年 5 月13 日、星 期 五第节 实验室:DJ2-信息管理实验室 班级:学号:姓名: 实验环境: 1.硬件:笔记本电脑 2.软件:SQL Server 2012 实验原理: 存储过程概念:存储过程是事先编好的,存储在数据库中的一组被编译了的T-SQL命令集合,这些命令用来完成对数据库的指定操作。存储过程可以接受用户的输入参数、向客户端返回表格或标量结果和消息、调用数据定义语言(DDL)和数据操作语言(DML)语句,然后返回输入参数。 触发器概念:触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 实验任务: 此作业成绩得分根据你完成的任务的难度和数量评分,完成后在实验室给老师演示验收,课后提交电子版报告。如额外完成自拟题目应当事先将所拟题目提交给老师或在报告中明确标注题意。 假定有学校的图书馆管理信息系统,可以用于日常管理书库和同学们的借还书工作。 以下列出参考的库表情况: 根据管理的业务需求来分析,该管理信息系统的数据库应至少包括如下数据表:(打★号的是必须有的表) 1.★图书现有库存表。作用:记录图书的现有库存情况。至少包括:书号、书名、 作者、简介、类别、价格、出版社、出版日期、现有库存数量、最小库存量、库 存总量、库存位置等。 2.★读者信息表。作用:记录读者信息。至少包括:读者编号、证件类型、证件号 码、姓名、性别、职业(可填写教师、学生、教工、其它……)、所属单位、地址、 联系电话等。 3.★借书记录表。作用:记录借书情况,以及是否归还。至少包括:借阅ID(主键, 可设置为自动编号)、书号、读者编号、借阅数量、借阅日期、是否归还、管理员 编号……等。 4.★还书记录表。作用:记录还书情况。至少包括:还书ID(主键,可设置为自动 编号)、书号、读者编号、归还数量、归还日期、是否超期(超过假设45天为超 期)、超期天数、管理员编号……等。(附:为简化操作,续借可视为归还后再借)。 5.管理员信息表。作用:记录负责管理书库和借书还书工作的管理员信息。至少包 括:管理员编号、职工编号(在职工档案表中的职工编号)、用户名、密码、管理

数据库原理实验报告S11-数据库触发器的创建

实验11 数据库触发器的建立 实验日期和时间:2014.11.28 实验室:软件工程室 班级:12计科3 学号:20124122 姓名:张翔 实验环境: 1.硬件:内存4.00GB 处理器 2.50Hz 2.软件:Windows 7旗舰版Microsoft SQL Server 2005 实验原理: 1.理解触发器的概念、和一般存储过程的区别、触发器的优点和使用原则。 2.掌握触发器的创建、执行、查看、修改和删除方法。 一、触发器的概念: 触发器是一种特殊类型的存储过程。一般的存储过程通过存储过程名称被直接调用,而触发器主要是通过当某个事件发生时自动被触发执行的。触发器可以用于SQL Server约束、默认值和规则的完整性检查,还可以完成难以用普通约束实现的复杂功能。 当创建数据库对象或在数据表中插入记录、修改记录或者删除记录时,SQL Server就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合由这些SQL语句所定义的规则。触发器和引起触发器执行的SQL语句被当作一次事务处理,如果这次事务未获得成功,SQL Server会自动返回该事务执行前的状态。 使用触发器有以下优点: ?触发器是自动的执行的,。 ?触发器可以通过数据库中的相关表进行层叠更改,如可以在“学生表”中的学号列上创建一个删除触发器,当删除“学生表”的记录时,自动级联删除“成绩表”中的个匹配行。 ?触发器可以强制限制。这些限制比用CHECK约束所定义的更复杂,与CHECK约束不同的是,触发器可以引用其他表中的列。 触发器可以分为DML触发器和DDL触发器两种 ?DDL触发器用于响应各种数据定义语言(DDL) 事件。这些事件主要对应于Transact-SQL 中的CREATE、ALTER 和DROP 语句,以及执行类似DDL 操作的某些系统存储过程。它们用于执行管理任务,并强制影响数据库的业务规则。 ?DML触发器是在用户使用数据操作语言(DML) 事件编辑数据时发生。DML 事件是针对表或视图的INSERT、UPDATE 或DELETE 语句。DML触发器有助于在表或视图中修改数据时强制业务规则,扩展数据完整性。 DML触发器又分为AFTER触发器和INSTEAD OF触发器两种: ?AFTER触发器:这种类型的触发器将在数据变动(INSERT、UPDA TE和DELETE 操作)完成以后才被触发。可以对变动的数据进行检查,如果发现错误,将拒绝接受或回滚变动的数据。AFTER触发器只能在表上定义。在同一个数据表中可以创建多个AFTER触发器。 ?INSTEAD OF触发器:INSTEAD OF触发器将在数据变动以前被触发,并取代变动数据的操作,而去执行触发器定义的操作。INSTEAD OF触发器可以在表或视图上定义。每个INSERT、UPDATE和DELETE语句最多定义一个INSTEAD OF触发器。 二、创建触发器

SQL触发器基本教程

一、创建一个简单的触发器 触发器是一种特殊的存储过程,类似于事件函数,SQL Server? 允许为INSERT、UPDATE、DELETE 创建触发器,即当在表中插入、更新、删除记录时,触发一个或一系列T-SQL语句。触发器可以在查询分析器里创建,也可以在表名上点右键->“所有任务”->“管理触发器”来创建,不过都是要写T-SQL 语句的,只是在查询分析器里要先确定当前操作的数据库。 创建触发器用CREATE TRIGGER CREATE TRIGGER 触发器名称 ON 表名 FOR I NSERT、UPDATE 或DELETE AS T-SQL 语句 注意:触发器名称是不加引号的。 如下是联机丛书上的一个示例,当在titles 表上更改记录时,发送邮件通知MaryM。CREATE TRIGGER reminder ON titles FOR INSERT, UPDATE, DELETE AS EXEC master..xp_sendmail 'MaryM', 'Don''t forget to print a report for the distributors.' 二、删除触发器 用查询分析器删除 在查询分析器中使用drop trigger 触发器名称来删除触发器。 也可以同时删除多个触发器:drop trigger 触发器名称,触发器名称... 注意:触发器名称是不加引号的。在删除触发器之前可以先看一下触发器是否存在: if Exists(select name from sysobjects where name=触发器名称and xtype='TR') 用企业管理器删除 在企业管理器中,在表上点右键->“所有任务”->“管理触发器”,选中所要删除的触发器,然后点击“删除”。 三、重命名触发器 用查询分析器重命名 exec sp_rename 原名称, 新名称 sp_rename 是SQL Server? 自带的一个存储过程,用于更改当前数据库中用户创建的对象的名称,如表名、列表、索引名等。

数据库系统实验报告 触发器

实验4 触发器 1、通过序列和触发器实现借阅表中借阅流水号字段的自动递增。 Create or replace sequence bwnum_id Minvalue 1 Maxvalue 1.0E28 Start with 1 Increment by 1 Cache 20; Create or Replace Trigger tri_bwnum_id Before Insert On borrow For Each Row Begin Select bwnum_id.Nextval Into :new.bwnum From DUAL; End;

2、通过序列和触发器实现预约表中预约流水号字段的自动递增 Create sequence pnum_id Minvalue 1 Maxvalue 1.0E28 Start with 1 Increment by 1 Cache 20; Create or Replace Trigger tri_pnum_id Before Insert On preborrow For Each Row Begin Select pnum_id.Nextval Into :new.pnum From DUAL; End;

3、修改实验三借书功能的存储过程。 该存储过程要求: (1)借书时输入借书证号,图书编号。(即该函数有2个输入参数) (2)借书时,借书日期为系统时间。 *该存储过程主体部分只有insert into语句。 create or replace Procedure p_borrow (P_BNUM IN BORROW.BNUM%TYPE, P_RNUM IN BORROW.RNUM%TYPE) as begin insert into BORROW (BNUM,RNUM,BDATE) values(P_BNUM,P_RNUM,TO_CHAR(SYSDATE(),'YY/MM/DD')); commit; end; 4、建立与借书存储过程相对应的触发器,当借阅表中加入借阅信息时,该触发器触发,自动修改所借图书的是否借出改为‘是’。 Create or Replace Trigger tri_borrow_insert

SQL触发器全过程(含实例讲解)

SQL触发器全过程 第一、概述 一:触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约`束。 二: SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted 表。这两个表由系统来维护,它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行完成后,与该触发器相关的这两个表也被删除。 Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。 Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。 三:instead of 和 After触发器 SQL Server2000提供了两种触发器:Instead of 和After 触发器。这两种触发器的差别在于他们被激活的同: Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外,Instead of 触发器也可以用于视图,用来扩展视图可以支持的更新操作。 After触发器在一个Insert,Update或Deleted语句之后执行,进行约束检查等动作都在After触发器被激活之前发生。After触发器只能用于表。

一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器,一个表的每个修改动作都可以有多个After触发器。 四:触发器的执行过程 如果一个Insert﹑update或者delete语句违反了约束,那幺After触发器不会执行,因为对约束的检查是在After触发器被激动之前发生的。所以After 触发器不能超越约束。 Instead of 触发器可以取代激发它的操作来执行。它在Inserted表和Deleted表刚刚建立,其它任何操作还没有发生时被执行。因为Instead of 触发器在约束之前执行,所以它可以对约束进行一些预处理。 五:使用T-SQL语句来创建触发器 基本语句如下: create trigger trigger_name on {table_name | view_name} {for | After | Instead of } [ insert, update,delete ] as sql_statement

SQL触发器实例讲解

SQL触发器实例讲解 SQL 资料2009-07-23 14:44:07 阅读6072 评论9 字号:大中小订阅 定义:何为触发器?在SQL Serv er里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。 常见的触发器有三种:分别应用于Insert , Update , Delete 事件。 我为什么要使用触发器?比如,这么两个表: Create Table Student( --学生表 StudentID int primary key, --学号 .... ) Create Table BorrowRecord( --学生借书记录表 BorrowRecord int identity(1,1), --流水号 StudentID int , --学号 BorrowDate datetime, --借出时间 ReturnDAte Datetime, --归还时间 ... ) 用到的功能有: 1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号); 2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。 等等。 这时候可以用到触发器。对于1,创建一个Update触发器: Create Trigger truStudent On Student --在Student表中创建触发器 f or Update --为什么事件触发 As --事件触发后所要做的事情 if Update(StudentID) begin Update BorrowRecord Set StudentID=i.StudentID From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted临时表 Where br.StudentID=d.StudentID end

数据库存储器与触发器实验报告

南昌航空大学实验报告 二0 一七年5月 3 日 课程名称:数据库概论实验名称:存储器与触发器 班级: XX 姓名:XXX 同组人: X 指导教师评定:签名: 一、实验环境 1. Windows2000或以上版本; 2. SQLServer2000 或2005。 二、实验目的 1. 掌握存储过程的创建,修改,使用,删除; 2. 掌握触发器的创建,修改,使用,删除。 三、实验步骤及参考源代码 1.创建过程代码: CREATEPROCEDURE_P_Proc( @ccna varchar (10), @cnochar(4) OUTPUT@cnavarchar (10) OUTPUT@Pna varchar (20) OUTPUTSnumint OUTPUT AS SELECT@cna=cna, @cn(=cp. eno, @pnapna, @numnum FROMtp , customer, paper WHEREustomer . eno=cp. eno ANRaper . pno=cp. pno ANDcna =@ccna

6.执行存储过程C_P_Pro,实现对李涛,钱金浩等不同顾客的订阅信息 查询 execute C_P_Proc @nam=e' 李涛' execute C_P_Proc @nam=e' 钱金浩' 7,删除存储过程C_P_Prcc DROPPROCEDURCE_P_PROC (4)在DingBao数据库中针对PAPEF创建插入触发器TR_PAPER_I删除触发器TR_PAPER_D修改触发器TR_PAPER。具体要求如下。 <1>对PAPER勺插入触发器:插入报纸记录,单价为负值或为空时,设定为10 元。 CREATE TRIGGER TR_PAPER_I ON paper FOR INSERT AS DECLARE @ippr FLOAT; declare @ipno int; SELECT @ippr=ppr,@ipno=pno from inserted begin if @ippr<0 or @ippr is NULL begin raiserror(' 报纸的单价为空或小于零!',16,1)

数据库触发器机制的设计与实现

数据库触发器机制的设计与实现 摘要:根据当前数据库应用需求和技术发展现状,研究了数据库管理系统管理系统触发器机制实现的关键技术问题,并以GKD-BaseGKD-Base为原型,在已有的GKD-Base PL/SQL 引擎基础上实现了数据库的触发器功能。关键词: PL/SQL引擎 Rete网络双Hash结构触发器 数据库管理系统作为信息系统的核心部件,在信息化时代所充当的角色是其它任何软件所不能替代的。当前数据库应用的一个普遍要求是数据库管理系统能够在一些数据库相关事件发生时触发预先定义的操作,实现信息管理的自动化,因此引进了触发器机制。触发器可以增强引用完整性,加强复杂业务的规则,或者监控数据库的变动,并执行一定的数据操作。触发器机制实现主要涉及触发事件的检测以及触发条件的判决等关键技术问题,以及对触发器的编译存储和调用执行等具体操作。本文以国产数据库管理系统GKD-Base为原型,在兼容Oracle 规范的PL/SQL引擎基础上,提出一套解决方案,对触发器的关键技术问题进行了探讨,并设计实现了数据库的触发器机制,扩展了数据库管理系统GKD-Base的功能。1 GKD-Base PL/SQL 引擎GKD-BASE数据库是一个具有自主知识产权的数据库管理系统,具有兼容SQL89标准的SQL引擎,能够为用户提供一个统一、有效的数据库访问接口(XAPI),实现对数据库的各种操作。为了融合SQL语言强大的集合数据处理能力处理能力和第三代语言(3GL)灵活的过程处理能力,在GKD-Base上已初步实现了兼容Oarcle PL/SQL V.23的PL/SQL引擎。GKD-Base PL/SQL引擎包括编译器、解释器和异常处理三个模块。在编译阶段,根据PL/SQL语言兼有过程式语句和SQL语句的特点,采取分而治之策略,把过程语句和SQL语句分开处理。对于SQL语句,编译器首先建立SQL语句结点,进行相应的变量绑定和语法检查;检查无误后产生语法树形式的中间代码。对于过程语句,编译器将对语句成分进行语法分析,对声明的变量和数据类型建立相应的符号表,最终产生语法树形式的中间代码。解释器的作用是对编译器生成的中间代码进行解释执行。解释器与编译器对应,具有相对独立的SQL语句解释模块和过程语句解释模块。另外,解释器还包括执行状态堆栈的管理、与GKD-Base SQL引擎的调用接口。异常处理模块主要实现程序运行时的错误检查和报告,并支持用户自定义异常和预定义异常的检查和处理。GKD-Base PL/SQL引擎可以实现对过程式语句、SQL语句与游标、存储子程序及包的编译和解释执行。2 触发器实现的关键问题触发器定义了当某些数据库相关事件发生时数据库应采取的动作。触发器可增强引用完整性,加强复杂业务的规则,或者监控数据库的变动,其实现主要涉及到触发事件的检测以及触发条件的判决等关键技术问题。2.1 触发器的事件检测机制触发器事件检测机制包括对事件的检测和存储,是实现触发器的关键。触发器检测的事件类型比较简单,基本事件主要包括对数据的插入、删除以及更新等。GKD-Base的触发器在对事件检测时,直接在相关事件发生的前后调用检测函数截获并分析事件消息,以确定是否对触发器点火。触发器事件检测机制实现的关键在于对触发事件的存储。触发事件具有时间顺序,因此存储时也必须按照严格的时间顺序进行存储。综合比较各个商用和实验数据库系统的事件表存储机制,选择了Starburst的双的双HASH链表存储机制,如图1。 这里,变迁表分为两种类型:NEW和OLD,分别对应于触发器行级别操作中的NEW值和OLD值。变迁表中存储了事件类型、当前数据表以及事件作用的元组。系统可以通过这个驻留内存的双HASH链表实现数据库变迁的快速定位和跟踪处理。2.2 触发器的条件判决机制触发器的条件判决机制是触发器的核心,根据SQL99标准的定义,可以将触发器分为前触发、约束判定和后触发三种类型。这三种类型触发器的判决顺序策略如图2。 触发器的条件评估是影响触发器机制的最关键因素。在数据库环境中,大多数数据修改行为只能影响数据库的一小部分内容,因此没必要每次都从头开始评估触发器规则条件,Rete

数据库建立触发器

江西理工大学应用科学学院 数据库技术及应用实验报告 实验名称SQL数据库存储过程及触发器的创建 日期2012、4、2 专业班级电子商务091班 实验人阳东学号40号 实验要求: 1、用T-SQL语言创建名为查看课程成绩的存储过程: 输入任一课程名,则显示课程、编号、名称、教师编号、学生的学号以及 对应课程成绩。 2、用T-SQL语言创建触发器: 当对表插入数据时,性别只为男or女,否则弹出错误提示框。 实验目的: 学会使用T-SQL语言创建数据库存储过程以及触发器。 实验内容及步骤: 一、创建存储过程: 1、启动SQL Server企业管理器。 2、在“控制台根目录”窗口左边窗格中,展开“SQL Server组”→“数据库” 结点,然后建立“英才大学信息管理系统”数据库。 3、在数据库中建立相应的表“课程名、成绩表”,并在两个表中键入相应的 内容。 4、选择“朱虹美”数据库,然后点击工具中的“SQL查询分析器”菜单命令 ,进入“查询分析器”窗口。 5、在“查询分析器”窗口,输入并执行如下命令: CREATE PROC 查看课程成绩@课程名char(12) AS SELECT 课程.课程编号,课程.课程名称,课程.教师编号,成绩.学号,成绩.成绩 FROM 课程INNER JOIN 成绩ON 课程.课程编号=成绩.课程编号 WHERE 课程.课程名称=@课程名 结果如图所示: 然后再次进入“查询分析器”窗口,执行存储过程,有三种方法: 1)EXEC 查看课程成绩@课程名='软件工程' 2)EXEC 查看课程成绩数据库原理

3) Declare @X char(12) EXEC @X=查看课程成绩'程序设计' 二、创建触发器。 1、启动SQL Server企业管理器。 2、在“控制台根目录”窗口左边窗格中,展开“SQL Server组”→“数据库” 结点,点击“英才大学信息管理系统”数据库。 3、在数据库中建立相应的表“学生”,并在表中键入相应的内容。 4、选择“英才大学信息管理系统”数据库,然后点击工具中的“SQL查询分析器” 菜单命令进入“查询分析器”窗口。 5、在“查询分析器”窗口,输入并执行如下命令: CREATE TRIGGER Trigger_学生_性别ON 学生 FOR INSERT AS IF EXISTS(SELECT*FROM 学生WHERE 性别NOT IN('男','女')) BEGIN RAISERROR('请输入合法的姓名!',16,1) ROLLBACK TRANSACTION END 建立触发器完毕。 然后在表中添加不符合规格的数据,则显示错误提示框:

数据库原理游标及触发器实验

《数据库原理》实验报告要求 报告的主要内容 一、实验目的 根据各实验项目的实验目的撰写,具体在附件中给出。 二、实验环境 操作系统:Windows XP,数据库管理系统(DBMS):SQL Server2008 三、实验要求 根据各实验项目要求撰写,具体在附件中给出。 四、实验内容及完成情况 自己所完成的内容,进行了哪些操作、编写了哪些程序及执行后的结果,包括一些错误结果及解决办法等。 五、实验体会 具体要求 1、 本实验属综合性实验,要使用学校统一的报告纸,附加纸张要 挟在报告纸内并左侧装订; 2、 报告纸的封面要填写完整,项目要与实验日历中的项目完全一 致,否则将返回重写; 3、 报告第四项“实验内容及完成情况”中,只允许对操作结果和 程序运行结果进行打印,其余内容必须用钢笔或水性笔书写, 报告要整洁; 4、 严禁出现雷同报告,如果出现雷同,雷同报告的所有学生本次实 验将作不及格或最低分处理。如果出现不及格实验项目将取消考 试资格。

实验目的及要求 实验三、存储过程及游标 实验目的: 综合运用程序设计和数据结构,使用游标完成具有较完整功能的存储过程。 实验要求: 根据所给的excel表格,完成实验内容。 说明:“招生表”中部分属性保存的是代码值,请按所给代码表完成如下要求。 1.使用SQL语句创建数据库,并在数据库中完成表的创建。(报告中要分析各个表的主键和外键是什么) 创建数据库studentManage

2.写一个存储过程,功能是查询所有招生信息。使用游标完成逐行输出,每行要有行号。(在查询结果中,要求各类代码要替换成具体的文字信息,例如:政治面貌不要显示“01”,而要显示“中共党员”。)

数据库触发器的分类和区别

Oracle触发器的分类和使用 摘要:在Oracle中,触发器是一种特殊的存储过程,它在发生某种数据库事件时由Oracle 系统自动触发。触发器通常用于加强数据的完整性约束和业务规则等,对于表来说,触发器可以实现比CHECK约束更为复杂的约束。本文介绍了Oracle触发器的概念,功能,优缺点,组成等方面。详细解读了Oracle触发器在各方面的应用并配合相关实例。 关键字:Oracle、触发器、介绍、应用 一、触发器的介绍 1.1 触发器的概念 在Oracle中,触发器是一种特殊的存储过程,它在发生某种数据库事件时由Oracle系统自动触发发器,通常用于加强数据的完整性约束和业务规则等。 触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的,而是由一个事件来启动运行。即触发器是当某个时间发生时自动地隐式运行。 1.2 触发器的功能 ●允许/限制对表的修改 ●自动生成派生列,比如自增字段 ●强制数据一致性 ●提供审计和日志记录 ●防止无效的事务处理 ●启用复杂的业务逻辑 1.3 触发器的优缺点 优点:触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用CHECK 约束定义的约束更为复杂的约束。与CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDA TE 或DELETE)允许采取多个不同的对策以响应同一个修改语句。 缺点:触发器功能强大,轻松可靠地实现许多复杂的功能,但是它也具有一些缺点那就是由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作。同时规则、约束、缺省值也是保证数据完整性的重要保障。如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程序。 1.4 触发器的组成

SQLServer-触发器使用实例

SQLServer-触发器使用实例

SQLServer 触发器使用实例 触发器是一个特殊的存储过程。 常见的有三种:分别应用于Insert , Update , Delete 事件。 一、Trigger语法: create trigger tr_name on table/view {for | after | instead of } [update][,][insert][,][delete] [with encryption] as {batch | if update (col_name) [{and|or} update (col_name)] } 说明: 1 tr_name :名称 2 on table/view :触发器所作用的表。一个触发器只能作用于一个表 3 for 和after :同义 4 after 与instead of :sql 2000新增项目afrer 与 instead of 的区别 After 在触发事件发生以后才被激活,只可以建立在表上 Instead of 代替了相应的触发事件而被执行,既可以建立在表上也可以建立在视图上

5 insert、update、delete:激活触发器的三种操作,可以同时执行,也可选其一 6 if update (col_name):表明所作的操作对指定列是否有影响,有影响,则激活触发器。此外,因为delete 操作只对行有影响, 所以如果使用delete操作就不能用这条语句了(虽然使用也不出错,但是不能激活触发器,没意义)。 7 触发器执行时用到的两个特殊表:deleted ,inserted deleted 和inserted 可以说是一种特殊的临时表,是在进行激活触发器时由系统自动生成的,其结构与触发器作用的表结构是一 样的,只是存放的数据有差异。 二、实例: 实例1(注意这里的关联,条件是如何关联,update中set的值是与谁关联。这些都可以从【触发器的两个临时表:inserted、deleted】中得到答案) 比如,这么两个表: Create Table Student( --学生表 StudentID int primary key, --学号 StudentName varchar(50),姓名 ) Create Table BorrowRecord( --学生借书记录表 BorrowRecord int identity(1,1), --流水号

数据库触发器的应用实例

8.5 数据库触发器的应用举例 例1:创建一个DML语句级触发器,当对emp表执行INSERT, UPDATE, DELETE 操作时,它自动更新dept_summary 表中的数据。由于在PL/SQL块中不能直接调用DDL语句,所以,利用ORACLE内置包DBMS_UTILITY中的EXEC_DDL_STATEMENT过程,由它执行DDL语句创建触发器。 CREATE TABLE dept_summary( Deptno NUMBER(2), Sal_sum NUMBER(9, 2), Emp_count NUMBER); INSERT INTO dept_summary(deptno, sal_sum, emp_count) SELECT deptno, SUM(sal), COUNT(*) FROM emp GROUP BY deptno; --创建一个PL/SQL过程disp_dept_summary --在触发器中调用该过程显示dept_summary标中的数据。 CREATE OR REPLACE PROCEDURE disp_dept_summary IS Rec dept_summary%ROWTYPE; CURSOR c1 IS SELECT * FROM dept_summary; BEGIN OPEN c1; FETCH c1 INTO REC; DBMS_OUTPUT.PUT_LINE('deptno sal_sum emp_count'); DBMS_OUTPUT.PUT_LINE('-------------------------------------'); WHILE c1%FOUND LOOP DBMS_OUTPUT.PUT_LINE(RPAD(rec.deptno, 6)|| To_char(rec.sal_sum, '$999,999.99')|| LPAD(rec.emp_count, 13)); FETCH c1 INTO rec; END LOOP; CLOSE c1; END; BEGIN DBMS_OUTPUT.PUT_LINE('插入前'); Disp_dept_summary(); DBMS_UTILITY.EXEC_DDL_STATEMENT(' CREATE OR REPLACE TRIGGER trig1 AFTER INSERT OR DELETE OR UPDATE OF sal ON emp BEGIN DBMS_OUTPUT.PUT_LINE(''正在执行trig1 触发器…''); DELETE FROM dept_summary;

数据库触发器(非常好,力荐)

数据库触发器实例 一、课堂演示案例 例一:创建一个简单的insert触发器 先创建一个数据库备用 create database sampledb go use sampledb go 在新创建的库中创建一个表备用 create table aa ( a int, b int ) go 在新创建的表上创建一个insert触发器 use sampledb go if exists(select name from sysobjects where name ='tr_intoa' and type='tr') drop trigger tr_intoa go create trigger tr_intoa on aa for insert as print 'success inserted one row!' 查看这个触发器的定义文本 sp_helptext checkpubdate 查看这个触发器的信息 sp_help checkpubdate 验证这个触发器的工作情况

insert into aa values (1,2) ---------------------------------------------------------------------------------------------------------------------- 例二:创建一个触发器监视insert操作,若插入的记录中版权费超过30,则提示用户,并回滚此操作。 use pubs go if exists(select name from sysobjects where name ='CheckRoyalty' and type='tr') drop trigger CheckRoyalty go create trigger checkroyalty on roysched for insert as if (select royalty from inserted) > 30 begin print 'royaltytrigger:版权费不能超过30' print '请将版权费修改为小于30 的值' rollback transaction end insert into roysched values ('BU1032',2,5,90) select * from roysched where title_id='BU1032' ---------------------------------------------------------------------------------------------------------------------- 例三:创建一个触发器监视insert操作,若插入的记录中出版日期小于当前日期,则提示用户,并回滚此操作。 use pubs go if exists(select name from sysobjects where name ='checkpubdate' and type='tr') drop trigger checkpubdate go create trigger checkpubdate on titles for insert as if (select pubdate from inserted) < getdate() begin select * from inserted --查看内存表中的数据 print '出版日期小于当前日期' rollback transaction

数据库原理 触发器

实验六触发器 1、指挥部和策划部总人数不超过总员工人数的30% create trigger TR_12 on 员工 for insert as declare @num1 int,@num2 int,@id char(13) set @num1=(select count(*) 指挥部和策划部总人数 from 员工 where 部门编号in(select 部门编号from 部门where 部门名称in ('指挥部','策划部'))) print @num1 select @num2=count(*) from 员工 select @id=员工编号from inserted if(@num1>@num2*0.3) begin delete from 员工where 员工编号=@id raiserror('不符合标准',7,2) end insert into 员工(员工编号,员工姓名,性别,部门编号) values(2011122400102,'查宁静','女',201)

2.员工编号为:入职日期+部门编号+两位子编号,编写脚本实现,若部门编号变更为四位,员工编号随即改变 create trigger tr_123 on 员工 after update as declare @id1 char(3),@id2 char(3) select @id1=部门编号from deleted select @id2=部门编号from inserted if update(部门编号) begin update 员工 set 员工编号=substring(员工编号,1,8)+@id2+substring(员工编号,12,2) where 员工编号like @id1 +'%' end insert into 员工(员工姓名,性别,部门编号) values('査宁静','女',2011)

SQL Server触发器语法

SQL触发器语法参考CreateTRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { { { FOR |AFTER | INSTEAD OF } { [ Insert ] [ , ] [ Updat e ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS [ { IF Update ( column ) [ { AND | or } Update ( column ) ] [ ...n ] | IF ( COLUMNS_UpdateD ( ) { bitwise_operator } updated _bitmask) { comparison_operator } column_bitmask [ ...n ] } ] sql_statement [ ...n ] } }

参数 trigger_name 是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。 Table | view 是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。 WITH ENCRYPTION 加密syscomments 表中包含Create TRIGGER语句文本的条目。使用WITH ENCRYPTION 可防止将触发器作为SQL Server复制的一部分发布。 AFTER 指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。

数据库原理触发器中的题

触发器中的题 在SC表上插入一条选课记录后,将C表中对应的课程的seleNUM值加1。(注意每一步的含义) Alter table c add seleNUM int---- 在C表增加一个字段 go Update c Set selenum=(select count(sno)from sc where cno=https://www.360docs.net/doc/6d7261212.html,o)------- C表上的SELENUM的值的填入(根据SC表选课的情况) go select cno,selenum from c-----查看C表上每门课的选课人数 go CREATE TRIGGER SELECTCOURSE ON SC FOR INSERT AS IF(SELECT COUNT(*)FROM INSERTED,sc where sc.sno=inserted.sno and https://www.360docs.net/doc/6d7261212.html,o=https://www.360docs.net/doc/6d7261212.html,o)>1 ----如果SC表中某个学生已有这门课的选课记录 BEGIN PRINT'YOU CAN INSERT ONE RECORD ONCE. SO THE RECORDS ARE NOT INSERTED INTO THE TABLE' ROLLBACK TRAN END ELSE BEGIN DECLARE @CNO VARCHAR(10) SELECT @CNO=CNO FROM INSERTED If(select seleNum from c where cno=@cno)is null Begin Update c set seleNum=0 where cno=@cno end UPDATE C SET seleNUM=selenum+1 WHERE CNO=@CNO-----C表中根据刚插入的选课记录中的课程号,选课人数增加 PRINT'THE NUMBER OF STUDENTS WHO SELECTED'+@CNO +' HAS BEENODDED' END GO insert sc values('200512','c02',80)-----此记录被拒 go insert sc values('200912','c02',90)-------次记录成功插入SC select*from c------查看C表中的记录,看看C02的选课人数是否加 GO insert c(cno,cname,credit) values('c05','操作系统',4) )---C表中插入一条记录(原来没有这门课的)

相关文档
最新文档