1. 什麼是具名管道?
與TCP/IP(傳輸控制通訊協定或internet協議)一樣,具名管道是一種通訊協議。它一般用於區域網路中,因為它要求用戶端必須具有訪問伺服器資源的許可權。
要解釋這個問題,我還是摘錄微軟官方的資料比較好
http://msdn.microsoft.com/zh-cn/library/ms187892.aspx
若要串連到 SQL Server 資料庫引擎,必須啟用網路通訊協定。Microsoft SQL Server 可同時通過多種協議處理請求。用戶端用單個協議串連到 SQL Server。如果用戶端程式不知道 SQL Server 正在偵聽哪個協議,可以配置用戶端按順序嘗試多個協議。使用 SQL Server 組態管理員啟用、禁用以及配置網路通訊協定。
Shared Memory
Shared Memory 是可供使用的最簡單協議,沒有可配置的設定。由於使用 Shared Memory 協議的用戶端僅可以串連到同一台電腦上啟動並執行 SQL Server 執行個體,因此它對於大多數資料庫活動而言是沒用的。如果懷疑其他協議配置有誤,請使用 Shared Memory 協議進行故障排除。
注意: |
使用 MDAC 2.8 或更早版本的用戶端不能使用 Shared Memory 協議。如果這些用戶端嘗試使用,將自動切換為 Named Pipes 協議。 |
TCP/IP
TCP/IP 是 Internet 上廣泛使用的通用協議。它與互連網路中硬體結構和作業系統各異的電腦進行通訊。TCP/IP 包括路由網路流量的標準,並能夠提供進階安全功能。它是目前在商業中最常用的協議。將電腦配置為使用 TCP/IP 可能會很複雜,但大多數連網的電腦已經配置正確。若要配置未在 SQL Server 組態管理員中出現的 TCP/IP 設定,請參閱 Microsoft Windows 文檔。
Named Pipes
Named Pipes 是為區域網路而開發的協議。記憶體的一部分被某個進程用來向另一個進程傳遞資訊,因此一個進程的輸出就是另一個進程的輸入。第二個進程可以是本地的(與第一個進程位於同一台電腦上),也可以是遠端(位於連網的電腦上)。
VIA
虛擬介面適配器 (VIA) 協議和 VIA 硬體一同使用。有關如何使用 VIA 的資訊,請與硬體供應商聯絡。
Named Pipes 與 TCP/IP 通訊端
在快速區域網路 (LAN) 環境中,傳輸控制通訊協定或 網際網路通訊協定 (IP) (TCP/IP) 通訊端用戶端和 Named Pipes 用戶端在效能方面不相上下。但是,網路速度越慢[如在廣域網路 (WAN) 或撥號網路上],TCP/IP 通訊端用戶端與 Named Pipes 用戶端的效能差異越明顯。這是因為處理序間通訊 (IPC) 的機制在對等項間的通訊方式不同。
對於 Named Pipes,通常網路通訊互動性更強。一個對等方直到另一個對等方使用讀取命令請求資料時才發送資料。在開始讀取資料前,網路讀取一般包括一系列窺視 Named Pipes 的資訊。這在慢速網路中可能開銷非常大,並會導致過多的網路流量,其他的網路用戶端反過來也會受到影響。
闡明所討論的是本地管道還是網路管道也很重要。如果伺服器應用程式在運行 SQL Server 執行個體的電腦的本地運行,則可以選擇本地 Named Pipes 協議。本地 Named Pipes 以核心模式運行且速度非常快。
對於 TCP/IP 通訊端,資料轉送的效率更高,開銷也更少。資料轉送還可以利用 TCP/IP 通訊端效能增強機制的優點,例如視窗化、延遲確認等。這在慢速網路中可能非常有益。對於應用程式的不同類型,這類效能差異可能非常大。
TCP/IP 通訊端還支援積壓隊列。試圖串連到 SQL Server 時,與可能導致管道忙錯誤的 Named Pipes 相比,該隊列可以帶來有限的平穩效果。
通常,TCP/IP 在慢速 LAN、WAN 或撥號網路中效果較好。而當網路速度不成問題時,Named Pipes 則是更好的選擇,因為其功能更強、更便於使用並具有更多的配置選項。
啟用協議
該協議必須在用戶端和伺服器上都啟用才能正常工作。伺服器可以同時監聽所有已啟用的協議的請求。用戶端電腦可以選取一個協議,或按照 SQL Server 組態管理員中列出的順序嘗試這些協議。
注意: |
Microsoft SQL Server 不支援 Banyan VINES 順序包協議 (SPP)、多協議、AppleTalk 或 NWLink IPX/SPX 網路通訊協定。以前使用這些協議串連的用戶端必須選擇其他協議才能串連到 SQL Server。
|
實際上,具名管道在SQL Server組態管理員中看起來是下面這樣。其實,在安裝好SQL Server之後就自動會有一個管道名稱。你當然也可以修改該名稱的。
2. 為什麼用具名管道?
使用具名管道的原因一般有兩個方面
- 提高速度
- 假設同樣在區域網路中,那麼使用具名管道協議會比TCP/IP協議快一些。
- 增加安全性
- 因為具名管道是只能用於區域網路的,那麼如果伺服器關閉了TCP/IP協議而僅啟用具名管道,就可以避免一些安全隱患
3. 如何使用具名管道?
要使用具名管道串連到SQL Server,用戶端代碼中的連接字串大致的文法是這樣的
"server=.;database=northwind;uid=sa;pwd=pass@word;Network Library=dbnmpntw"
如果伺服器是具名執行個體,則
"server=.\instanceName;database=northwind;uid=sa;pwd=pass@word;Network Library=dbnmpntw"
【注意】必須在伺服器啟用named pipe協議,並且啟動Broswer服務
為了避免在連接字串中這麼麻煩,也為了避免泄露我們串連資料的一些機密資訊。SQL Server Native Client還支援定義別名
點擊“別名”,然後點擊“建立別名”
如果建立好了別名,則可以在連接字串中直接這樣寫
"server=Myserver;database=master;integrated security=true;"
看起來和以前我們定義ODBC資料來源很類似,不是嗎?
那麼,如果這一串聯接字串被泄露,即便是別有用心的人,也不可能猜到我們的伺服器到底是什麼名字,而且我們使用了什麼協議串連的。
反過來,我就又想到,這個別名是要在用戶端建立的。那麼是不是要我們自己跑到用戶端去建立呢?顯然不可能。那麼該怎麼辦呢?
我自然聯想到了ODBC資料來源的動態建立,其實我們那時候是修改註冊表的。我按照同樣的思路找到了下面的登錄機碼
也就是說,你可以在安裝程式的時候,動態給這個項目下面添加一些項。就可以實現了。
其他參考資源:SQL Server 2008 Native Client編程
http://msdn.microsoft.com/zh-cn/library/ms130892.aspx