您的位置:首页 > 数据库

关于SQLServer2005的学习笔记——约束、Check、触发器的执行顺序

2010-01-08 14:12 549 查看
通常我们认为一条
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: