码迷,mamicode.com
首页 > 数据库 > 详细

11. SQL -- 约束、Check、触发器的执行顺序

时间:2015-03-21 21:28:44      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:触发器

让我们看看约束、 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


本文出自 “Ricky's Blog” 博客,请务必保留此出处http://57388.blog.51cto.com/47388/1622854

11. SQL -- 约束、Check、触发器的执行顺序

标签:触发器

原文地址:http://57388.blog.51cto.com/47388/1622854

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!