通常我们认为一条
Insert
就是一个事务,但这个事务是如何执行的呢?如果保障事务执行时该事务的完整性和一致性呢?抛开存储机制、索引、锁等环节,让我们看看约束、
Check
和触发器在这个过程中的先后顺序,或许能加深些对事务的理解。
CREATE
TABLE TestTable
(
ID
INT
CONSTRAINT
PK_TestTable_id PRIMARY KEY,
UniqueID
INT
UNIQUE,
Number
INT
CHECK (Number >= 10
AND Number<=100),
NonNULL
INT
NOT NULL
);
CREATE
TABLE LogTable
(
LogDesc
VARCHAR(50),
LogDate
DATETIME
);
CREATE
TRIGGER [TRI_TestTable] ON TestTable
AFTER
INSERT,UPDATE
AS
INSERT INTO LogTable
VALUES('TestTable',GETDATE());
|
验证步骤,第一步插入新值,
OK
INSERT INTO
TestTable(ID,UniqueID,Number,NonNULL) VALUES(1,1,11,10);
插入一条不满足所以约束和
Check
条件的记录,提示不能将值
NULL
插入列
'NonNULL'
INSERT INTO
TestTable(ID,UniqueID,Number,NonNULL) VALUES(1,1,1,NULL);
把
NULL
值修改为
10
,继续插入,提示违反了
PRIMARY KEY
约束
'PK_TestTable_id'
INSERT INTO
TestTable(ID,UniqueID,Number,NonNULL) VALUES(1,1,1,10);
把
ID
从
1
改为修改为
2
,继续插入,提示违反了
UNIQUE KEY
约束
'UQ__TestTable__023D5A04'
INSERT INTO
TestTable(ID,UniqueID,Number,NonNULL) VALUES(2,1,1,10);
把
UniqueID
从
1
改为修改为
2
,继续插入,提示
NSERT
语句与
CHECK
约束
"CK__TestTable__Numbe__03317E3D"
冲突
INSERT INTO
TestTable(ID,UniqueID,Number,NonNULL) VALUES(2,2,1,10);
把
Number
从
1
改成
11
,插入
OK
INSERT INTO
TestTable(ID,UniqueID,Number,NonNULL) VALUES(2,2,11,10);
注意以上只有执行成功后,才会执行触发器;而如果某个环节失败,整个事务回滚。
再次修改触发器,注意本处是把
Number
设置为
1
,来判断触发器执行后,是否仍需要进行
Check
和约束判断
ALTER
TRIGGER [TRI_TestTable] ON TestTable
AFTER
INSERT,UPDATE
AS
DECLARE @ID INT,@UniqueID INT,@Number
INT,@NonNULL INT
SELECT
@ID=ID,@UniqueID=UniqueID,@Number=Number,@NonNULL=NonNULL
FROM INSERTED
SET @Number=1
SET @NonNULL=NULL
INSERT INTO LogTable
VALUES('TestTable',GETDATE());
UPDATE TestTable SET Number=@Number,NonNULL=@NonNULL
WHERE ID=@ID
|
再执行符合所有约束和
Check
条件的语句
INSERT INTO
TestTable(ID,UniqueID,Number,NonNULL) VALUES(3,3,10,10);
提示消息
515
,级别
16
,状态
2
,过程
TRI_TestTable
,第
9
行
不能将值
NULL
插入列
'NonNULL'
,表
'test.dbo.TestTable'
;列不允许有空值。
UPDATE
失败。
SELECT * FROM TestTable
SELECT * FROM LogTable
由此可以看出
Insert
语句执行时首先验证约束,同时约束本身也有先后顺序
1
、验证非空约束
2
、验证主键约束
3
、验证唯一性约束
再次验证相关
Check
最后执行触发器,如果触发器中也必须保证不违反相关约束和
Check
分享到:
相关推荐
sql server 2005学习笔记之触发器 很全 说的很详细
sqlserver2005学习笔记之触发器简介.pdf
SQL Server 2005深入内幕——开发人员,最大的赢家:SQL Server 2005全新的开发特性.pdf
sqlserver2005触发器sqlserver2005触发器sqlserver2005触发器
以sql server 2005为例介绍如何通过管理器和T-SQL创建触发器。
笔记是本人学习SQLServer一段时间后重新整理出来的,适合有一些入门基础的人学习。 ├─01 安装及使用 │ SQLServer2005安装及使用.txt │ ├─02 常用函数 │ function.sql │ ├─03 建表、建库 │ create.sql ...
SQL server 2008
/*------存储1 根据用户输入该学生编号,检查是否存在,若存在则显示出*/ Create procedure p1 @sno char(10) ,@sname char(10),@ssex char(2),@borndate datetime,@classname varchar(50) As Begin ...
资源名称:SQL Server 2012王者归来——基础、安全、开发及性能优化内容简介:本书由浅入深,全面细致地讲述了SQL Server 2012的功能特性和开发应用。从SQL Server数据库基础到数据库安全,再到SQL Server开发及...
SQL SERVER 2008 学习笔记:日常维护、深入管理、性能优化。
SQL server 2005 学习笔记,完全适合新手从最基础开始学习!
sql server 2005学习笔记,word文档形式!
创建满足下述要求的存储过程,并查看存储过程的执行结果。.创建满足下述要求的触发器,并验证触发器执行情况。
sqlserver个人学习笔记
这个学习笔记是观看郝斌老师的视频自己的一点心得
sql server 用语句停用全部触发器, 也可启用全部触发器
1CTO下载-SQL Server 2005编程入门经典-触发器和存储过程教程 pdf.rar
SQLServer2005_BC 32/64位 向后兼容兼容补丁
SQL Server2008中级联的实现原理探讨——以触发器为例.pdf
SQL Server中约束与触发器差异比较.pdf