SQL 触发器的创建和使用(SQL2005)
第8章 SQL Server 2005的触发器和数据操作K

(1)先创建两张新表Order和Cust,在SQL Server Management Studio 查询窗口中输入以下命令: USE test CREATE TABLE [order](oid INT PRIMARY KEY, [id] INT, products CHAR(10)) GO INSERT INTO [order] (oid,[id],products) VALUES(1,2,'VCD') GO INSERT INTO [order] (oid,[id],products) VALUES(2,9,'冰箱') GO USE test CREATE TABLE cust([id] INT PRIMARY KEY, [name] CHAR(10),address CHAR(10),PHONE INT) GO INSERT INTO cust ([id],[name],address,phone) VALUES(1,'lfm','GD','3762000') GO INSERT INTO cust ([id],[name],address,phone) VALUES(2,'lfm2','GD2','3762002') GO INSERT INTO cust ([id],[name],address,phone) VALUES(3,'lfm3','GD3','3762003') GO
(2)创建触发器: USE Test IF EXISTS ( SELECT name FROM sysobjects WHERE name = 'TR1' AND type = 'TR') DROP TRIGGER TR1 GO CREATE TRIGGER TR1 ON Customers FOR INSERT,UPDATE AS RAISERROR (50009,16,10) ROLLBACK GO
SQL Server 2005数据库应用技术第7章 存储过程与触发器

7.1 存储过程概述 2.存储过程的功能特点
7.1 存储过程
概述
7.2 创建与管理 存储过程 7.3 触发器概述 7.4 创建与管理 触发器
SQL Server中的存储过程可以实现以下功能: ① 接收输入参数并以输出参数的形式为调用过程 或批处理返回多个值。 ② 包含执行数据库操作的编程语句,包括调用其 他过程。 ③ 为调用过程或批处理返回一个状态值,以表示 成功或失败(及失败原因)。
概述
7.2 创建与管理 存储过程 7.3 触发器概述 7.4 创建与管理 触发器
7.2 创建与管理存储过程
7.1 存储过程
概述
7.2 创建与管理 存储过程 7.3 触发器概述 7.4 创建与管理 触发器
在SQL Server 2005中,可以使用SQL Server管理平台 或者T-SQL语句CREATE PROCEDURE来创建存储过 程。存储过程在创建后,可以根据需要调用执行、修改 和删除。
SQL Server存储过程可分为四类:系统存储过 程、用户自定义存储过程、临时存储过程、扩 展存储过程。
7.1 存储过程概述 1.存储过程的类型
7.1 存储过程
概述
7.2 创建与管理 存储过程 7.3 触发器概述 7.4 创建与管理 触发器
(1)系统存储过程 系统存储过程是指由系统提供的存储过程,主要存储在 master数据库中并以sp_为前缀,它从系统表中获取信 息,从而为系统管理员管理SQL Server提供支持。 (2)用户定义存储过程 用户定义存储过程是由用户创建并能完成某一特定功能 (例如查询用户所需数据信息)的存储过程。它处于用 户创建的数据库中,存储过程名前没有前缀sp_。本章 所涉及的存储过程主要是指用户定义存储过程。
SQL Server 2005实用教程第9章 触发器

Update dbScore表
【例9.2】 创建一个AFTER INSERT触发器,当在Sales 数据库的employees表中插入一条新员工记录时,如果 不是“采购部”、“财务部”、“销售部”或“库存部” 的员工,则撤销该插入操作,并返回出错消息。 【例9.3】 在Sales数据库的employees表和Sell表之间 具有逻辑上的主外键关系,要求当删除或更新单个员工记 录的时候,要激发触发器tri_Delete,在Sell表中也删除 或更新相对应的记录行。
学习目标
1、了解触发器与一般存储过程的区别 2、理解触发器的概念以及分类 3、掌握创建触发器的两种方法以及触发器的使用、修改 和删除
触发器
触发器是一种特殊的存储过程,在语言事件发生时,所设 置的触发器就会自动被执行,以进行维护数据完整性,或 其他一些特殊的任务。
与上一章介绍的一般意义上的存储过程不同,触发器可以 说是当发生DML或DDL语言事件时自动执行的存储过程。 不能直接被调用,也不能传递或接受参数。
允许每个动作有 多个触发器 没有限制
声明引用动作之后
执行时机
在约束处理之前,代替了触 发动作 在inserted表和deleted表 创建之后
不适用
在创建inserted表 和deleted表触发时
可以指定第一个和 最后一个触发器执 行动作 不允许
执行顺序 在inserted表和deleted 表引用text、ntext和 image类型的数据
inserted表
040102
2
73
NULL
S_number C_number Score credit
040102 T_Course表 C_number C_name 1 10 SQLServer 计算机组装 Teacher 将兵 袁伟 Hours Credit Type 72 68 6 4 专业核心课 专业基础课 2 73 NULL
sql2005常用存储过程、索引器与触发器

创建触发器的语法:
CREATE TRIGGER trigger_name ON table_name [WITH ENCRYPTION] FOR [DELETE, INSERT, UPDATE] AS T-SQL语句 GO
WITH ENCRYPTION表示加密触发器定义的SQL文本 DELETE, INSERT, UPDATE指定触发器的类型
演示使用企业管理器创建
使用T-SQL语句创建索引的语法:
唯一索引 聚集索引或非聚集索引 CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED] INDEX index_name ON table_name (column_name…) [WITH FILLFACTOR=x]
deleted 表
临时保存了删除或更新前的记录行 可以从deleted表中检查被删除的数据是否满足业务需求 如果不满足,则向用户报告错误消息,并回滚插入操作
修ห้องสมุดไป่ตู้操作
inserted表
deleted表
增加(INSERT)记录 存放新增的记录
------
删除(DELETE)记 存放被删除的记录 ----录 修改(UPDATE)记 存放更新后的记录 存放更新前的记录 录 inserted表和deleted表存放的信息
我们在项目开发中有一些常用的存储过程
◦ 大批量数据的插入 ◦ 分页
在项目的开发中,有时会碰到批量数据录入数据库 的情况,编写多条插入语句效率太低
Create procedure SplitString ( @string nvarchar(1000), -- 要分隔的字符串 @splitchar nvarchar(10) = ,, -- 分隔字符 @tablename nvarchar(50), -- 存入的表名称 @fieldname nvarchar(50) = [id] -- 存入的字段名称 ) as -- 将字符串分隔开放进表中 declare @l int -- 第一个分隔字符的位置 declare @s int -- 第二个分隔字符的位置 set @l = 0 set @s = charindex(@splitchar, @string, @l) while @l <= len(@string) begin declare @id nvarchar(50) if @s = 0 set @s = len(@string) + 1 -- 如果到 最后一个字符串那么第二个分隔字符的位置就是这个字符串的长度加一 set @id = substring(@string, @l, @s - @l) -- 取值 set @l = @s + 1 set @s = charindex(@splitchar, @string, @l) if ltrim(rtrim(@id)) = continue -- 如果是空字符串就跳过 declare @sql nvarchar(1000) set @sql = insert into + @tablename + (+ @fieldname +) values( + @id +) exec sp_executesql @sql end go
8 第八章 SQL_2005触发器

15
CREATE trigger add_sc1 on score after insert as begin declare @sno char(9) select @sno=sno from student where sno=(select sno from inserted) if @sno is null begin rollback transaction print '不存在这样的学生学号!' --raiserror('不存在这样的学生学号!',16,20) end End
的数据行被添加到 insert 表中,同时这些数据行的备份
被复制到inserted临时表中。
9
一个典型的UPDATE事务实际上是由两个操作组成。首先
,旧的数据行从基本表中转移到delete表中,前提是这 个过程没有出错;紧接着将新的数据行同时插入基本表 和insert表。
10
8.2.2 触发器基本操作格式 1.触发器的基本操作__创建 使用SQL语句创建触发器语法格式为: CREATE TRIGGER trigger_name ON 表名|视图名
6
INSTEAD OF触发器又称为前触发器或者替代触发器,当 引起触发器执行的修改语句停止执行时,该类触发器代 替触发操作执行。该类触发器既可在表上定义,也可在 视图上定义。对于每个触发操作(INSERT、UPDATE 和DELETE)只能定义一个INSTEAD OF触发器。
7
四、两张特殊的临时表:inserted表 deleted表 这两张表都存在于高速缓存中。用户可以使用这两张 临时表来检测某些修改操作所产生的效果。例如,可 以使用SELECT 语句来检查INSERT和UPDATE语句 执行的插入操作是否成功,触发器是否被这些语句触 发等。但是不允许用户直接修改inserted表和deleted 表中数据。
SQL Server 2005触发器4

SQL Server 2005触发器4现在测试一下在上一章节中建立好的三个触发器的功能。
下面所有的测试都是在【查询编辑器】对话框里进行的,要打开【查询编辑器】对话框,只要单击Management Studio里【新建查询】按钮即可。
测试例三:例三是保证【Northwind】数据库里不能删除表和修改表,在【查询编辑器】对话框里输入一个删除表的SQL语句:Drop table 操作记录表不允许删除表格测试例四:例四是保证当前服务器里的所有数据库不能被删除,在【查询编辑器】对话框里输入一个删除数据库的SQL语句:Drop DataBase test不允许删除数据库测试例五:例五是记录对【Northwind】所进行的操作,在【查询编辑器】对话框里输入一条添加数据表和一条删除数据表的SQL语句,然后再用Select语句查看【目志记录表】数据表里所有的记录:CREATE TABLE 测试表(编号int IDENTITY(1,1) NOT NULL,测试内容varchar(50) NOT NULL)GODrop table 测试表GOselect * from 日志记录表GO运行时不要忘了,前面曾经建立过一个不能删除数据表的触发器,要先把它禁用或删除。
记录对数据库的操作11.16 2005新增功能:查看与修改DDL触发器DDL触发器有两种,一种是作用在当前SQL Server服务器上的,一种是作用在当前数据库中的。
这两种DDL触发器在Management Studio中所在的位置是不同的。
l 作用在当前SQL Server服务器上的DDL触发器所在位置是:【对象资源管理器】,选择所在SQL Server服务器,定位到【服务器对象】à【触发器】,在【摘要】对话框里就可以看到所有的作用在当前SQL Server服务器上的DDL 触发器。
l 作用在当前数据库中的DDL触发器所在位置是:【对象资源管理器】,选择所在SQL Server服务器,【数据库】,所在数据库,定位到【可编程性】à【数据库触发器】,在摘要对话框里就可以看到所有的当前数据库中的DDL触发器。
触发器在SQL Server2005中的使用

建好 A e I e 触 发器之后 , t st f rn r 现在来 测试一 下触发器 是怎 么样 被
激活的 。
( ) M ngm n S d 里新 建一个查询 , 1在 aae ett i u o 在弹出 的【 查询编辑 器】 对话框里输入 以下代码 : IS R T N E T N O产品( 品名称) A U S I 产 V LE( 大苹果’ )
4 比较数据库修改前后数据 的状态 ) 5 维护规划化数据 ) 在 S LSre 0 5 , Q evr 0 中 触发器可 以分为两 大类 : 2 DML¥ 发器和 D  ̄ DL 触发器 。
发器 的步 骤 一致 , 同 的地方 是把 上 面 的 S L 句 中的 A T R I — 不 Q 语 FE N S R 分别 改为 A T RU D T ET F E P A E和 A T RD L T , F E E E E 如下所 示 , 有兴趣 的读者 可以 自 行测试 。
p n’ r t又删除了一种产 品 i
END GO
D L¥ M  ̄发器 是当数据库 服务器 中发 生数据操作 语言 (a ai— D tM np a u tnLnug) 件 时执行 的存储 过程 。D L l i agae事 ao M 触发 器又 分为 两类 : At 触 发器 和 I t d f fr e n e 触发器 。 sa O DL D 触发器是在 响应 数据定义语言 ( a e n i ag ae 事件 D t D f io L n ug ) a itn 时执行的存储过程 。D L 发器一般用于执行数据库 中管理 任务。如 D触 审核和规范数据库操作 、 防止数据库表结构被修改等 。 在了解触 发器 的种类 和工作 理由之后 , 现在可 以开始动手来设 计
SQL触发器的创建和使用

SQL触发器的创建和使用SQL触发器(trigger)是用来更改或响应数据库系统中的特定动作或事件的数据库对象,可以定义它们在表中特定数据发生一定的变化时自动地执行的SQL语句,一旦被触发,触发器就会自动地执行被定义的SQL语句。
在SQL Server 2005中,可以创建触发器来实现数据库的安全性和完整性。
触发器的定义可以放置在视图之外,以便于管理,可以动态地添加,修改和删除触发器,也可以创建多种不同的触发器。
一.创建触发器在SQL Server 2005中,可以使用CREATE TRIGGER语句来创建触发器。
如下所示:SQLCREATE TRIGGER trg_Customer_InsertON Customer FOR INSERTASBEGIN-- Trigger logic goes hereEND上面的语句创建一个名为 trg_Customer_Insert 的触发器,作用在Customer 表上,当 INSERT 操作发生时,则自动执行 Trigger logic。
二.使用触发器一旦触发器被创建,有两种方法可以使其起作用,即:对表的INSERT操作对表的UPDATE操作在使用触发器之前,有必要检查它的权限问题,因为只有拥有ALTER 权限的用户才能执行CREATETRIGGER或ALTERTRIGGER的操作。
1.对表的INSERT操作当插入一条记录到表中时,触发器将会自动执行:SQLINSERT INTO Customers( CustomerID, CustomerName, Address, City, State, ZipCode )2.对表的UPDATE操作当更新表中的记录时,触发器将会自动执行:SQLUPDATE CustomersSET Address = '456 Main Street'三.其他常用语句1.删除触发器。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2013年8月4日 第9页
10.1.3 触发器的类型 按照触发事件的不同,可以把Microsoft SQL Server 2005系统提供的触发器分成两大类型, 即DML触发器和DDL触发器。
DML触发器可以在数据库中数据修改时被执行。 DML事件包括在指定表或视图中修改数据的 INSERT语句、UPDATE语句或DELETE语句。 DML触发器可以查询其他表,还可以包含复 杂的T-SQL语句。系统将触发器和触发它的语 句作为可在触发器内回滚的单个事务对待,如 果检测到错误(例如,磁盘空间不足),则整 个事务自动回滚。
2013年8月4日 第21页
10.2.2使用Transact-SQL语句创建DML触发器 CREATE TRIGGER 触发器名 ON {表|视图} [WITH ENCRYPTION] {FOR|AFTER|INSTEAD OF} {[INSERT][,][UPDATE][,][DELETE]} [NOT FOR REPLICATION] AS [{IF UPDATE(列名)[{AND|OR} UPDATE(列 名)][…n]}] SQL语句
2013年8月4日 第12页
10.2 DML触发器的创建和应用
按照触发器和触发事件的操作时间划分,可以把DML触 发器分为AFTER触发器和INSTEAD OF触发器。 当在INSERT、UPDATE、DELETE语句执行之后才执 行DML触发器的操作时,这种触发器的类型就是 AFTER触发器。AFTER触发器只能在表上定义。 如果希望使用触发器操作代替触发事件操作,可以使用 INSTEAD OF类型的触发器。也就是说,INSTEAD OF触发器可以替代INSERT、UPDATE和DELETE触 发事件的操作。INSTEAD OF触发器既可以建在表上, 也可以建在视图上。通过在视图上建立触发器,可以 大大增强通过视图修改表中数据的功能。
第10章 触发器的创建和使用
教学目标 教学重点 教学过程
2013年8月4日
第1页
教学目标
了解触发器的概念和类型
理解触发器的优点 掌握触发器的创建、执行和删除等操作
2013年8月4日
第2页
教学重点
理解触发器的优点 掌握触发器的创建、执行和删除等操作
2013年8月4日
第3页
10.1 触发器(TRIGGER ['trigə] ) 触发器概述 DML触发器的创建和应用 DDL触发器的创建和应用 查看、修改和删除触发器
2013年8月4日
第4页
触发器概述
一般的存储 过程通过存储过程名称被直接调用,而触发器 主要是通过当某个事件发生时自动被触发执行 的。触发器可以用于SQL Server约束、默认 值和规则的完整性检查,还可以完成难以用普 通约束实现的复杂功能。
2013年8月4日
2013年8月4日 第17页
DML 触发器使用 deleted 和 inserted 逻辑表。 它们在结构上和触发器所在的表的结构相同, SQL Server会自动创建和管理这些表。可以使用 这两个临时的驻留内存的表测试某些数据修改的 效果及设置触发器操作的条件。 Deleted表用于存储delete,update语句所影响 的行的副本。在执行delete或update语句时,行 从触发器表中删除,并传输到deleted表中。 Inserted表用于存储Insert或update语句所影响 的行的副本,在一个插入或更新事务处理中,新 建的行被同时添加到Inserted表和触发器表中。 Inserted表中的行是触发器表中新行的副本。
2013年8月4日 第11页
10.2 DML触发器的创建和应用
在Microsoft SQL Server 2005系统中,按照触发器事 件类型的不同,可将DML触发器分成3种类型: INSERT类型、UPDATE类型和DELETE类型 如果该表有INSERT类型的DML触发器,则当向一个表中 插入数据时,则该INSERT类型的触发器触发执行; 如果该表有UPDATE类型的DML触发器,则当对该触发 器表中的数据执行更新操作时,该触发器就执行; 如果该表有DELETE类型的DML触发器,当对该触发器 表中的数据执行删除操作时,该DELETE类型的DML 触发器就触发执行。 也可以将这三种触发器组合起来使用。
虚拟表Deleted
不存储记录
新增时
修改时 删除时
2013年8月4日
存放用来更新的新记录 存放更新前的记录 不存储记录 存放被删除的记录
第19页
10.2.1 使用SQL Server管理控制台 创建DML触发器
在SQL Server管理控制台中,展开指定的 服务器和数据库,单击要创建触发器的数 据表,右击其中的“触发器”文件夹。从 弹出的快捷菜单中选择“新建触发器”选 项,会出现新建触发器模板窗口。
2013年8月4日 第13页
10.2 DML触发器的创建和应用
DML触发器的主要优点如下: ♦ DML触发器可以防止恶意或错误的插入、修改及删除 操作,并强行比较检查约束定义的限制更为复杂的其 他限制。与检查约束不同,DML触发器可以引用其 他表中的列。例如,触发器可以使用另一个表中的 SELECT比较插入或更新的数据,以及执行其他操作, 如修改数据或显示用户定义错误信息。 ♦ DML触发器可以评估数据修改前后表的状态,并根据 该差异采取措施。 ♦ 一个表中的多个同类DML触发器(INSERT、 UPDATE或DELETE)允许采取多个不同的操作来响 应同一个修改语句。
第10页
2013年8月4日
DDL触发器是Microsoft SQL Server 2005的 新增功能。当服务器或数据库中发生数据定 义语言(DDL)事件时将调用这些触发器。
DDL触发器与DML触发器的相同之处在于都 需要触发事件进行触发,但是,它与DML触 发器不同的是,它不会为响应针对表或视图 的UPDATE、INSERT或DELETE语句而触发, 相反,它会为响应多种数据定义语言(DDL) 语句(如:CREATE、ALTER)而触发。规 范数据库操作,防止数据库表结构被修改等。
第18页
2013年8月4日
理解触发器里面的两个临时的表:
Deleted , Inserted 注意Deleted 与Inserted分别表示触发事件的表 “旧的一条记录”和“新的一条记录”。 一个数据库系统中有两个虚拟表用于存储在表中记 录改动的信息,分别是:
表中记录的操作
虚拟表Inserted
存放新增的记录
2013年8月4日 第16页
10.2 DML触发器的创建和应用 1. DML 触发器的创建 当创建一个触发器时必须指定如下选项: ♦ 名称。 ♦ 在其上定义触发器的表。 ♦ 触发器将何时激发 ♦ 激活触发器的数据修改语句,有效选项为 INSERT, UPDATE或 DELETE,多个数据 修改语句可激活同一个触发器,例如,触 发器可由INSERT或 UPDATE语句激活。 ♦ 执行触发器操作的编程语句。
2013年8月4日 第6页
10.1.2 触发器的优点 使用触发器有以下优点: 触发器是自动执行的。 触发器可以通过数据库中的相关表进行层 叠更改。 触发器可以强制限制。这些限制比用 CHECK约束所定义的更复杂。
2013年8月4日
第7页
触发器概述
1. 触发器的作用 触发器的主要作用是能实现由主键和外键所不能保 证的、复杂的参照完整性和数据的一致性,除此之 外,触发器还有其他许多不同的功能。 可以调用存储过程 为了响应数据库更新,触发器的操作可以通过调用 一个或多个存储过程,甚至可以通过调用外部过程 完成相应操作。 跟踪变化 触发器可以侦测数据库内的操作,从而禁止了数据 库未经许可的更新和变化,使数据库的修改、更新 操作更安全,数据库运行更稳定。
2013年8月4日 第14页
10.2 DML触发器的创建和应用
创建DML触发器应该考虑以下几个问题: ♦ CREATE TRIGGER 必须是批处理中的第一条语句, 并且只能应用于一个表。 ♦ 触发器只能在当前的数据库中创建,但是可以引用 当前数据库的外部对象。 ♦ 创建触发器的权限默认分配给表的所有者,且不能 将该权限转给其他用户。 ♦ 触发器是一种数据库对象,其名称必须遵循标识符 的命名规则。 ♦ 虽然不能在临时表或系统表上创建触发器,但是触 发器可以引用临时表。 2013年8月4日 第15页
第5页
10.1.1 触发器的概念 当创建数据库对象或在数据表中插入记录、修改 记录或者删除记录时,SQL Server就会自动 执行触发器所定义的SQL语句,从而确保对数 据的处理必须符合由这些SQL语句所定义的规 则。触发器和引起触发器执行的SQL语句被当 作一次事务处理,如果这次事务未获得成功, SQL Server会自动返回该事务执行前的状态 例 如 , 当 对 某 一 个 表 进 行 诸 如 UPDATE 、 INSERT、DELETE这些操作时,SQL Server 就会自动执行触发器所定义的T-SQL语句,从 而确保对数据的处理必须符合由这些T-SQL语 句所定义的规则。
2013年8月4日 第22页
(2)FOR|AFTER。FOR与AFTER同义,指定触发器 只有在触发器SQL语句中指定的所有操作都已成功后 才激发。所有的引用级联操作和约束检查也必须成功 完成后,才能执行此触发器,即为后触发。只能在表 上定义 (3)INSTEAD OF。指定执行触发器而不执行造成触 发的SQL语句,从而替代造成触发的语句。在表或视 图上,每个INSERT、UPDATE或DELETE语句只能 定义一个INSTEAD OF触发器,即替代触发。 (4)[INSERT][,][UPDATE][,][DELETE]是指定在表上 执行哪些数据修改语句时将激活触发器的关键字。必 须至少指定一个选项。在触发器定义中允许使用任意 顺序组合的这些关键字。当进行触发条件的操作时 (INSERT、UPDATE或DELETE),将执行SQL语 2013年8月4日 第23页 句中指定的触发器操作。