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

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE 通常我们认为一条 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);

 

ID1改为修改为2,继续插入,提示违反了 UNIQUE KEY 约束 'UQ__TestTable__023D5A04'

INSERT INTO TestTable(ID,UniqueID,Number,NonNULL) VALUES(2,1,1,10);

 

UniqueID1改为修改为2,继续插入,提示NSERT 语句与 CHECK 约束"CK__TestTable__Numbe__03317E3D"冲突

INSERT INTO TestTable(ID,UniqueID,Number,NonNULL) VALUES(2,2,1,10);

 

Number1改成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

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6517/viewspace-624670/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/6517/viewspace-624670/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值