关于SQLServer2005的学习笔记——约束、Check、触发器的执行顺序
2010-01-08 14:12
549 查看
通常我们认为一条
Insert
就是一个事务,但这个事务是如何执行的呢?如果保障事务执行时该事务的完整性和一致性呢?抛开存储机制、索引、锁等环节,让我们看看约束、
Check
和触发器在这个过程中的先后顺序,或许能加深些对事务的理解。
验证步骤,第一步插入新值,
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
和约束判断
再执行符合所有约束和
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
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
相关文章推荐
- 关于SQLServer2005的学习笔记——约束、Check、触发器的执行顺序
- 关于SQLServer2005的学习笔记——约束、Check、触发器的执行顺序
- 关于SQLServer2005的学习笔记——多触发器执行问题
- 关于SQLServer2005的学习笔记——多触发器执行问题
- 关于SQLServer2005的学习笔记——系统触发器
- 关于SQLServer2005的学习笔记——系统触发器
- 关于继承构造函数执行顺序、override及new如何执行的学习笔记
- 嵌入式学习笔记--关于ARM中SWP指令的执行顺序问题【待验证】
- 11. SQL -- 约束、Check、触发器的执行顺序
- 关于SQLServer2005的学习笔记 XML的处理
- 关于SQLServer2005的学习笔记——统计学自动分组问题
- 【jQuery学习笔记】关于jQuery1.6.1版的ajaxstart不执行问题解决方案
- 关于SQLServer2005的学习笔记——分析函数
- 关于SQLServer2005的学习笔记—异常捕获及处理
- javascript学习笔记--javascript执行顺序详解
- [原创]java WEB学习笔记45:自定义HttpFilter类,理解多个Filter 代码的执行顺序,Filterdemo:禁用浏览器缓存的Filter,字符编码的Filter,检查用户是否登陆过的Filter
- 关于SQLServer2005的学习笔记——临时表、表变量和CTE
- 关于SQLServer2005的学习笔记——自定义分组的实现
- 关于SQLServer2005的学习笔记(一)——前言
- Linux学习笔记--命令的顺序执行、管道符、通配符、其他特殊符号