SQL server 触发器
2015-11-25 14:39
134 查看
1、触发器
触发器:触发器为特殊类型的存储过程,可在执行语言事件时自动生效。SQL Server 包括三种常规类型的触发器:DML 触发器、DDL 触发器和登录触发器。
当服务器或数据库中发生数据定义语言 (DDL) 事件时将调用 DDL 触发器。登录触发器将为响应 LOGON 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。
当 数据库中发生数据操作语言 (DML) 事件时将调用 DML 触发器。DML 事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。DML 触发器可以查询其他表,还可以包含复杂的 Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误(例如,磁盘空间不足),则整个事务即自动回滚。
主要讲述DML触发器,DML触发器有两种:AFTER(FOR),INSTEAD OF触发器,同时DML 触发器使用 deleted 和 inserted 逻辑(概念)表。 它们在结构上类似于定义了触发器的表,即对其尝试执行了用户操作的表。 在 deleted 和 inserted 表保存了可能会被用户更改的行的旧值或新值。
对于INSERT 操作,inserted保留新增的记录,deleted无记录
对于DELETE 操作,inserted无记录,deleted保留被删除的记录
对于UPDATE操作,inserted保留修改后的记录,deleted保留修改前的记录
示例一:DELETE触发器的创建和执行,用的Instead Of
![](http://images2015.cnblogs.com/blog/828242/201511/828242-20151125102840156-1606376365.png)
示例二:insert添加一条数据,inserted表示新添加的数据,从中获取教师编号,并且根据教师编号来查看是男是女,调换男女
![](http://images2015.cnblogs.com/blog/828242/201511/828242-20151126091056140-2026801702.png)
示例三:在忘记触发器的名字时,可以通过下面的语句来进行禁用或启用触发器。
![](http://images2015.cnblogs.com/blog/828242/201511/828242-20151127202100296-446664542.png)
2、数据库事务
数据库事务(Database Transaction) 是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。
设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作:
更新客户所购商品的库存信息--保存客户付款信息--可能包括与银行系统的交互--生成订单并且保存到数据库中
更新用户相关信息,例如购物数量等等 正常的情况下,这些操作将顺利进行,最终交易成功,与交易相关的所有数据库信息也成功地更新。但是,如果在这一系列过程中任何一个环节出了差错,例如在更新商品库存信息时发生异常、该顾客银行帐户存款不足等,都将导致交易失败。一旦交易失败,数据库中所有信息都必须保持交易前的状态不变,比如最后一步更新用户信息时失败而导致交易失败,那么必须保证这笔失败的交易不影响数据库的状态--库存信息没有被更新、用户也没有付款,订单也没有生成。否则,数据库的信息将会一片混乱而不可预测。
数据库事务正是用来保证这种情况下交易的平稳性和可预测性的技术。
begin tran (或transaction) --开始事务
commit --提交事务
rollback --回滚事务
@@ERROR 是判断事务有没有错的条件,无错时值为0,有错时值不为0。
![](http://images2015.cnblogs.com/blog/828242/201511/828242-20151127210409156-676901128.png)
3、创建三个表并写一个简单的存储过程,要求可以进货、出货并打印小票。
(1)在进货时,没有此商品,直接添加,有此商品,添加进货数量
(2)出货时,有此商品并且数量充足,可以直接减去总数,不够的时候,货物量不够,请及时补充
(3)出货时,没有此商品,print没有此商品
表一:供应商 gongying供应商编号gcode int 主键 从1001开始,依次加1
供应商名称gname varchar(50)
供应商联系电话gtel varchar(50)
表二: 仓库表 cangku
产品编号ccode int 主键10001
产品名称cname varchar(50)
产品价格cprice decimal(18,2)
产品数量cshu int
供货商的编号 cgcode int 外键(供应商表的编号)
表三: 小票表 piao
小票编号pcode int 从100000001开始依次加1
产品名称pname varchar(50)
产品单价pprice decimal(18,2)
产品数量pshu int
产品总价pzong decimal
![](http://images2015.cnblogs.com/blog/828242/201511/828242-20151125143523562-1839869829.png)
![](http://images2015.cnblogs.com/blog/828242/201511/828242-20151125143531609-598134358.png)
![](http://images2015.cnblogs.com/blog/828242/201511/828242-20151125143628546-1403558007.png)
![](http://images2015.cnblogs.com/blog/828242/201511/828242-20151125143636781-2021920885.png)
![](http://images2015.cnblogs.com/blog/828242/201511/828242-20151125153053406-1814248608.png)
![](http://images2015.cnblogs.com/blog/828242/201511/828242-20151125153103343-1256995096.png)
![](http://images2015.cnblogs.com/blog/828242/201511/828242-20151125153109765-623280253.png)
![](http://images2015.cnblogs.com/blog/828242/201511/828242-20151125153121187-898820131.png)
![](http://images2015.cnblogs.com/blog/828242/201511/828242-20151125153130327-447081456.png)
相关文章推荐
- Mysql 学习笔记之索引篇
- C#定制Excel界面并实现与数据库交互的方法
- 地区省份城市sql信息
- redis模拟微博用户关系
- Oracle数据导入导出命令!
- MySQL导出导入数据
- 高性能MySQL第15章备份恢复
- Mos针对oracle 10g以后一个不错的检查和建议UNDO设置的脚本
- 云主机安装postfix,dovecot,mysql,tomcat,memcached,maven包发布
- MySQL对索引的使用
- MySQL中表的复制以及大型数据表的备份教程
- ORACLE_AQ 队列
- oracle表设置主键自增长
- 破解C++ Redistributable Package版本之谜
- 数据库版本管理工具flyway的使用心得
- MYSQL 函数调用导致自动生成共享锁问题
- MySQL运行状态show status中文详解
- oracle SQL语句心得
- MySQL数据库参数调优方法
- 关于mysql函数GROUP_CONCAT 需要注意的地方