关于SQLServer2005的学习笔记——约束、Check、触发器的执行顺序-阿里云开发者社区

开发者社区> 云计算> 正文
登录阅读全文

关于SQLServer2005的学习笔记——约束、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





本文转自baoqiangwang51CTO博客,原文链接:http://blog.51cto.com/baoqiangwang/310460,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
云计算
使用钉钉扫一扫加入圈子
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

其他文章