通常情況下,利用客戶端連接到SQL Server數據庫的時候,其默認是采用服務器的相關配置來初始化客戶端的連接。但是在某些情況下,數據庫管理員希望客戶端能夠管理自己的設置。而且往往這些客戶端的設置跟服務器的設置不一樣,甚至相反。此時客戶端要能夠在不修改服務器設置的情況下,連接到數據庫服務器中。
要實現類似的功能,就需要用到SQL Server數據庫中的SET選項。如要實現上述的需求,數據庫管理員可以把SET ANSI_DEFAULTS ON,然后再通過SQL_COPT_SS_PRESERVE_CURSORS來設置客戶端的配置。如此的話,就可以實現客戶端與服務器配置的不同,提高客戶端配置的靈活性。
不過需要注意的是,使用這些SET選項會導致客戶端與服務器配置的不同,即一些連接參數、運行環境等等可能會出現混亂。為此在使用SET選項時還必須考慮這個一致性的問題。也就是說,使用SET選項時要注意如下細節,
一、SET選項的生效時間。
利用SET選項來設置相關的運行參數與環境的時候,要注意其生效時間。這與服務器默認參數不同。默認參數其是始終生效的,除非后來數據庫管理員改變了其設置。但是使用SET選項來設置相關參數時,其生效時間就尤其特殊性。一般來說,SET選項可以分為分析時SET選項與執行時SET選項。隨著他們的分類不同,這個選項的生效時間也是不同的。如分析時選項在分析期間分析出文本中的選項時生效,而不管是否受流語句的控制。而執行選型則在指定這些選項的代碼執行期間生效。如在一個批處理程序中,可以設置一個SET選項。如果在執行這個SET語句之前,批處理程序已經因為某些原因執行失敗,則這個選項就不會生效,即數據庫系統沒有設置這個選項。如果在執行SET語句后執行失敗,則這這個選項就已經生效了。
所以說如果SET選項跟一些批處理程序一起使用時,就需要特別注意這個SET選項的位置。因為這個SET選型是否生效直接跟批處理程序中其他語句的執行情況相關。如現在一個批處理程序中有8條語句,而SET選型就是其中的一條如在第五條。如果在執行這個批處理程序的時候,在第三條語句的時候卡住了,那么這個第五條的SET選項語句就根本不起作用。為此筆者建議數據庫管理員,像這些SET選項語句通常情況下最好放置在批處理程序的前面部分,以初始化批處理程序的相關運行環境。除非有特別的需要,否則的話不要放置在中間。
二、要注意SET選項的作用范圍。
其實SET選項設置的參數與數據庫服務器的默認參數就好像是一個局部變量與全局變量的關系。前者設置的參數就是一個局部變量,其只有在一個特定的范圍內有效;離開了這個范圍的話,就會失效。而全局變量的話通常情況下都是有效的,除非在某個領域內又對其重新賦值了。所以說,數據庫管理員必須要了解SET選型的作用范圍,為后續引用這些參數做好準備。具體來說,這些SET選項,往往跟不同的功能結合使用。如跟批處理程序、跟觸發器等等結合使用。而隨著這個使用范圍的不同,其作用范圍也是不同的。
1、在會話過程中有效。有些SET選項是專門針對客戶端連接的。如筆者剛開始提起過的那個SET選型,其就是專么用來設置客戶端的連接參數的。這些參數可能跟服務器的默認參數之間存在著比較大的差異。那么這些參數的作用范圍是多少呢?通常情況下,針對專門會話所這支的SET選項,其在重置或者服務器中用戶的會話終止之前有效。也就是說,在客戶端連接的初始化過程中SET選項生效。只要用戶的這個會話沒有終止,這些選項都是生效的。除非用戶終止了當前的會話或者服務器強制重置相關參數,否則的話這個SET選項隨著會話啟用而生效,隨著會話終止而失效。另外需要注意的是,針對某個用戶設置的SET選項,其只對這個用戶的會話有效,而不會影響到其他用戶跟數據庫之間的通信。
2、支持 MARS 的連接維護一組默認的 SET 選項值。在該連接下執行批處理時,將把默認的 SET 選項值復制到請求的環境。批處理結束后,該環境將復制回會話的默認設置。通過這種方法,在同一連接下同時執行的多個批處理將在獨立的 SET 選項環境下運行。這是一個官方的說明,他是什么意思呢?也就是說,在同一個連接的過程中,可能會執行多個批處理作業。如果在這些批處理作業中,沒有設置SET選項的話,則其默認會采用服務器的默認設置。但是如果在第一個批處理程序中采用了SET選項更改這個默認設置,那么在第一個批處理程序運行環境中就會采用這個SET選項的設置。從而可以根據企業實際的需求,在同一個連接下為每個批處理程序設置相對獨立的運行環境。在支持 MARS 的連接下,如果同時執行多個批處理且它們會修改批處理執行環境,則得到的默認連接環境取決于最后執行完的批處理。也就是說,最后這個連接的參數取決于最后運行的皮處理程序中的SET選項。簡單的說,除非當前的連接中斷掉或者服務器實現強制重置,否則的話當前連接中的相關參數會被批處理程序中的SET選項改變。而且這個值會被多次改變。最后的參數是有最后一個批處理程序中的SET選項所決定。
3、在觸發器或者過程中也可以使用SET選項。那么跟他們結合使用時,SET選項的壽命又有多少呢?這要分情況來對待。一是要看觸發器或者過程內容有沒有多次使用SET選項。如在觸發器中,可能一開始就利用SET選項設置了某個參數;然后某個功能執行完畢后又把這個參數恢復了默認值,再繼續執行剩下的功能。在這種情況下,其有效持續時間就是觸發器內部這個參數被重置之前。也就是說,在一個觸發器或者內部可以先打開某個選項,然后再關閉掉。那么只有在這個選項打開與關閉之前有效。二是如果在觸發器內部一開始啟用了某個SET選項,后來沒有把他關閉掉,那么這個選項也不會永遠生效下去。通常情況下,只要當前這個觸發器或者過程執行完畢后,這個SET選型就會失效。為此簡單的說,這個SET選項就好象是存儲器或者過程中的局部變量,其只在觸發器或者過程的內部生效。
4、如果一個過程A調用了另外一個過程B,而現在如果過程A中利用SET選項更改了某些參數,那么這個更改會否影響到過程B的運行環境將呢?答案是不確定。這主要是看過程B中有沒有對這個SET選型進行重新設置。也就是說,除非在過程B中進行了顯示的重置,否則來自所有更高級別的代碼中的SET選項值在低級別的代碼中有效。簡單的說,過程A調用了過程B,則過程A中的SET選項值在過程B中同樣有效。除非過程B顯示的對這SET選型進行了重置。其實這個原理很簡單,就好象在過程A中定義了一個變量,然后調用了過程B。此時過程B使用需要用到這個過程A中定義的變量時,他的值就是在過程A中修改后的值。當然在過程B中也可以對這個過程A中定義的變量值進行修改,如可以對這個變量的值進行重置。不過當這個過程A結束時,這個變量就會失效了。#p#分頁標題#e#
可見,這個SET選項跟程序開發過程中的局部變量與全局變量非常的相似。數據庫管理員在使用這些SET選項的時候,需要注意一個基本的原則,即其作用范圍往往只在當前的會話或者過程中有效。為此數據庫管理員在啟用某個SET選項的時候,就需要考慮一個問題,即這個改變只是針對某個特定的會話或者某個特定的作業,還是針對全部用戶?如果是前者的話,則可以通過SET選項來設置。但是如果是后者的話,那么最好通過服務器設置來改變。否則的話,要為每個會話或者每個作業設置SET選型那工作量就比較大了。筆者以前學過程序開發,為此來學些這個SET選型的時候比較喜歡利用全局變量與局部變量的關系來了解這個功能。全局變量即在整個運行環境中都有效;而局部變量則只在某個作用范圍內有效。就是如此簡單而已。掌握了這個SET選項的作用范圍之后,就可以幫助數據庫管理員來確定到底是否該采用SET選項、以及在什么時候采用這個SET選項,來提高客戶端連接以及用戶運行環境的靈活性。