Chapter 5. 事务、触发器、存储过程
=====事务=====
使用事务来保证多条SQL语句同时执行成功或者同时执行失败
1、打开一个事务:begin transaction
2、只要有任何一条SQL语句执行出错,最后的结果就会出错
程序回滚:rollback transaction
3、如果没有出错
提交该事务:commit transaction
使用@error全局变量来判断是否出错
分类:
自动提交事务:
当执行语句时,数据库自动打开事务,不出错数据库自动提交事务,出错数据库自动回滚
隐式事务:
每次执行一条SQL语句的时候,数据库自动打开一个事务,但是需要手动提交或者回滚事务
语法:set implicit_transaction (on / off)
显示事务:
每次执行一条SQL语句的时候,需要手动打开事务,手动提交事务或者回滚事务
begin tran
...
commit tran
...
rollback tran
ACID特性:
原子性:事务必须是原子工作单元;对于其数据修改,要么全部执行,要么全部不执行
一致性:在事务执行之前和执行之后,数据保持一致
隔离性:由并发事务所作的修改必须与任何其他并发事务所做的修改隔离
持久性:事务完成后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
====== 存储过程 ======
和C#里的方法一样,由存储过程名、存储过程参数组成,可以有返回值。
if else、while、变量、insert、select都可以在存储过程中使用
优点:
执行速度更快:在数据中保存的存储过程语句都是编译过的
允许模块化程序设计:类似方法的复用
提高系统安全性:防止SQL注入
减少网络流通量:只要传输、存储过程的名称
分类:
系统存储过程:sp_ ...
1、返回当前实例中的所有数据库的基本信息
sp_database
2、返回当前数据库中的所有的表
sp_table
3、返回某个表下的所有的列
sp_columns 列名
4、查看某个存储过程
sp_helptext '...'
自定义存储过程:usp_ ...
create proc 名称 --创建
as
begin
语句
end
exec proc 名称 --调用
drop proc 名称 --删除
===== 触发器 =====
作用:自动化操作,减少了手动操作以及出错的几率
触发器是一种特殊类型的存储过程,不同于前面介绍的一般的存储过程。(在SQL内部把触发器看作是存储过程但是不能传递参数)
一般的存储过程通过存储过程名称被直接调用,而触发器主要是通过事件进行触发而被执行。
触发器是一个功能强大的工具,在表中数据发生变化时自动强制执行。
触发器可以用于SQL Server约束、默认值和规则的完整性检查,还可以完成难以用普通约束实现的复杂功能。
在SQL Server里,触发器就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。
分类:
DML触发器:
insert 执行插入操作,使用inserted表
delete 执行删除操作,使用deleted表
update 执行更新操作,同时使用inserted和deleted表
after(for)在语句执行完毕之后触发,按语句触发,而不是所影响的行数,
无论所影响多少行,只触发一次。可以递归触发,最高32级
instead of 用来替换原来的操作,不会递归触发,可以在约束被检查之前触发
DDL触发器:
create table
create database
alter
drop