關於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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於SQLServer2005的學習筆記——多觸發器執行問題SQLServer筆記觸發器
- 關於觸發器在行級和語句級的執行順序問題觸發器
- 關於 Promise 的執行順序Promise
- MYSQL學習筆記11: DQL查詢執行順序MySql筆記
- 觸發器學習筆記觸發器筆記
- 關於SQLServer2005的學習筆記(一)——前言SQLServer筆記
- 關於SQLServer2005的學習筆記——XML的處理SQLServer筆記XML
- 關於SQLServer2005的學習筆記——生日問題SQLServer筆記
- 關於SQLServer2005的學習筆記——子查詢SQLServer筆記
- 關於SQLServer2005的學習筆記——分析函式SQLServer筆記函式
- 差分約束學習筆記筆記
- 關於SQLServer2005的學習筆記——樹形結構SQLServer筆記
- 關於defer執行順序問題
- 學習筆記:MySQL Cluster 的結果順序筆記MySql
- MySQL學習筆記——建立與約束MySql筆記
- 無順序約束的字串匹配問題字串匹配
- 關於describe和test執行順序的翻譯
- MySQL學習筆記之約束條件MySql筆記
- 關於SQLServer2005的學習筆記——自定義分組的實現SQLServer筆記
- 系統觸發器的應用順序(四)觸發器
- 系統觸發器的應用順序(三)觸發器
- 系統觸發器的應用順序(二)觸發器
- 系統觸發器的應用順序(一)觸發器
- 關於SQLServer2005的學習筆記——SQL查詢解析步驟SQLServer筆記
- SQL Server約束和DML觸發器的比較SQLServer觸發器
- 關於瀏覽器裡事件的捕獲和冒泡及監聽器執行的順序瀏覽器事件
- 關於SQLServer2005的學習筆記——異常捕獲及處理SQLServer筆記
- [演算法學習筆記] 差分約束演算法筆記
- RT-Thread學習筆記1-啟動順序與執行緒建立thread筆記執行緒
- JavaScript的執行順序JavaScript
- Erlang學習筆記(六)順序程式的錯誤處理筆記
- 關於Java中try-catch-finally-return的執行順序Java
- 關於SQLServer2005的學習筆記——臨時表、表變數和CTESQLServer筆記變數
- # 關於select關鍵字語句定義順序# 關於select關鍵字語句執行順序
- 聊聊如何讓springboot攔截器的執行順序按我們想要的順序執行Spring Boot
- CHECK約束中的NULL條件Null
- 順序表的學習
- 關於http(自己的學習筆記)HTTP筆記