熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL語言 >> 正文

利用SET選項提高客戶端的靈活性

2013-11-13 12:40:53  來源: SQL語言 

  通常情況下利用客戶端連接到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選型是否生效直接跟批處理程序中其他語句的執行情況相關如現在一個批處理程序中有條語句而SET選型就是其中的一條如在第五條如果在執行這個批處理程序的時候在第三條語句的時候卡住了那麼這個第五條的SET選項語句就根本不起作用為此筆者建議數據庫管理員像這些SET選項語句通常情況下最好放置在批處理程序的前面部分以初始化批處理程序的相關運行環境除非有特別的需要否則的話不要放置在中間

  二要注意SET選項的作用范圍

  其實SET選項設置的參數與數據庫服務器的默認參數就好像是一個局部變量與全局變量的關系前者設置的參數就是一個局部變量其只有在一個特定的范圍內有效;離開了這個范圍的話就會失效而全局變量的話通常情況下都是有效的除非在某個領域內又對其重新賦值了所以說數據庫管理員必須要了解SET選型的作用范圍為後續引用這些參數做好准備具體來說這些SET選項往往跟不同的功能結合使用如跟批處理程序跟觸發器等等結合使用而隨著這個使用范圍的不同其作用范圍也是不同的

  在會話過程中有效有些SET選項是專門針對客戶端連接的如筆者剛開始提起過的那個SET選型其就是專麼用來設置客戶端的連接參數的這些參數可能跟服務器的默認參數之間存在著比較大的差異那麼這些參數的作用范圍是多少呢?通常情況下針對專門會話所這支的SET選項其在重置或者服務器中用戶的會話終止之前有效也就是說在客戶端連接的初始化過程中SET選項生效只要用戶的這個會話沒有終止這些選項都是生效的除非用戶終止了當前的會話或者服務器強制重置相關參數否則的話這個SET選項隨著會話啟用而生效隨著會話終止而失效另外需要注意的是針對某個用戶設置的SET選項其只對這個用戶的會話有效而不會影響到其他用戶跟數據庫之間的通信

  支持 MARS 的連接維護一組默認的 SET 選項值在該連接下執行批處理時將把默認的 SET 選項值復制到請求的環境批處理結束後該環境將復制回會話的默認設置通過這種方法在同一連接下同時執行的多個批處理將在獨立的 SET 選項環境下運行這是一個官方的說明他是什麼意思呢?也就是說在同一個連接的過程中可能會執行多個批處理作業如果在這些批處理作業中沒有設置SET選項的話則其默認會采用服務器的默認設置但是如果在第一個批處理程序中采用了SET選項更改這個默認設置那麼在第一個批處理程序運行環境中就會采用這個SET選項的設置從而可以根據企業實際的需求在同一個連接下為每個批處理程序設置相對獨立的運行環境在支持 MARS 的連接下如果同時執行多個批處理且它們會修改批處理執行環境則得到的默認連接環境取決於最後執行完的批處理也就是說最後這個連接的參數取決於最後運行的皮處理程序中的SET選項簡單的說除非當前的連接中斷掉或者服務器實現強制重置否則的話當前連接中的相關參數會被批處理程序中的SET選項改變而且這個值會被多次改變最後的參數是有最後一個批處理程序中的SET選項所決定

  在觸發器或者過程中也可以使用SET選項那麼跟他們結合使用時SET選項的壽命又有多少呢?這要分情況來對待一是要看觸發器或者過程內容有沒有多次使用SET選項如在觸發器中可能一開始就利用SET選項設置了某個參數;然後某個功能執行完畢後又把這個參數恢復了默認值再繼續執行剩下的功能在這種情況下其有效持續時間就是觸發器內部這個參數被重置之前也就是說在一個觸發器或者內部可以先打開某個選項然後再關閉掉那麼只有在這個選項打開與關閉之前有效二是如果在觸發器內部一開始啟用了某個SET選項後來沒有把他關閉掉那麼這個選項也不會永遠生效下去通常情況下只要當前這個觸發器或者過程執行完畢後這個SET選型就會失效為此簡單的說這個SET選項就好象是存儲器或者過程中的局部變量其只在觸發器或者過程的內部生效

  如果一個過程A調用了另外一個過程B而現在如果過程A中利用SET選項更改了某些參數那麼這個更改會否影響到過程B的運行環境將呢?答案是不確定這主要是看過程B中有沒有對這個SET選型進行重新設置也就是說除非在過程B中進行了顯示的重置否則來自所有更高級別的代碼中的SET選項值在低級別的代碼中有效簡單的說過程A調用了過程B則過程A中的SET選項值在過程B中同樣有效除非過程B顯示的對這SET選型進行了重置其實這個原理很簡單就好象在過程A中定義了一個變量然後調用了過程B此時過程B使用需要用到這個過程A中定義的變量時他的值就是在過程A中修改後的值當然在過程B中也可以對這個過程A中定義的變量值進行修改如可以對這個變量的值進行重置不過當這個過程A結束時這個變量就會失效了

  可見這個SET選項跟程序開發過程中的局部變量與全局變量非常的相似數據庫管理員在使用這些SET選項的時候需要注意一個基本的原則即其作用范圍往往只在當前的會話或者過程中有效為此數據庫管理員在啟用某個SET選項的時候就需要考慮一個問題即這個改變只是針對某個特定的會話或者某個特定的作業還是針對全部用戶?如果是前者的話則可以通過SET選項來設置但是如果是後者的話那麼最好通過服務器設置來改變否則的話要為每個會話或者每個作業設置SET選型那工作量就比較大了筆者以前學過程序開發為此來學些這個SET選型的時候比較喜歡利用全局變量與局部變量的關系來了解這個功能全局變量即在整個運行環境中都有效;而局部變量則只在某個作用范圍內有效就是如此簡單而已掌握了這個SET選項的作用范圍之後就可以幫助數據庫管理員來確定到底是否該采用SET選項以及在什麼時候采用這個SET選項來提高客戶端連接以及用戶運行環境的靈活性


From:http://tw.wingwit.com/Article/program/SQL/201311/16377.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.