怎么用SQL server 2000 和VB 做一个存储过程和触发器的例子

2024-12-23 01:32:13
推荐回答(1个)
回答1:

1. 和特定表或视图关联。触发器定义在特定的表或视图上,称为触发器表或触发器视图2. 自动调用。当试图在某个表插入、更新或删除数据,而在那个表上定义了针对所做动作的触发器,那么触发器会自动执行3. 不能被直接调用。不像普通的存储过程,触发器不能被直接调用,也不传递或接受参数4. 是一个事务的部分。触发器及触发它的语句被视为单个事务,可以在触发器内的任何地方被回滚二、创建触发器创建触发器,触发器是一种特殊的存储过程,在用户试图对指定的表执行指定的数据修改语句时自动执行。Microsoft�0�3 SQL Server�6�4 允许为任何给定的 INSERT、UPDATE 或 DELETE 语句创建多个触发器。1.语法CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { FOR|AFTER|INSTEAD OF}{[INSERT][,][UPDATE]}ASsql_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 DELETEAS PRINT '触发器已执行!' 2.在“租借信息表”上创建 INSERT触发器“借阅册数”,如果“允借册数”为0,就不能再借了。CREATE TRIGGER 借阅册数 ON 借阅AFTER INSERTASIF (SELECT 允借册数 FROM 读者,inserted WHERE 读者.借书证号=inserted.借书证号)=0BEGIN PRINT '你可借书的册数为0,不能再借图书了' ROLLBACK TRANSACTIONEND3.在“租借信息”表上创建 INSERT触发器“借书期限”,如果学生借书时间超过30天则不能借书。CREATE TRIGGER 借书期限 ON 租借信息 AFTER INSERTAS IF EXISTS(SELECT * FROM 租借信息,inserted WHERE 租借信息.借书证号=inserted.借书证号 AND (GETDATE())-租借信息.借书日期)>30 AND 租借信息.还书日期 IS NULL)BEGIN PRINT '你有超期未还的图书,不能再借图书了!' ROLLBACK TRANSACTIONEND存储过程的应用举例 例1 创建一个“借书过程”存储过程,该存储过程实现的功能是帮助读者完成借书过程。即读者只要提供借书证号、图书名称和图书的作者,就能完成借书。该程序完成的具体操作是:根据读者所提供的图书名称和作者,在图书信息表中进行查询,如果该书未被借出则继续完成借书操作,否则提示读者图书已经惜出。借书操作主要包括三个操作:向“租借信息”表中插入一条记录(保存该读者的借书信息),将“图书信息”表中对应记录的状态列设为1(避免他人再惜),将“学生信息”表中对应记录的借书册数增1(统计该读者的借书册数)。这三个操作要么都执行,要么都不执行。USE 图书借阅管理GOCREATE 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 图书借阅管理GOEXEC 借书过程 '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 ‘恭喜你还书成功!