大家會不會看到這標題覺得很奇怪,怎麼會有人安裝了 SQL Server 標準版了,還會想拿來當成 SQL Server Express 來用呢?其實真正的需求是這樣的,當我們要設定 SQL Server 連線參數時,在指定 Data Source 的時候會指定伺服器名稱,而有客戶的 ASP.NET 網站竟然把連線參數寫死在程式裡,而且廠商倒閉了以致於沒有原始檔可以修改後重新編譯,當時的資料庫的 Data Source 是採用 (local)\SQLEXPRESS 為伺服器名稱,現在的卻重新安裝了 SQL Server 標準版,所以根本連不上伺服器,這時學會這個技巧就很重要了。
一般來說,我們在安裝 SQL Server 2008 R2 Express 版 (安裝舊版也一樣) 之後會有一個 具名實體 (Named Instances) 叫做 SQLEXPRESS,如下圖示:
安裝 SQL Server 2008 R2 標準版/企業版/開發版 時,預設卻是 非具名實體 (unnamed instance),一般都是以 TCP/IP 的方式連線,只要指定 IP 位址或網域就能連線,如下圖示:
若要讓 非具名實體 的 SQL Server 變成能夠支援 具名實體 的連線,其實不需要重新安裝 SQL Server,直接透過 SQL Server 組態管理員 新增 別名 (Alias) 就可以了!以下是設定的步驟說明:
設定時有兩個欄位是重點,一個是「伺服器」欄位,輸入這台伺服器原本可以正常連接的「伺服器名稱」(也就是連接參數裡的 Data Source 屬性);另一個是「別名名稱」,要輸入你要模擬的「伺服器名稱」:
設定完之後,你就可以用別名輸入到連接參數中或直接透過 Management Studio 來測試是否能成功連接伺服器!
請注意:如果你的 SQL Server 是 64 位元的,在設定別名時要同時設定兩個地方,把 32bit 環境下的別名也設定一下,才不會造成有些 32 位元應用程式無法連接資料庫的問題,如下圖示:
最後,我再分享一個工作上的小經驗,我們之前有個案子,網站開發完成之後到客戶的正式主機部署,我們依照客戶提供的資料庫連接資訊進行設定,但是無論是使用 Management Studio 或透過 ASP.NET 來測試都一樣無法連線,我們反應給客戶知道,他也叫我們過去看他的電腦,的確是他的電腦可以正常連線,這時很直覺得會認為是防火牆的問題,但客戶堅稱他們在內網完全沒設定防火牆,所以又是一件鬼打牆的事件,我光是為了這件事弄了兩、三個小時,氣死我了!
我把所有能用的瑞士刀都拿出來用了,最終找到原因,其實客戶他們的 SQL Server 伺服器名稱 是:
172.16.14.33 \DBCLUSTER1
(備註:以上 IP 與具名實體皆為模擬,並非真的資料)
鄉親啊~ 你有沒有覺得很吐血阿~~ 他們的 伺服器名稱 在 IP 後面有多一個空白耶!而且少打一個空白就完全連不上,這是什麼鬼阿!!!
正所謂「不經一事、不長一智」,經過這次事件我終於瞭解到,原來 透過客戶特殊的設定 或 別名設定 的連線是透過字串完整比對的,差一個字元都不行,我們以上例來說,我們不是新增了一個 (local)\SQLEXPRESS 別名嗎?如果你用 localhost\SQLEXPRESS 或 .\SQLEXPRESS 來連接資料庫,很抱歉,連不上!
魔鬼總是會在一些很細微的地方跑出來,這問題非常罕見,各位能看到這就當多學個經驗吧! ^_^
相關連結