關於SQLServer2005的學習筆記——約束、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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6517/viewspace-624670/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於 Promise 的執行順序Promise
- MYSQL學習筆記11: DQL查詢執行順序MySql筆記
- 差分約束學習筆記筆記
- 關於describe和test執行順序的翻譯
- MySQL學習筆記——建立與約束MySql筆記
- RT-Thread學習筆記1-啟動順序與執行緒建立thread筆記執行緒
- 聊聊如何讓springboot攔截器的執行順序按我們想要的順序執行Spring Boot
- # 關於select關鍵字語句定義順序# 關於select關鍵字語句執行順序
- 關於瀏覽器裡事件的捕獲和冒泡及監聽器執行的順序瀏覽器事件
- pipeline的執行順序
- [演算法學習筆記] 差分約束演算法筆記
- Spring Aop的執行順序Spring
- mysql 中sql語句關鍵字的書寫順序與執行順序MySql
- 【高併發】深入理解執行緒的執行順序執行緒
- 順序表的學習
- 關於http(自己的學習筆記)HTTP筆記
- Myth 關於Git的學習筆記Git筆記
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- Xilinx約束學習筆記(二)—— 定義時鐘筆記
- Android學習 —— 測試init.rc中的條件觸發的處理順序Android
- 聊一下Button事件、命令、行為的觸發順序事件
- SQL 語句的執行順序SQL
- mysql 語句的執行順序MySql
- PostgreSQLrotatetable自動清理排程-約束,觸發器SQL觸發器
- 一道setTimeout async promise執行順序的筆試題引發的思考Promise筆試
- 關於RocketMQ的順序訊息MQ
- Sql執行順序SQL
- 不合理的執行順序引發的死鎖
- java繼承關係下執行順序Java繼承
- 關於MQ的幾件小事(五)如何保證訊息按順序執行MQ
- 路由的中介軟體執行順序路由
- SQL查詢關鍵字執行順序及記憶口訣SQL
- Solidity語言學習筆記————8、運算子優先順序Solid筆記
- MySQL學習筆記4:完整性約束限制欄位MySql筆記
- JavaScript執行順序分析JavaScript
- mySQL 執行語句執行順序MySql
- 令人費解的 async/await 執行順序AI
- SQL語句各子句的執行順序SQL
- Java之執行緒的優先順序Java執行緒