1. 程式人生 > >關於SQLServer2005的學習筆記——約束、Check、觸發器的執行順序

關於SQLServer2005的學習筆記——約束、Check、觸發器的執行順序

通常我們認為一條 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 [email protected],[email protected] WHERE [email protected]

再執行符合所有約束和 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

相關推薦

Jmeter學習筆記2-原件作用域與執行順序

校驗 height sse proc tro 有效 收集 技術分享 控制 1.元件的作用域 (1)配置元件(config elements):會影響其作用範圍內的所有元件。 (2)前置處理程序(per-processors):在其作用範圍內的每一個sampler元件之

關於SQLServer2005學習筆記——約束Check觸發器執行順序

通常我們認為一條 Insert 就是一個事務,但這個事務是如何執行的呢?如果保障事務執行時該事務的完整性和一致性呢?拋開儲存機制、索引、鎖等環節,讓我們看看約束、 Check 和觸發器在這個過程中的先後順序,或許能加深些對事務的理解。 CREATE TABLE Te

二十一Oracle學習筆記:編寫函式和觸發器

一、函式或過程的選擇     1.如果要進行DML(增刪改),選擇儲存過程     2.如果沒有DML,選擇函式     二、函式 1.格式 create or replace function 函式名(引數1 型別,引數2 型別, 。。。) return

學習筆記TF016:CNN實現數據集TFRecord加載圖像模型訓練調試

quest oba lose 神經元 byte 足夠 jpg eight 值轉換 AlexNet(Alex Krizhevsky,ILSVRC2012冠軍)適合做圖像分類。層自左向右、自上向下讀取,關聯層分為一組,高度、寬度減小,深度增加。深度增加減少網絡計算量。 訓練模

學習筆記TF020:序列標註手寫小寫字母OCR數據集雙向RNN

step session 兩個 手寫體 line 調整 seq cal 預測 序列標註(sequence labelling),輸入序列每一幀預測一個類別。OCR(Optical Character Recognition 光學字符識別)。 MIT口語系統研究組Rob Ka

【安全牛學習筆記】補充Proxytunnelstunnel4

security+ 信息安全 stunnel4 無需修改源代碼的情況下降TCP流量封裝與SSL通道內適用於本身不支持加密傳輸的應用 支持openssl安全特性

AngularJS2學習筆記 ——環境搭建(win7vs2012)

重新 registry 報錯 win7 win 今天 alt 解決 index 時代在發展,沒有純粹的後端,想要高工資還是要多學習一個的。不廢話了,直奔主題。 AngularJS發展到現在已出到AngularJS4了。大致分為AngularJS1.x、AngularJS

【安全牛學習筆記】XSS-簡介跨站腳本檢測和常見的攻擊利用手段

信息安全 security+ xss XSS攻擊WEB客戶端客戶端腳本語言 彈窗警告、廣告 Javascript 在瀏覽器中執行XSS(cross-site scripting) 通過WEB站點漏洞,向客戶端交付惡意腳本代碼,實現對客戶端的攻擊目的 註入客戶端腳本代碼

【安全牛學習筆記】XSS-簡介跨站腳本檢測和常見的攻擊利用手段2

信息安全 security+ xss ╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋┃XSS ┃┃攻擊WEB客戶端

python學習筆記(五):裝飾器生成器內置函數json

知識 我們 數列 ext 返回 utf choice 斐波拉契數列 不同 一、裝飾器 裝飾器,這個器就是函數的意思,連起來,就是裝飾函數,裝飾器本身也是一個函數,它的作用是用來給其他函數添加新功能,比如說,我以前寫了很多代碼,系統已經上線了,但是性能比較不好,現在想把程序裏

python學習筆記(7)--函數模塊

ctime color cti 使用 包含 div python time 模塊 一、函數 定義函數: def fun_name(para_list): codingdef fun_name(para_list): coding return xxx

Java基礎學習筆記——數學函數字符和字符串

表示 偶數 相等 sdi 開始 增強 con sca isl 4.2 常用數學函數 Math類中方法分為三類:三角函數、指數函數方法和服務方法。服務方法包括取整、求最小值、求最大值、求絕對值和隨機方法。除了這些方法之外,Math類還提供了兩個很有用的double型常量,

【Python學習筆記】-冒泡排序插入排序二分法查找

判斷 tail fontsize watermark encoding middle 循環 itl 要求 原文出處:https://blog.csdn.net/yort2016/article/details/68065728 冒泡排序 主要是拿一個數與列表中所有的數進行比

Python學習筆記字典之keys()values()和 items()方法

com png inf keys 學習筆記 修改 分享圖片 clas 沒有 隨筆記錄方便自己和同路人查閱。 #------------------------------------------------我是可恥的分割線--------------------------

【OS學習筆記】一 處理器記憶體和指令

我們已經知道,處理器是一臺電子計算機的核心,它會在振盪器脈衝的激勵下,從記憶體中獲取指令,併發起一系列由該指令所定義的操作。當這些操作結束之後,它接著再取下一條指令。通常情況下,這個過程是連續不斷、迴圈往復的。 1、暫存器和算數邏輯部件 電子計算機能能做很多事情。計算天氣預報,看

csdn學習筆記:lua繼承自索引

  Lua中類是物件,物件也是物件 物件: 所謂的物件,即屬性和方法。 相C/C++一樣使用類來訪問屬性和方法 Shape = { _width = 100, _height = 200, }; -- Shape._getArea = fu

JAVA學習筆記系列3-JVMJRE和JDK的區別

JVM(Java Virtual Machine)就是一個虛擬的用於執行bytecode位元組碼的“虛擬計算機”。它和os打交道 JRE(Java Runtime Environment)包含:Java虛擬機器、庫函式、執行java應用程式所必須的檔案。它包含了JVM JDK(Java Developme

[學習筆記]多項式的整除取模多點求值和插值及常係數線性遞推

一、開頭 ( WC2019 神犇協會) undefeatedKO : NOI2017 的題大家都 AK 了嗎? All : AK 了! ION :我們穿越到 2019 年的 WC 怎麼樣? olis :好啊!聽說一個弱雞 xyz32768 要來 WC ,我們一到就把他 D 一遍,這樣他

python學習筆記: range()函式算數運算子“//”,迴圈while與for

range() 函式——可建立一個整數列表,一般用在 for 迴圈中,函式語法:range(start, stop[, step]) start: 計數從 start 開始。預設是從 0 開始。例如range(5)等價於range(0, 5); stop: 計數到 stop 結束,但

keras學習筆記2——Merge理解GPU的設定方法,以及新手的注意事項

keras學習筆記2——Merge、GPU呼叫、快速開始及常見問題 參考資料:http://keras-cn.readthedocs.io/en/latest/ 1. Merge層 Merge層主要是用來合併多個model的,例子如下: from keras.layers impor