家里有1亿算不算富二代:怎么用SQL server 2000 和VB 做一个存储过程和触发器的例子

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/29 18:21:08
如果有DELPHI的爱好者或是用DELPHI工作的朋友,可以加上我的QQ:273004788。
本人是一名学生。谢谢大家的支持。
本春现在还没有积分,只好对不起啦!

实现触发器
一、简介
触发器是一类特殊的存储过程,被定义为在对特定表或视图发出 UPDATE、INSERT 或 DELETE 语句时自动执行,可以实现数据的完整性和一致性。
1. 和特定表或视图关联。触发器定义在特定的表或视图上,称为触发器表或触发器视图
2. 自动调用。当试图在某个表插入、更新或删除数据,而在那个表上定义了针对所做动作的触发器,那么触发器会自动执行
3. 不能被直接调用。不像普通的存储过程,触发器不能被直接调用,也不传递或接受参数
4. 是一个事务的部分。触发器及触发它的语句被视为单个事务,可以在触发器内的任何地方被回滚
二、创建触发器
创建触发器,触发器是一种特殊的存储过程,在用户试图对指定的表执行指定的数据修改语句时自动执行。Microsoft® SQL Server™ 允许为任何给定的 INSERT、UPDATE 或 DELETE 语句创建多个触发器。
1.语法
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{ FOR|AFTER|INSTEAD OF}{[INSERT][,][UPDATE]}
AS
sql_statement [ ...n ]

2.参数
trigger_name
是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。
Table | view
是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。
WITH ENCRYPTION
加密 syscomments 表中包含 CREATE TRIGGER 语句文本的条目。使用 WITH ENCRYPTION 可防止将触发器作为 SQL Server 复制的一部分发布。
FOR | AFTER
指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。
如果仅指定 FOR 关键字,则 AFTER 是默认设置。
不能在视图上定义 AFTER 触发器。
INSTEAD OF
指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。
在表或视图上,每个 INSERT、UPDATE 或 DELETE 语句最多可以定义一个 INSTEAD OF 触发器。然而,可以在每个具有 INSTEAD OF 触发器的视图上定义视图。
{[DELETE][,][INSERT][,][UPDATE]}
是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。
对于 INSTEAD OF 触发器,不允许在具有 ON DELETE 级联操作引用关系的表上使用 DELETE 选项。同样,也不允许在具有 ON UPDATE 级联操作引用关系的表上使用 UPDATE 选项。
AS
是触发器要执行的操作。
sql_statement
是触发器的条件和操作。触发器条件指定其它准则,以确定 DELETE、INSERT 或 UPDATE 语句是否导致执行触发器操作。
3.注意事项:
SQL Server 不允许在触发器中使用下列语句:
ALTER DATABASE、CREATE DATABASE、DROP DATABASE、LOAD DATABASE、LOAD LOG、RESTORE DATABASE、RESTORE LOG
三、触发器实例
1.简单的触发器,几种触发器的比较.
CREATE TRIGGER TRIG1 ON 图书
FOR DELETE
AS
PRINT '触发器已执行!'

2.在“租借信息表”上创建 INSERT触发器“借阅册数”,如果“允借册数”为0,就不能再借了。
CREATE TRIGGER 借阅册数 ON 借阅
AFTER INSERT
AS
IF (SELECT 允借册数 FROM 读者,inserted
WHERE 读者.借书证号=inserted.借书证号)=0
BEGIN
PRINT '你可借书的册数为0,不能再借图书了'
ROLLBACK TRANSACTION
END
3.在“租借信息”表上创建 INSERT触发器“借书期限”,如果学生借书时间超过30天则不能借书。

CREATE TRIGGER 借书期限 ON 租借信息
AFTER INSERT
AS
IF EXISTS(SELECT * FROM 租借信息,inserted WHERE 租借信息.借书证号=inserted.借书证号 AND (GETDATE())-租借信息.借书日期)>30 AND 租借信息.还书日期 IS NULL)
BEGIN
PRINT '你有超期未还的图书,不能再借图书了!'
ROLLBACK TRANSACTION
END

存储过程的应用举例
例1 创建一个“借书过程”存储过程,该存储过程实现的功能是帮助读者完成借书过程。即读者只要提供借书证号、图书名称和图书的作者,就能完成借书。该程序完成的具体操作是:根据读者所提供的图书名称和作者,在图书信息表中进行查询,如果该书未被借出则继续完成借书操作,否则提示读者图书已经惜出。借书操作主要包括三个操作:向“租借信息”表中插入一条记录(保存该读者的借书信息),将“图书信息”表中对应记录的状态列设为1(避免他人再惜),将“学生信息”表中对应记录的借书册数增1(统计该读者的借书册数)。这三个操作要么都执行,要么都不执行。
USE 图书借阅管理
GO
CREATE PROC 借书过程
@借书证号 char(5),@图书名称 varchar(40),@作者 varchar(20)
AS
DECLARE @借阅号 int,@图书编号 varchar(6)
IF EXISTS (SELECT * FROM 图书信息
WHERE 图书名称=@图书名称 and 作者=@作者 and 状态=0)
BEGIN
BEGIN TRAN
SELECT @图书编号=图书编号 FROM 图书信息 --取出图书所对应的图书编号
WHERE 图书名称=@图书名称 and 作者=@作者 and 状态=0
UPDATE 图书信息
SET 状态=1
WHERE 图书编号=@图书编号 --修改"状态"列的值
IF @@error!=0
BEGIN
ROLLBACK TRAN
PRINT '更新图书信息表失败。'
RETURN 1
END
SELECT @借阅号=借阅号
FROM 租借信息 ORDER BY 借阅号 --取出最大借阅号
IF @借阅号 is null
SET @借阅号=0
INSERT 租借信息(借阅号,借书证号,图书编号,借书日期) VALUES (@借阅号+1,@借书证号,@图书编号,getdate())
IF @@error!=0
BEGIN
ROLLBACK TRAN
PRINT '借书失败。'
RETURN 3
END
UPDATE 学生信息
SET 借书册数=借书册数+1 --修改该读者的借书册数
WHERE 借书证号=@借书证号
IF @@error!=0
BEGIN
ROLLBACK TRAN
PRINT '更新学生信息失败。'
RETURN 4
END
COMMIT TRAN
PRINT '恭喜您借书成功!图书编号是:'+@图书编号
RETURN 0
END
ELSE
BEGIN
PRINT '图书已经借出或没有。'
RETURN 2
END

执行”借书过程’
USE 图书借阅管理
GO
EXEC 借书过程 '00006','大学英语(2)','李慧琴'

例2 编写“还书”存储过程,要求通过学生的“借书证号”和“图书编号”来完成还书过程。
还书操作:修改“租借信息”表中的“还书日期”,相应地将“图书信息”表中对应记录的“状态”列的值修改为0,“学生信息”表中“借书册数”减1。
CREATE PROC 还书
@借书证号varchar(5),@图书编号 varchar(6),@借书日期 datetime=null
AS
BEGIN TRAN
IF @还书日期 IS NOT NULL
UPDATE 租借信息SET 还书日期=@还书日期
WHERE 图书编号=@图书编号 AND 借书证号=@借书证号
ELSE
UPDATE 租借信息SET还书日期=getdate()
WHERE 图书编号=@图书编号 AND 借书证号=@借书证号
IF @@ERROR!=0 OR @@ROWCOUNT=0
BEGIN
ROLLBACK TRAN
PRINT ‘还书失败。’
RETURN 1
END
UPDATE 图书信息 SET 状态=0
WHERE图书编号=@图书编号
IF @@ERROR!=0 OR @@ROWCOUNT=0
BEGIN
ROLLBACK TRAN
PRINT ‘还书失败。’
RETURN 2
END
UPDATE 学生信息 SET 借书册数=借书册数-1
WHERE 借书证号=@借书证号
IF @@ERROR!=0 OR @@ROWCOUNT=0
BEGIN
ROLLBACK TRAN
PRINT ‘还书失败。’
RETURN 3
END
COMMIT
PRINT ‘恭喜你还书成功!’
RETURN 0

执行“还书”存储过程
EXECUTE 还书 ‘00006’,’100020’
返回结果:
恭喜你还书成功!