COLUMNS_UPDATED原理

深入理解SQL Server 2005 中的 COLUMNS_UPDATED函數

COLUMNS_UPDATED函數能夠出現在INSERTUPDATE觸發器中AS關鍵字後的任何位置,用來指示表或視圖中有哪些列已被插入或者更新。它通常和IF語句一起使用,從而可以根據不同的結果,促使觸發器執行不同的操作。因此在DML觸發器中,COLUMNS_UPDATED函數是一個非常重要且有用的函數。

不同於UPDATE函數,COLUMNS_UPDATED函數可以工作在多個列中,它使用字節中的位(Bit標識列是否已被修改(也就是採用二進制的方式),而不是在參數中傳遞列名。我們都知道,1字節(BYTE=8比特(Bit),因此僅僅使用COLUMNS_UPDATED函數,則只能夠標識一個表或視圖的前八列是否被修改。如果表的列多於八列,那麼必須和SUBSTRING函數一起搭配使用,這將在後文中進行詳細討論。

 

COLUMNS_UPDATED函數的原理分析

COLUMNS_UPDATED函數返回類型爲varbinary,這是一種二進制類型,它可以表示一個或多個字節,用來映射相關聯表的列。因此COLUMNS_UPDATED函數返回一個或多個由左向右排序的字節,這取決於要驗證更新的表是否擁有八個以上的列。最左側字節表示列的序號爲18的列,越偏向右側的字節,其所代表的列的序號也就越大。而列序號的排序是在創建表時,由列被定義的順序所決定的。在每個字節的內部,越偏向左側,列的序號越大,而左側字節所代表的列的序號總小於右側字節的。請允許我用一個簡單的示例來闡述上述過程:

我們假設有一張表TriggerDemo,它擁有24個列,分別爲COL1COL2COL3直至COL24。那麼COLUMNS_UPDATED函數就會返回3個字節,在最左側的字節內由右向左表示COL1COL8,中間的字節內由右向左表示COL9COL16,最右側的字節內由右向左表示COL17COL24

正如我之前所說,1字節中的8比特就可以表示一張表的前八列,如果某一1,那麼它所表示的列被標記爲已更新。反之爲0,那麼就是未更新。如果多個列被更新,那麼就會存在有多個位被設置爲1的情況。例如00001010就表示第二列和第四列已經被更新。

 

使用COLUMNS_UPDATED函數測試前八列

對於位(Bit要說的是,第一個稱爲Bit0(而不是Bit1),因此1個字節是由Bit0Bit7共八個位所組成的。有幾個列被更新,COLUMNS_UPDATED函數就會返回一個所對應的位設置爲1的字節。如果我們要想知道第二列和第四列是否被更新,就應該構造出一個字節,並將Bit1Bit3設置爲100001010),然後需要將這個字節轉換成十進制10,再和COLUMNS_UPDATED函數返回的字節進行按位邏輯與(&操作,&運算的結果如果是10,就能夠保證第二列和第四列已經同時被更新。再結合使用不同的比較運算符(<>=),處理各種各樣的可能性,你就會真切體會到COLUMNS_UPDATED函數的功能是多麼的強大了。好了,爲了便於理解,請看一個完整的代碼演示:

 

CREATE TRIGGER updDataTrigger

ON TriggerDemo

AFTER UPDATE AS

--測試第二列和第四列是否被同時更新

IF COLUMNS_UPDATED() & 10 =10

BEGIN

…………

END

--是否第二列或者第四列或者第二列和第四列同時被更新

ELSE IF COLUMNS_UPDATED() & 10> 0 AND COLUMNS_UPDATED()&10<=10

BEGIN

…………

END

--測試第二列或者第四列是否已被更新

ELSE IF COLUMNS_UPDATED() & 10<10 AND COLUMNS_UPDATED() & 10>0

BEGIN

…………

END

 

使用COLUMNS_UPDATED函數測試八個以上的列

一旦表擁有八個以上的列,COLUMNS_UPDATED函數將會返回多個字節。這時我們就需要藉助SUBSTRING函數來截取一個特定的字節,它可以從COLUMNS_UPDATED函數返回的多個字節中任意截取一個我們所想要的。

還記得我們前面的那張虛擬表TriggerDemo嗎?(就是擁有24個列的那個如果我們想測試它的第二列、第十列以及第二十四列是否已被更新,我們就需要使用SUBSTRING函數來截取到分別代表這些列的字節,再重複前面測試前八列方法的步驟。我們參見一下代碼:

--測試第二列、第十列以及第二十四列是否同時被更新

IF(SUBSTRING(COLUMNS_UPDATED(),1,1)&2=2)

AND(SUBSTRING(COLUMNS_UPDATED(),2,1)&2=2)

AND(SUBSTRING(COLUMNS_UPDATED(),3,1)&128=128)

BEGIN

…………

END

備份和恢復的概念:
備份和恢復組件是SQL Server的重要組成部分。備份就是指對SQLServer數據庫及其他相關信息進行拷貝,數據庫備份記錄了在進行備份這一操作時數據庫中所有數據的狀態,如果數據庫因以外而損壞,這些備份文件將在數據庫恢復時被用來恢復數據庫。
恢復就是把遭受破壞、丟失的數據或出現錯誤的數據庫恢復到原來的正常狀態,這一狀態就是有備份決定的。
分離數據庫:
在SQL Server運行時,在Windows中不能直接複製到SQL Server數據庫文件,如果想複製SQLServer數據庫文件,就要將數據庫文件從SQL Server服務器中分析出去,這樣就可以複製了。
附加數據庫:
附加數據庫的工作是分離數據庫的逆操作,通過附加數據庫,可以將沒有加入SQL Server服務器的數據庫文件加到服務器中。


發佈了51 篇原創文章 · 獲贊 43 · 訪問量 61萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章