这里有新鲜出炉的 SQL Server 教程,程序狗速度看过来!
SQL 是英文 Structured Query Language 的缩写,意思为结构化查询语言。SQL 语言的主要功能就是同各种数据库建立联系,进行沟通。按照 ANSI(美国国家标准协会) 的规定,SQL 被作为关系型数据库管理系统的标准语言。
SQL Server 即 Microsoft SQL Server 。
触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。本篇文章讲诉了 SQL Server:触发器实例,有兴趣的可以了解一下。
1. 概述
触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。 所以触发器可以用来实现对表实施复杂的完整性约束。
2. 触发器的分类
SQL Server2000 提供了两种触发器:"Instead of" 和 "After" 触发器。
一个表或视图的每一个修改动作 (Insert、Update 和 Delete) 都可以有一个 "Instead of" 触发器,一个表的每个修改动作都可以有多个 "After" 触发器。
2.1 "Instead of" 触发器
- alter trigger trigger_学生_Delete
- on学生
- instead of Delete
- as
- begin
- select学号,
- 姓名from deleted
- end
- delete from学生where学号 = 4
上例中定义了 "trigger 学生_Delete" 触发器,该触发器从 "delete" 表中打印出所要删除的学生. 在执行 "delete" 操作后,会发现 "学号 = 4" 的学生并未被删除, 原因在于 "trigger 学生 Delete" 替代了所要执行的 "delete from 学生 where 学号 = 4" 语句,而在 "trigger 学生_Delete" 中并未真正删除学生。
2.2 "After" 触发器
3. Inserted 和 Deleted 表
SQL Server 为每个触发器都创建了两个专用表: Inserted 表和 Deleted 表。
对表的操作 | Inserted 逻辑表 | Deleted 逻辑表 |
---|---|---|
增加记录(insert) | 存放增加的记录 | 无 |
删除记录(delete) | 无 | 存放被删除的记录 |
修改记录(update) | 存放更新后的记录 | 存放更新前的记录 |
4. 触发器的执行过程
5. 创建触发器
- create trigger trigger_name
- on {table_name|view_name}
- {After|Instead of} {insert|update|delete}
- as 相应T-SQL语句
6. 修改触发器:
- alter trigger trigger_name
- on {table_name|view_name}
- {After|Instead of} {insert|update|delete}
- as 相应T-SQL语句
7. 删除触发器:
- drop trigger trigger_name
8. 查看数据库中已有触发器:
8.1 查看数据库中所有触发器
- select * from sysobjects where xtype = 'TR'
8.2 查看单个触发器
- exec sp_helptext '触发器名'
9. "Instead of" 相关示例:
两张表:学生 (学号 int, 姓名 varchar)、借书记录 (学号 int, 图书编号 int)
实现功能:在删除学生表时,如果该学生仍有借书记录(未还)则不能删除
- alter trigger trigger_学生_Delete
- on学生
- instead of Delete
- as
- begin
- if not exists(select * from借书记录, deleted where借书记录.学号 = deleted.学号)
- delete from学生where学生.学号 in (select学号from deleted)
- end
10. "After" 触发器
10.1 在 "订单" 表中建立触发器,当向 "订单" 表中插入一条订单记录时,检查 "商品" 表的货品状态 "状态" 是否为 1(正在整理),则不能往 "订单" 表加入该订单。
- create trigger trigger_订单_insert
- on订单
- after insert
- as
- if (select状态from商品, inserted where商品.pid = inserted.pid) = 1
- begin
- print 'the goods is being processed'
- print 'the order cannot be committed'
- rollback transaction--回滚,避免加入
- end
10.2 在 "订单" 表建立一个插入触发器,在添加一条订单时,减少 "商品" 表相应的货品记录中的库存。
- create trigger trigger_订单_insert2
- on订单
- after insert
- as
- update商品set数量 = 数量 - inserted.数量
- from商品,
- inserted
- where商品.pid = inserted.pid
10.3 在 "商品" 表建立删除触发器,实现 "商品" 表和 "订单" 表的级联删除。
- create trigger goodsdelete trigger_商品_delete
- on商品
- after delete
- as
- delete from订单where订单.pid in (select pid from deleted)
10.4 在 "订单" 表建立一个更新触发器,监视 "订单" 表的 "订单日期" 列,使其不能被 "update".
- create trigger trigger_订单_update
- on订单
- after update
- as
- if update(订单日期)
- begin
- raiserror('订单日期不能手动修改', 10, 1)
- rollback transaction
- end
10.5 在 "订单" 表建立一个插入触发器,保证向 "订单" 表插入的货品必须要在 "商品" 表中一定存在。
- create trigger trigger_订单_insert3
- on订单
- after insert
- as
- if (select count( * ) from商品, inserted where商品.pid = inserted.pid) = 0
- begin
- print '商品不存在'
- rollback transaction
- end
10.6 "订单" 表建立一个插入触发器,保证向 "订单" 表插入的货品信息要在 "订单日志" 表中添加
- alter trigger trigger_订单_insert
- on 订单
- for insert
- as
- insert into 订单日志 select inserted.Id, inserted.pid,inserted.数量 from inserted
来源: http://www.phperz.com/article/17/0822/339187.html