关于SQLServer2005的学习笔记——约束、Check、触发器的执行顺序
来源:互联网 发布:算法导论第四版 豆瓣 编辑:程序博客网 时间:2024/05/19 23:57
通常我们认为一条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 INTOTestTable(ID,UniqueID,Number,NonNULL) VALUES(1,1,11,10);
插入一条不满足所以约束和Check条件的记录,提示不能将值NULL插入列'NonNULL'
INSERT INTOTestTable(ID,UniqueID,Number,NonNULL) VALUES(1,1,1,NULL);
把NULL值修改为10,继续插入,提示违反了PRIMARY KEY约束'PK_TestTable_id'
INSERT INTOTestTable(ID,UniqueID,Number,NonNULL) VALUES(1,1,1,10);
把ID从1改为修改为2,继续插入,提示违反了UNIQUE KEY约束'UQ__TestTable__023D5A04'
INSERT INTOTestTable(ID,UniqueID,Number,NonNULL) VALUES(2,1,1,10);
把UniqueID从1改为修改为2,继续插入,提示NSERT语句与CHECK约束"CK__TestTable__Numbe__03317E3D"冲突
INSERT INTOTestTable(ID,UniqueID,Number,NonNULL) VALUES(2,2,1,10);
把Number从1改成11,插入OK
INSERT INTOTestTable(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 INTOTestTable(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、触发器的执行顺序
- 关于SQLServer2005的学习笔记——约束、Check、触发器的执行顺序
- 关于SQLServer2005的学习笔记——多触发器执行问题
- 关于SQLServer2005的学习笔记——系统触发器
- 关于SQLServer2005的学习笔记——XML的处理
- 关于SQLServer2005的学习笔记——XML的处理
- 关于SQLServer2005的学习笔记——XML的处理
- 关于SQLServer2005的学习笔记——XML的处理
- 关于SQLServer2005的学习笔记(一)——前言
- 关于SQLServer2005 的学习笔记(一)——前言
- 关于SQLServer2005的学习笔记——子查询
- 关于SQLServer2005的学习笔记——分析函数
- 关于SQLServer2005的学习笔记——树形结构问题
- 关于SQLServer2005的学习笔记——生日问题
- 关于SQLServer2005的学习笔记——生日问题
- --SQLServer2005中查询语句的执行顺序
- Form触发器的执行顺序
- 关于SQLServer2005的学习笔记——自定义分组的实现
- xmarks
- linux文件IO之整理笔记(一)
- 读文献Accelerating molecular dynamics simulations using Graphics Processing Units with CUDA
- 必须掌握的八个DOC命令
- js 相关内容
- 关于SQLServer2005的学习笔记——约束、Check、触发器的执行顺序
- .NET的那些事儿(10)——利用C#.NET进行串口编程
- java学习之路
- (转载)Windows下gvim配置
- 五个不太为人知的ESC键妙用法
- 如何解决Tomcat下中文乱码问题?
- delphi 生成xml 方法 与 delphi txt文件操作
- js代码压缩/解压程序(转)
- C#读写Access数据库的OLE对象字段