加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 15:27:17 所属栏目:MsSql教程 来源:网络整理
导读:通常我们认为一条 Insert 就是一个事务,但这个事务是如何执行的呢?如果保障事务执行时该事务的完整性和一致性呢?抛开存储机制、索引、锁等环节,让我们看看约束、 Check 和触发器在这个过程中的先后顺序,或许能加深些对事务的理解。 ? CREATE TABLE Test
通常我们认为一条 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,NULL); ? 把 NULL 值修改为 10 ,继续插入,提示违反了 PRIMARY KEY 约束 'PK_TestTable_id' INSERT INTO TestTable(ID,10); ? 把 ID 从 1 改为修改为 2 ,继续插入,提示违反了 UNIQUE KEY 约束 'UQ__TestTable__023D5A04' INSERT INTO TestTable(ID,NonNULL) VALUES(2,10); ? 把 UniqueID 从 1 改为修改为 2 ,继续插入,提示 NSERT 语句与 CHECK 约束 "CK__TestTable__Numbe__03317E3D" 冲突 INSERT INTO TestTable(ID,2,10); ? 把 Number 从 1 改成 11 ,插入 OK INSERT INTO TestTable(ID,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,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读