一。前言sql

 

在使用SQL Server 的過程當中,用戶遇到的最多的莫過於鏈接問題了。本文將深度討論SQL Server 鏈接問題的方方面面,但願能幫你完全解決SQL server 的鏈接問題。編程

 

SQL Server 支持的通信協議不少,如命名管道(Named Pipes)、TCP/IP 套接字、共享內存(Shared Memory)等。因爲最經常使用的是前兩種即命名管道和TCP/IP套接字,因此咱們主要討論這兩種協議的鏈接問題。先來討論命名管道,而後咱們再討論TCP/IP。安全

 

二。什麼是命名管道(Named Pipes)服務器

 

在Windows 系統中,進程間通訊機制有郵槽,管道和套接字等. Windows平臺上就管道而言,有命名管道和匿名管道兩種。命名管道經過進程間通信(IPC)機制實現通信, 利用它可以在同一臺計算機的不一樣進程之間,或在跨越一個網絡的不一樣計算機的進程之間,進行單向或雙向的數據通訊。具體點說, 命名管道創建在服務器的IPC$共享基礎上,經過IPC$共享來進行通信。管道的名稱也是和網絡共享相似,都是UNC格式(見後面討論的命名管道命名格式)。網絡

 

若是你曾使用命名管道進行編程,你就會發現命令管道利用標準的Win32文件系統API 函數(如ReadFile和WriteFile)來進行數據的收發,與系統基層網絡傳送協議(如TCP,NETBEUI或IPX等)無關. 客戶端使用命名管道鏈接的基本過程以下:ide

 

(1)SQL Server服務器使用CreateNamedPipe函數建立命名管道並對之進行監聽.函數

(2)客戶端使用CreateFile()和WriteFile()函數試圖鏈接到服務器的命名管道.工具

 

綜上所述,post

 

1) 命名管道不是一個基層網絡協議編碼

 

因爲命名管道運行在TCP,NETBEUI等基礎協議之上,不是一個基層網絡傳送協議, 因此即便客戶機和SQL Server 服務器之間使用命名管道通信, 你亦須要配置TCP或其它基層網絡協議以保證客戶機和SQL服務器之間的網絡連通性.

 

2) 命名管道是一個須要經過系統認證的協議

 

當客戶端使用命名管道協議鏈接的時候, 它會首先訪問服務器的IPC$共享。訪問IPC$共享必須經過Windows 的認證。經過了這個認證後,才能夠真正鏈接到SQL Server 監聽的管道上。因此說命名管道是一個須要經過Windows認證的協議. 這是使用命名管道的最大一項好處,即用它能夠直接利用Windows Server內置的安全機制. 若是你沒有訪問SQL Server 服務器的文件系統的權限(Permission),那麼你就沒法使用命名管道訪問SQL Server。

 

三。SQL Sever 命名管道工做原理

 

SQL Server 首先在服務器上建立一個命名管道並監聽之,而後客戶端便可鏈接到這個管道上來進行對話。對每個客戶端管道鏈接請求SQL Server都會建立一個新的管道實例來與之進行通信。

 

1. 命名管道的名稱。

 

SQL Server和其它Windows程序同樣都採用UNC格式標識命名管道。例如:

 

\\server\Pipe\path_name

 

上述命名管道標識字符串可分爲三部分

 

\\server部分: 指定命名管道所在服務器的名字。命名管道即是在此機器上建立。SQL Server 可能是用一個點(.)來表示它正在運行的本地服務器。

 

\Pipe部分:是一個固定的「硬編碼」字串(大小寫都可)代表是管道協議。

 

\path_name部分:命名管道的名字。能夠是多級目錄。SQL Server 監聽的是兩級目錄即\sql\query。

 

缺省狀況下,SQL Server監聽的命名管道名稱以下:

(默認實例和命名實例有不一樣的管道名字)

 

默認實例:\\.\pipe\sql\query

命名實例:\\.\pipe\MSSQL$instancename\sql\query

 

上述管道名稱pipe後面的部分能夠在安裝 SQL Server 後使用服務器網絡實用工具進行更改。

 

 

2. 配置或查看SQL Server 2000 監聽的命名管道

 

在SQL Server 2000 服務器上運行svrnetcn.exe調出服務器網絡實用工具(英文名是SQL Server Network Utility),或者在"開始"菜單中,指向"程序",接着指向"Microsoft SQL Server",而後單擊"服務器網絡實用工具"。若是"啓用的協議(Enabled Protocals)"框內沒有命名管道則從左邊選中命名管道並點擊啓用(Enabled)按鈕加入(參考圖1)。選中命名管道協議並點擊屬性按鈕(Properties)便可查看或修改SQL Server 監聽的命名管道名稱(參考圖2)。若是剛剛啓用命名管道協議那麼須要點擊OK按鈕並從新啓動SQL Server 服務才能生效。

 

 

 

(圖1:服務器網絡實用工具)

 

 

 

 

(圖2:命名管道名稱)

 

3. 配置或查看SQL Server 2005/SQL Server 2008 監聽的命名管道

 

打開SQL Server Configuration Manager,在左側的面板中展開SQL Server Network Configuration節點,並選中節點下面你想要操做的SQL Server實例。此時在右側的面板上會看到該實例的各個網絡協議是否啓用,其中包括命名管道。在協議名字的右側會顯示它當前的狀態是否爲啓用。參考圖3。 

 

(圖3 SQL Server Configuration Manager) 

右鍵Named Pipes並選擇「啓用」。而後重啓SQL Server實例來使得剛纔作的操做生效。

在圖3中,選中命名管道協議並點擊屬性按鈕(Properties)便可查看或修改SQL Server 監聽的命名管道名稱。

 

 

 

(圖4)

 

4. 驗證SQL Server 是否真的監聽了命名管道

 

解決命名管道鏈接問題的重要一步是檢查SQL Server是否真的監聽了命名管道。

 

在SQL Server 2000中,爲了驗證SQL Server 確實監聽了命名管道,能夠打開SQL Server Query Analyzer (查詢分析器),而後運行以下命令:

exec master..xp_readerrorlog

 

在結果欄,若是看到以下一行則代表SQL Server已經監聽了命名管道:

 

2000-01-13 09:57:37.38 server SQL server listening on TCP, Shared Memory, Named Pipes.    

 

在SQL Server 2005或SQL Server 2008中,咱們能夠打開SQL Server Management Studio,而後運行:

exec master..xp_readerrorlog

 

你能夠在結果欄中看到它監聽的管道名稱:

 

2011-01-12 11:35:37.980 Server       Server named pipe provider is ready to accept connection on [ \\.\pipe\sql\query ].