Select Linked Server物件,產生7437錯誤訊息
我們常常會根據AP需求設定相關帳號存取權限,而設定完成後
往往會需要測試一下,看看是否權限設定正確。
我此時都會用Execute As Login的方式去模擬該帳號,然後再去
Select 物件,看看是否OK。
而今天依然有個需求要讓某帳號可以存取遠端的Linked Server資料表
當我將相關帳號及權限建立完成後,一樣用老方法去Select Linked Server
的資料表,此時SQL卻報出了錯誤,錯誤訊息如下:
訊息 7437,層級 16,狀態 1,行 1
如果沒有模擬登入的對應,連結的伺服器就無法在模擬底下使用。
OK ! 看見這樣的訊息大概就是連接Linked Server權限方面產生問題。
接下來我就LAB一下並重現此一問題。
我們先執行下列程式碼,建立兩個帳號rock及cary,及一台Linked Server。
注意 : 要給cary可以模擬rock的權限歐。
USE [master]
GO
--先在本機建立兩個login
CREATE LOGIN [rock] WITH PASSWORD=N'passwd', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
CREATE LOGIN [cary] WITH PASSWORD=N'passwd', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
--給予cary模擬rock的權限
GRANT IMPERSONATE ON LOGIN::[rock] TO [cary]
GO
--在本機建立Linked Server [192.168.80.129]
EXEC master.dbo.sp_addlinkedserver @server = N'192.168.80.129', @srvproduct=N'SQL Server'
GO
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'192.168.80.129', @locallogin = NULL , @useself = N'True'
GO
執行完程式碼後,如下圖所示,我們建立了rock及cary兩個登入及一台Linked Server
看一下我們建立的Linked Server,其安全性部分我們設定的是使用登入的目前安全性內容建立
完成本機部分設定後,我們連接到Linked Server上去建立rock帳號,我帳號及密碼是取一樣的。
USE [master]
GO
--在遠端192.168.80.129本機建立rock的login
CREATE LOGIN [rock] WITH PASSWORD=N'passwd', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
執行上述程式碼後,如下圖所式,我們也在Linked Server上成功建立rock這一個登入。
接下來我們回到本機,執行下面程式,用cary模擬rock後然還再去Select Linked Server物件
看看會發生甚麼事。
Select SUSER_SNAME()
GO
--cary切換身分為rock
Execute As Login='rock'
GO
Select SUSER_SNAME()
GO
--透過Linked Server執行語法
Select * From Openquery([192.168.80.129],'Select SUSER_SNAME()')
GO
OK ! 如下圖所示,cary模擬了rock並且去Select Linked Server物件。但是SQL報出錯誤
訊息 7437,層級 16,狀態 1,行 1
如果沒有模擬登入的對應,連結的伺服器就無法在模擬底下使用。
該錯誤明顯提示要有模擬登入才可以在模擬的狀態下透過Linked Server存取物件。
既然它有需求,我們就給吧。執行下面語法建立rock帳號對應。
USE [master]
GO
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'192.168.80.129', @locallogin = N'rock', @useself = N'False', @rmtuser = N'rock', @rmtpassword = N'passwd'
GO
完成上面指令後,我們可以從下圖中看見本機rock對應到遠端所使用的帳號(也是rock)。
此時同樣的語法重新執行一遍,如下圖所示cary順利模擬rock然後透過Linked Server
Select到物件了。
這一篇的狀況一般應該是不會碰到,只是我偷懶用模擬帳號去Select Linked Server
才發現這一個問題。如果當時我是用rock帳號登入本機再去Select Linked Server
就不會產生這樣的錯誤了,自己筆記一下。
補充 : 以上測試皆為MS SQL 2012版本,同樣情境在SQL2008R2不會報7437錯誤,而是18456的登入錯誤訊息。
我是ROCK
rockchang@mails.fju.edu.tw