数据库应用技术 sql server 2005
DESCRIPTION
数据库应用技术 SQL Server 2005. 第 9 章 存储过程和触发器. 能力目标 : 能根据项目需求设计存储过程。 能根据项目逻辑设计中数据完整性要求设计编写触发器。 任务设计: 编写简单的存储过程。 编写简单的触发器实现完整性控制。 知识要求: 存储过程和触发器的基本概念。 存储过程和触发器的编程方法。. 9.1 存储过程. 存储过程 的 基本知识. 存储过程 的 参数. 创建用户 存储过程. 第一步. 第二步. 第三步. 9.1.1 存储过程的基本知识. 概念 - PowerPoint PPT PresentationTRANSCRIPT
数据库应用技术SQL Server 2005
SQL Server 2005
第 9 章 存储过程和触发器
能力目标 :能根据项目需求设计存储过程。能根据项目逻辑设计中数据完整性要求设计编写触发器。
任务设计:编写简单的存储过程。编写简单的触发器实现完整性控制。
知识要求:存储过程和触发器的基本概念。存储过程和触发器的编程方法。
SQL Server 2005
9.1 存储过程
第一步第一步 第二步第二步 第三步第三步
存储过程的
基本知识创建用户存储过程
存储过程的
参数
SQL Server 2005
9.1.1 存储过程的基本知识
概念存储过程( Stored Procedure )一组编译好存储在服务器上的完成特定功能 T-SQL 代码,是某数据库的对象。客户端应用程序可以通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行存储过程。
优点使用存储过程而不使用存储在客户端计算机本地的 T-SQL 程序的优点包括:•允许标准组件式编程,增强重用性和共享性•能够实现较快的执行速度•能够减少网络流量•可被作为一种安全机制来充分利用
SQL Server 2005
9.1.1 存储过程的基本知识
分类
在 SQL Server 2005 中存储过程分为三类:系统提供的存储过程、用户自定义存储过程和扩展存储过程。
系统:系统提供的存储过程, sp_* ,例如: sp_rename
扩展: SQL Server 环境之外的动态链接库 DLL , xp_
远程:远程服务器上的存储过程
用户:创建在用户数据库中的存储过程
临时:属于用户存储过程, # 开头(局部:一个用户会话) ,##
(全 局:所有用户会话)
SQL Server 2005
9.1.2 创建用户存储过程
使用存储过程模板创建存储过程
在【对象资源管理器】窗口中,展开“数据库”节点,再展开所选择的具体数据库节点,再展开选择“可编程性”节点,右击“存储过程”,选择“新建存储过程”命令,如图所示:
SQL Server 2005
9.1.2 创建用户存储过程
在右侧查询编辑器中出现存储过程的模板,用户可以在此基础上编辑存储过程,
单击“执行”按钮,即可创建该存储过程。
SQL Server 2005
9.1.2 创建用户存储过程
例 9-1 :创建一个简单的存储过程USE Library
GO
CREATE PROCEDURE borrowed_num
AS
SELECT Rname,Lendnum
FROM Reader
WHERE Rname=' 赵良宇 '
存储过程建好了,什么时候,怎么用呢?执行存储过程:borrowed_num 或EXEC borrowed_num
执行结果:
SQL Server 2005
9.1.2 创建用户存储过程
使用 T-SQL 语句创建表
格式:
CREATE PROC 过程名
@ 形参名 类型
@变参名 类型 OUTPUT
AS SQL 语句
SQL Server 2005
9.1.2 创建用户存储过程
例 9-2:创建一个多表查询的存储过程。
USE Library
GO
CREATE PROCEDURE borrowed_book1
AS
SELECT r.RID,r.Rname,b.BID,k.Bname,b.LendDate
FROM reader r INNER JOIN borrow b
ON r.RID=b.RID INNER JOIN book k
ON b.BID=k. BID
WHERE Rname=' 程鹏 '
执行存储过程:
SQL Server 2005
9.1.2 创建用户存储过程
borrowed_book1 或
EXEC borrowed_book1
执行结果:
SQL Server 2005
9.1.3 管理用户存储过程
获得存储过程的信息
语法:
sp_helptext [[@objname=]存储过程名 ]
说明 :
要显示用来创建过程的文本,可在存储过程所在的数据库中执
行 sp_helptext ,并使用过程名作为参数。使用 ENCRYPTION 选项创建的存储过程不能使用 sp_helptext 查看。
SQL Server 2005
9.1.3 管理用户存储过程
修改存储过程语法:
ALTER PROC [ EDURE] 存储过程名 [ , n]
@ 形参名 数据类型
@ 变参名 数据类型 OUTPUT
说明 : 如果需要更改存储过程中的语句或参数,可以删除或重新创建
该存储过程,也可以直接修改该存储过程。删除或重新创建 存储过程时,所有与该存储过程相关的权限都将丢失;而修改 存储过程时,过程或参数定义会更改,但权限将保留。修改存 储过程使用语句 ALTER PROCEDURE 来完戍。
SQL Server 2005
回顾
CREATE PROC 过程名
@ 形参名 类型
@变参名 类型 OUTPUT
AS SQL 语句
存储过程( Stored Procedure )一组编译好存储在服务器上的完成特定功能 T-SQL 代码,是某数据库的对象。
SQL Server 2005
9.2 触发器
44
22
33
11创建 DDL 触发器
修改触发器
删除触发器
查看触发器
触发器的
基本知识
SQL Server 2005
9.2.1 触发器的基本知识
基本概念触发器是特殊的存储过程,基于一个表 / 视图 / 服务器 / 数据库。
注意:触发器里也包含一系列的 T-SQL 语句,但它的执行不是用exec主动调用的,而是在满足一定条件下自动执行的。
创建,主要作用就是实现由主键和外键所不能保证的复杂的参照完整性和数据一致性。
当触发器所保护的数据发生变化( update,insert,delete ),或者当服务器、数据库中发生数据定义( create 、 alter 、 drop )时,系统将自动运行触发器以保证数据库的完整性、正确性和安全性。通俗的说:通过一个动作( update,insert,delete )调用一个存储过程(触发器)。
SQL Server 2005
9.2.1 触发器的基本知识
触发器的分类
DML触发器
DDL触发器
SQL Server 2005
9.2.1 触发器的基本知识
类型
DML 触发器
在数据库中发生数据操作语言( DML)事件时将启用。DML 事件包括在指定表或视图中修改数据的 INSERT 语句、 UPDATE 语句或 DELETE 语句。 DML 触发器可以查询其他表,还可以包含复杂的 T-SQL 语句。系统将触发器和触发它的语句作为可在触发器内回滚的单个事务对待,如果检测到错误(例如,磁盘空间不足),则整个事务即自动回滚。
SQL Server 2005
9.2.1 触发器的基本知识
DDL 触发器
SQL Server 2005 的新增功能。当服务器或数据库中发生数据定义语言( DDL )事件时将调用这些触发器。但与 DML 触发器不同的是,它们不会为响应针对表或视图的 UPDATE 、 INSERT 或 DELETE 语句而激发,相反,它们会为响应多种数据定义语言( DDL )语句而激发。这些语句主要是以 CREATE 、 ALTER 和 DROP 开头的语句。 DDL 触发器可用于管理任务,例如审核和控制数据库操作。
SQL Server 2005
9.2.2 创建 DML 触发器
使用存储过程模板创建存储过程
在【对象资源管理器】窗口中,展开“数据库”节点,再展开所选择的具体数据库节点,再展开“表”节点,右击 要 创 建 触 发 器 的“表”,选择“新建触发器”命令,如图所示:
SQL Server 2005
9.2.2 创建 DML 触发器
在查询编辑器中出现触发器设计模板,用户可以在此基础上编
辑触发器,单击“执行”按钮,即可创建该触发器。
SQL Server 2005
9.2.2 创建 DML 触发器
使用 T-SQL 语句创建表 CREATE TRIGGER 触发器ON 表名FOR[update,insert,delete ]
AS SQL 语句
例 9-3 :创建基于表 reader , DELETE 操作的触发器。USE LibraryGOIF EXISTS(SELECT name FROM sysobjects WHERE name='reader_d' AND type='TR')DROP TRIGGER reader_d -- 如果已经存在触发器reader_d 则删除
SQL Server 2005
9.2.2 创建 DML 触发器
GOCREATE TRIGGER reader_d -- 创建触发器ON reader -- 基于表 FOR DELETE -- 删除事件ASset nocount on PRINT ‘ 数据被删除 !’ -- 执行显示输出GO试试吧!应用:USE LibraryGODELETE readerwhere Rname='aaa'
SQL Server 2005
9.2.2 创建 DML 触发器
执行结果:数据被删除 !
(所影响的行数为 1 行)例 9-4:在表 borrow中添加借阅信息记录时,得到该书的应还日期。说明:在表 borrow 中增加一个应还日期 SReturnDate 。USE Library
IF EXISTS (SELECT name FROM sysobjects
WHERE name ='T_return_date' AND type='TR')
DROP TRIGGER T_return_date
GO
CREATE TRIGGER T_return_date -- 创建触发器ON Borrow -- 基于表 borrow
SQL Server 2005
9.2.2 创建 DML 触发器
AFTER INSERT --插入操作AS
-- 查询插入记录 INSERTED 中读者的类型 DECLARE @type int,@dzbh char(10),@tsbh char(15)
SET @dzbh=(SELECT RID FROM inserted)
SET @tsbh=(SELECT BID FROM inserted)
SELECT @type= TypeID
FROM reader
WHERE RID=(SELECT RID FROM inserted)--副本/* 把 Borrow 表中的应还日期改为当前日期加上各类读者的借阅期限 */
UPDATE Borrow SET SReturnDate=getdate()+
CASE
WHEN @type=1 THEN 90
SQL Server 2005
9.2.2 创建 DML 触发器
WHEN @type=2 THEN 60WHEN @type=3 THEN 30ENDWHERE RID=@dzbh and BID=@tsbh
应用:USE LibraryINSERT INTO borrow(RID,BID) VALUES('2000186010','TP85-08')
查看记录:
SQL Server 2005
9.2.2 创建 DML 触发器
例 9-5:在数据库 Library中,当读者还书时,实际上要修改表 brorrowinf中相应记录还期列的值,请计算出是否过
USE Library
IF EXISTS(SELECT name FROM sysobject
WHERE name='T_fine_js' AND type='TR')
DROP TRIGGER T_fine_js
GO
CREATE TRIGGER T_fine_js
ON borrow
AFTER UPDATE
AS
SQL Server 2005
9.2.2 创建 DML 触发器
DECLARE @days int,@dzbh char(10),@tsbh char(15)
SET @dzbh=(select RID from inserted)
SET @tsbh=(select BID from inserted)
SELECT @days=DATEDIFF(day, ReturnDate, SReturnDate)
--DATEDIFF函数返回两个日期之差,单位为 DAY
FROM borrow
WHERE RID=@dzbh and BID=@tsbh
IF @days>0
PRINT '没有过期! '
ELSE
PRINT ' 过期 '+convert(char(6),@days)+'天 '
GO
应用:
SQL Server 2005
9.2.2 创建 DML 触发器
USE Library
UPDATE borrow SET ReturnDate='2007-12-12'
WHERE RID='2000186010' and BID='TP85-08'
GO
执行结果:过期 -157 天(1 行受影响 )
例 9-6:对 Library库中 Reader 表的 DELETE操作定义触发器。USE Library
GO
IF EXISTS(SELECT name FROM sysobjects
WHERE name='reader_d' AND type='TR')
DROP TRIGGER reader_d
GO
SQL Server 2005
9.2.2 创建 DML 触发器
CREATE TRIGGER reader_d
ON Reader
FOR DELETE
AS
DECLARE @data_yj int
SELECT @data_yj=Lendnum
FROM deleted
IF @data_yj>0
BEGIN
PRINT ' 该读者不能删除!还有 '+convert(char(2),@data_yj)+' 本书没还。
ROLLBACK
END
SQL Server 2005
9.2.2 创建 DML 触发器
ELSE
PRINT ' 该读者已被删除! '
GO
应用:USE Library
GO
DELETE Reader WHERE RID='2005216119'
执行结果:该读者不能删除!还有 4 本书没还。
SQL Server 2005
9.2.3 创建 DDL 触发器
DDL 触发器会为响应多种数据定义语言 (DDL) 语句而激发。这些 语 句 主 要 是 以 CREATE 、 ALTER 和 DROP 开 头 的 语句。 DDL 触发器可用于管理任务,例如审核和控制数据库操作。
语法形式:
CREATE TRIGGER trigger_name
ON {ALL SERVER|DATABASE}[WITH <ddl_trigger_option> [ ,...n ]]
{FOR|AFTER} {event_type|event_group}[,...n]
AS {sql_statement[;] [...n]|EXTERNAL NAME <method specifier>[;]}
SQL Server 2005
9.2.3 创建 DDL 触发器
其中:<ddl_trigger_option>::=[ENCRYPTION] EXECUTE AS Clause]<method_specifier> ::=
assembly_name.class_name.method_name
例 9-7 :使用 DDL 触发器来防止数据库中的任一表被修改或删除。CREATE TRIGGER safetyON DATABASE FOR DROP_TABLE, ALTER_TABLEASPRINT 'You must disable Trigger "safety" to drop or alter tables!'ROLLBACK
例 9-8 :使用 DDL 触发器来防止在数据库中创建表。CREATE TRIGGER safetyON DATABASEFOR CREATE_TABLEAS
SQL Server 2005
9.2.3 创建 DDL 触发器
PRINT 'CREATE TABLE Issued.'
SELECT
EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
RAISERROR ('New tables cannot be created in this database.', 16, 1)
ROLLBACK
SQL Server 2005
9.2.4 管理触发器
查看触发器sp_helptext trigger_name
sp_helptrigger table_name
sp_help ’ ’触发器名称
sp _depends ‘ ’触发器名称
sp _depends ‘ ’表名
修改触发器
ALTER TRIGGER 触发器
删除触发器DROP TRIGGER 触发器
SQL Server 2005
9.3 小结
本章介绍了存储过程和触发器的概念、创建和调用方法。其中重点介绍了存储过程的创建和调用,以及 DDL 和 DML
触发器的创建方法。希望同学们通过课后习题和上机练习加深对存储过程和触发器的理解,提高 T-SQL编程水平。