通常我们认为一条 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
 

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

  1. MySQL 学习笔记(17)— SQL 执行顺序

    以查询语句为例,我们看下面的查询语句: (6)SELECT [DISTINCT | ALL] col1, col2, agg_func(col3) AS alias (1) FROM t1 JOIN ...

  2. oracle 触发器登录,【学习笔记】Oracle触发器 实现指定用户登录oracle案例

    天萃荷净 触发器实现指定用户登录oracle,分享一篇关于Oracle数据库安全策略,通过Oracle触发器实现限定user用户登录Oracle数据库的方法 1.创建允许登录用户表 CREATE TA ...

  3. 【Verilog学习笔记】D触发器(门级和行为级)+4位寄存器+一个完整的激励程序

    [Verilog学习笔记]D触发器(门级和行为级)+4位寄存器+一个完整的激励程序 首先展示以下完整的程序 `timescale 1ns / 1psmodule hardreg( input wire ...

  4. MySQL学习笔记-约束以及修改数据表

    MySQL学习笔记-约束以及修改数据表 约束: 按功能划为: NOT NULL , PRIMARY KEY , UNIQUE KEY , DEFAULT , FOREIGN KEY 按数据列的数目划为 ...

  5. oracle 一个表上的多个触发器的执行顺序

    oracle 一个表上的多个触发器的执行顺序如下: before statement trigger->before row trigger->after row trigger-> ...

  6. MySQL学习笔记 05、触发器、存储过程、存储函数、定时任务

    文章目录 前言 一.触发器 提前准备测试表 1.1.创建触发器 1.2.删除触发器 二.存储过程 2.1.认识变量 2.1.1.系统变量 2.1.2.用户变量 2.2.存储过程创建 2.3.删除存储过 ...

  7. 【多线程编程学习笔记6】终止线程执行,千万别踩这个坑!

    申明:本学习笔记是在该教程的基础上结合自己的学习情况进行的总结,不是原创,想要看原版的请看C语言中文网的多线程编程(C语言+Linux),该网站有很多好的编程学习教程,尤其是关于C语言的. 在< ...

  8. ClickHouse学习笔记(二):执行计划、建表优化、语法优化规则、查询优化、数据一致性

    本文档基于目前较新稳定版21.7.3.14 一.Explain查看执行计划 在ClickHouse 20.6版本之前要查看SQL语句的执行计划需要设置日志级别为trace才能可以看到,并且只能真正执行 ...

  9. 【CS学习笔记】19、代码执行的方式

    0x00 前言 实现代码执行的四个步骤: 1.与目标建立信任关系 2.复制可执行文件到目标上 3.在目标上运行可执行文件 4.实现对目标的控制 以上是根据视频教程中直译的结果,个人感觉其实这一节叫横向 ...

最新文章

  1. 2021北师大丰台实验高考成绩查询,2020北京丰台区中考各高中录取分数线公布
  2. spark端口实验总结:
  3. 基于事件驱动架构构建微服务第11部分:持续集成
  4. Ubuntu环境使用conda安装轻量级中文ocr开源项目chineseocr_lite,最简单的方式
  5. java中import机制(指定import和import *的区别)
  6. WebSocket使用sendObject(Object arg0)向页面方法发送对象
  7. 当遭遇TCP洪水(SYN Flood)后的的诊断思路和处理过程
  8. Intellij IDEA 中的 Debug 控制台输出窗口消失
  9. apk逆向思路_Java语言的逆向(Android APP)
  10. 语音社交app源码中音频混音的实现步骤
  11. 毕业半年,点滴在心中
  12. 【hud3966】树剖模板05
  13. 数理统计(四)-方差分析及回归分析:总变差分解【总变差=方差+效应A平方和+效应B平方和+AB交互效应平方和】、线性回归模型、回归方程、残差、残差平方和、σ的无偏估计、多元线性回归模型、非线性回归模型
  14. 五子棋棋谱16*16c语言,五子棋开局棋谱大全
  15. IP-guard V4 服务器迁移方法
  16. PPC关闭和切换程序小软件收集
  17. 苹果xr配置_iPhone11和XR到底谁性价比高?一文看懂
  18. 汉堡王什么汉堡好吃_KFC、汉堡王、麦当劳:谁家汉堡最适合减肥时吃?
  19. 【百度地图】——百度地图API获取经纬度、地址及周边兴趣点
  20. 1048. 数字加密(20)

热门文章

  1. android 多个占位符,Android多语言支持:由于占位符计数不同导致的字符串格式问题...
  2. 联想r720内存频率_联想 IdeaPad14s 2020 轻薄本双十一促销
  3. 4块硬盘做raid几_HP-P4500存储RAID硬盘离线数据恢复案例
  4. Tomcat软件的目录结构、作用
  5. 1小时学会:最简单的iOS直播推流(二)代码架构概述
  6. iOS进阶之页面性能优化
  7. 移动磁盘由于IO设备错误,要怎样寻回文件
  8. SQLite与pandas
  9. Struts2基础(1)_MVC
  10. RequisitePro SQL SERVER数据库的配置