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.删除触发器。
SQL Server 2005中触发器的应用
结 果 如 下 ,出 现 错 误 提 示 :
Yo r t al we o CREATE, u a e no l o d t
触 发 器 是 一 种 保 证 数 据 完整 性 的 方 法 , 是 一 它
种特 殊的存储过 程 . 本文 简述 了S L S e Q e V r r
维普资讯
FO R
CR EA T E T A BLE .
l l
l l 3 I
D R OP TA BLE . LTER T A BLE . A C R T P R C E D R . E A E O U E 碡酾 ຫໍສະໝຸດ ≯ 毫 ≤警 二 0 _ 0
如 果 再执 行 D P的操 作 ,同样 触 发 RO 警 告 。 因 为我 们 的触 发 器 规 定 了不 能 使用
CREAT E TABLE, D ROP TABLE. A L T E R C R E A E T
t ig r D L t ig r a d n t a o tig r a d r e , D r e n I e d f rg e , n g g s
i rvd s t e x m ls o a pi to . t o i h e a pe f r p l a in P e c
2 0 中的 种 触 发 器 对 象 :Af e 0 5 t r,DD L和
ALTER a d n DROP n Ta l s n a y b e a d
P o e u e rcd r s M s 30 , e e1 S ae , i l g 6 9 L v l6, t t 2 Lne 1 1 r n a to n e h r g r 1 e t a s ci n e d i t e ti e . d n g
SQL server 2005触发器操作
8
11.8触发器的创建执行
1.触发器的基本操作__创建
在创建触发器前,必须注意以下几点:
CREATE TRIGGER 语句必须是批处理中的第一条语句。 只能在当前数据库中创建触发器,名称必须遵循标识符的命名规则。 表的所有者具有创建触发器的默认权限,不能将该权限转给其他用户。 不能在临时表或系统表上创建触发器,但是触发器可以引用临时表,但是不能 引用系统表。 尽管TRUNCATE TABLE 语句类似于没有WHERE子句(用于删除行)的 DELETE语句,但由于该语句不被记入日志,所以它不会引发DELETE触发器。 WRITETEXT语句不会引发INSERT或UPDATE触发器。
11
11.8触发器的创建执行
1.触发器的基本操作__创建
例:在student数据库中,为“班级”表建立一个名为del_banji的 DELETE触发器,其作用是当删除“班级”表中的记录时,检查“学 生”表中是否存在该班级的学生,如果存在则提示不允许删除该班级 的信息。
12
11.8触发器的创建执行
16
11.9修改和删除触发器
1.修改 1)使用系统存储过程修改触发器名称 对触发器进行重命名,可以使用系统存储过程sp_rename来 完成,其语法格式如下: [EXECUTE] sp_rename 触发器原名,触发器新名
17
11.9修改和删除触发器
2)使用T-SQL语句修改触发器定义 修改触发器的定义,可以使用ALTER TRIGGER语句。 ALTER TRIGGER语句与CREATE TRIGGER语句的语法 相似,只是语句的第ห้องสมุดไป่ตู้个关键字不同 .
在SQL Server Management Studio中创建触发器的操作步骤为: (1)启动SQL Server Management Studio,在“对象资源管理器”窗 口中,依次展开数据库、student、表节点。 (2)在表节点中,展开需要建立触发器的表(如班级),右键单击触发 器,在弹出的快捷菜单中选择“新建触发器”命令。 (3)单击“新建触发器”命令,打开“创建触发器模板”,在模板中输 入触发器创建文本。 (4)单击工具栏上的“执行”按钮,完成触发器的创建。
SQL Server2005数据库应用技术第9章 使用触发器和事务
– 隔离性:为了提高事务的吞吐率,大多数DBMS允许 同时执行多个事务,就像分时操作系统为了充分利用 系统资源,同时执行多个进程一样。
– 持久性:事务完成之后,它对于系统的影ห้องสมุดไป่ตู้是永久性 的,该修改即使出现系统故障也将一直保持。
9.2.2 修改触发器
(3)使用T-SQL语句修改触发器正文 使用T-SQL语句ALTER TRIGGER可以修改触发器,具 体语法形式如下: ALTER TRIGGER 触发器名 ON {表名 | 视图名} [WITH ENCRYPTION] {FOR | AFTER | INSTEAD OF}{[INSERT], [UPDATE], [DELETE]} AS IF UPDATE(列名) [{AND | OR} UPDATE(列名)…] SQL语句
9.3 了解事务
9.3.1 事务
事务是由一系列的数据查询操作或更新操作构成, 可以看作单个处理单元。如果某一事务执行,则在 该事务中的所有操作均会执行,记录在数据库中, 成为持久的组成部分。如果遇到问题,则必须全部 取消或回滚,所有处理均被清除。
9.3.2 事务的特征
– 原子性:事务必须是原子工作单元,对于其数据修改, 要么全都执行,要么全部不执行。
9.1.4 使用T-SQL语句创建触发器
其中各参数含义如下:
– WITH ENCRYPTION:加密触发器的文本。 – AFTER:指定在对数据表的相关操作之后,触发器被
触发。 – INSTEAD OF:指定执行触发器而不是执行触发语句,
从而替代触发语句的操作。 – {[INSERT], [UPDATE], [DELETE]}:指定在表或视图
在SQL Server2005由触发器的使用
[F UP TE ( ou — a I DA c lmn n me)】1 [AND I D E ORlUP AT (o m —ae cl n nm )…】 u
S l s at ent q t em
—
)
其 中 ,tge nm 是 要 创 建 的 触 发 器 的 名 称 ;t l r gr a e i _ ae b_ nm 是 在其 上执 行触 发器 的 表名 或视 图名 ;F R 1 ae O A T RIN T A F 定触发 器 的时机 , O F E S E DO 指 I F R与 A T R相 同; FE IS R , E E E U D T N E T D L T , P A E是 指定 在 表或视 图上执 行哪些 数据 修改 语 句时将 触发 触发 器 的关键 字 ,必须 至少 指定 一个选 项 。 在触 发 器的定 义 中允许 使用 以任 意顺 序组 合 的这些 关键 字 ,中
n le 1 iw aT e l v
—
2 、创建 D 触 发器 的权 限 默认 分配 给表 的所有 者 ,且 不 ML 能将该权 限转 给其 它用户 。 3 ML 发 器是 数据 库对 象 ,其 名称 必 须遵 循 标识 符 的 、D 触
命 名规则 。
4 、虽 然 D L触 发器 可 以引用 当前数 据 库 以外的 对象 ,但 M 只 能在 当前 数据 库 中创 建 D 触 发器 。 ML 5 R N A ET B E语 句不会 触 发 D L T 、T U C T A L E E E触 发器 。 在 S LS R E 05 , 建一个 触 发器 的基 本语 法如 下 Q E V R20 中 创
CREATE RI T GGER tig r n a m rg e
关系数据库与SQL Server 2005第28讲 触发器(实验)
print ‘不能删除xsqk表中的信息!’
go
请思考:分别执行以下两条删除语句, 哪条语句能激活该 delete触发器?不能激活触发器的语句违反了什么约束?
delete xsqk where 学号= ‘020101’ delete xsqk where 学号= ‘020103’
动手实验3:
update触发器的创建和激活
任务2:验证教材P185例7-12。在xs_kc表上创建名为 tr_update_xs_kc的触发器,用于检测该表的“成绩”列是否 被更新,当有更新时,显示其学号、课程号、原成绩和新成 绩。
create trigger t_update_xs_kc on xs_kc after update
动手实验4:
删除触发器
任务:删除xs_insert_cj, tr_insert_xsqk
本课小结
触发器的含义、作用 触发器的类型:
后触发器、替代触发器
触发器执行期间的临时表
inserted 表 、deleted表
创建触发器
insert触发器、delete触发器、update触发器
第28讲
第9章 存储过程和触发器
——触发器的使用(实验)
主讲人:段利文
第9章 存储过程和触发器
——触发器的使用
实验项目
动手实验1:insert触发器的创建和激活 动手实验2: delete触发器的创建和激活 动手实验3: update触发器的创建和激活 动手实验4:触发器的删除
动手实验1:
insert触发器的创建和激活
任务1:在xscj库的xs_kc表上创建1个名为tr_insert_cj的触发器, 当向xs_kc表进行插入操作时激发该触发器,并给出提示信 息“有新成绩插入到xs_kc表中!”。
SQL 触发器的创建和使用(SQL2005)
DML 触发器使用 deleted 和 inserted 逻辑表。 它们在结构上和触发器所在的表的结构相同, SQL Server会自动创建和管理这些表。可以使用 这两个临时的驻留内存的表测试某些数据修改的 效果及设置触发器操作的条件。 Deleted表用于存储delete,update语句所影响 的行的副本。在执行delete或update语句时,行 从触发器表中删除,并传输到deleted表中。 Inserted表用于存储Insert或update语句所影响 的行的副本,在一个插入或更新事务处理中,新 建的行被同时添加到Inserted表和触发器表中。 Inserted表中的行是触发器表中新行的副本。
10.2 DML触发器的创建和应用
♦ 如果一个表的外键包含对定义的 DELETE或UPDATE 操作 的级联,则不能定义INSTEAD OF 和INSTEAD OF UPDATE触发器 ♦ 虽然TRUNCATE TABLE 语句类似于没有WHERE子句(用 于删除行)的DELETE语句,但它并不会引发DELETE触发 器,因为TRUNCATE TABLE 语句没有记录。 ♦ 如果指定了触发器架构名称来限定触发器,则将以相同的方 式限定表名称。 ♦ 在触发器内可以指定任意的 SET 语句。选择的 SET 选项在 触发器执行期间保持有效,然后恢复为原来的设置。 ♦ 在 DML 触发器中不允许使用下列 Transact-SQL 语句: ALTER DATABASE、CREATE DATABASE、DROP DATABASE、RECONFIGURE、LOAD LOG、LOAD DATABASE、RESTORE LOG、RESTORE DATABASE
第5页
10.1.1 触发器的概念 当创建数据库对象或在数据表中插入记录、修改 记录或者删除记录时,SQL Server就会自动 执行触发器所定义的SQL语句,从而确保对数 据的处理必须符合由这些SQL语句所定义的规 则。触发器和引起触发器执行的SQL语句被当 作一次事务处理,如果这次事务未获得成功, SQL Server会自动返回该事务执行前的状态 例 如 , 当 对 某 一 个 表 进 行 诸 如 UPDATE 、 INSERT、DELETE这些操作时,SQL Server 就会自动执行触发器所定义的T-SQL语句,从 而确保对数据的处理必须符合由这些T-SQL语 句所定义的规则。
SQLServer2005触发器操作试验报告
工程数据库设计与应用实验报告实验四创建触发器的基本操作学号: 1030412612 班级:计算机1206 姓名:王成义成绩指导教师:戴月明一、实验目的通过实验熟练掌握创建触发器的方法,掌握如何新建触发器、修改及使用触发器的方法。
二、实验内容1、创建一个触发器:修改学生表里的姓名,同步更新成绩表里的姓名。
2、创建第二个触发器:删除学生表中的某个学生,同步删除成绩里的该学生的成绩记录。
三、实验完成情况1、创建一个名为truS的触发器,当修改学生表里的姓名,同步更新成绩表里的姓名。
if(object_id('truS','TR')isnotnull)droptrigger truSgoCREATETRIGGER truSON SFORUPDATEASIFUPDATE(Sname)BEGINSETNOCOUNTON;UPDATE SCSET Sname=i.SnameFROM SC sc,Deleted d,Inserted i--注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
WHERE sc.Sid=d.Sid--(select Sname from insertted) where SC.Sid=(select Sid from inserted)ENDGO操作结果如图:(图1)(图2)(图3)(图4)2、创建一个名为trdS的触发器,当删除学生表中的某个学生,同步删除成绩里的该学生的成绩记录。
if(object_id('trdS','TR')isnotnull)droptrigger trdSgoCREATETRIGGER trdSON SFORDELETEASBEGINSETNOCOUNTON;DELETE SCFROM SC sc,Deleted d--注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
SQL Server2005存储过程和触发器的设计实验三
3.存储过程和触发器的设计一、实验目的和要求(1)掌握 SQL Server中的触发器的使用方法;(2)掌握存储过程的操作方法。
二、实验内容和原理1. 基本操作实验在读者-图书数据库中用Transact-SQL语句描述下列功能:(1)在读者表上建立一个DELETE类型的触发器lianxi_del,触发动作是显示信息(已删除读者表中的数据),执行下列语句:create trigger lianxi_delon 读者for deleteas print ‘已删除读者表中的数据’(2)建立一个查询指定读者号的阅读信息的存储过程List_jy,输入参数为读者号,如果没有输入读者号,则要输出提示信息。
三、算法描述及实验步骤1. 触发器的操作(1)建立触发器首先,打开企业管理器,定位数据库并找到要创建触发器的表;然后,右击该表名,在弹出的快捷菜单中选择“设计表”,在打开的“设计表”窗口中单击按钮。
最后,在触发器属性窗口中输入触发器的内容,并单击“确定”按钮。
(2)查看触发器使用企业管理器2. 提高操作实验在学生-课程数据库中用Transact-SQL语句描述下列功能:1)为学生表建立一个名TRI_INSERT的INSERT触发器。
功能是当用户向学生表添加数据时,同时也把这些数据添加到stu表中。
其中:学生表和表stu的结构相同。
CREATE TRIGGER TRI_INSERTON STUDENTFOR INSERTASINSERT INTO STUSELECT * FROM INSERTED(2)创建一查询存储过程,过程名称为P_CX。
参数是学号,输出信息是指定学号所应的姓名、课程名称、成绩。
运行时若没有指定学号,则提示请输入学号;若学号不存在则提示学号不存在。
create procedure P_CX@sno char(10) =nullasif @sno is nullbeginprint '请输入一个学号'returnendelse if(not exists(select * from student where sno=@sno))print '学号不存在'elseselect sname,o,gradefrom student,course,scwhere student.sno=sc.sno and o=o and student.sno=@sno(3)创建一统计存储过程,过程名称为P_CJTJ。
- 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页 句中指定的触发器操作。