Select Linked Server物件,產生7437錯誤訊息

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

image

 

 

看一下我們建立的Linked Server,其安全性部分我們設定的是使用登入的目前安全性內容建立

image

 

 

完成本機部分設定後,我們連接到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這一個登入。

image

 

 

接下來我們回到本機,執行下面程式,用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
如果沒有模擬登入的對應,連結的伺服器就無法在模擬底下使用。

image

 

 

該錯誤明顯提示要有模擬登入才可以在模擬的狀態下透過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)。

image

 

 

 

此時同樣的語法重新執行一遍,如下圖所示cary順利模擬rock然後透過Linked Server

Select到物件了。

image

 

這一篇的狀況一般應該是不會碰到,只是我偷懶用模擬帳號去Select Linked Server

才發現這一個問題。如果當時我是用rock帳號登入本機再去Select Linked Server

就不會產生這樣的錯誤了,自己筆記一下。

補充 : 以上測試皆為MS SQL 2012版本,同樣情境在SQL2008R2不會報7437錯誤,而是18456的登入錯誤訊息。

 

 

 

 

 

 

我是ROCK

rockchang@mails.fju.edu.tw