標籤:資訊 tar 名稱 系統資料表 window 通過 log 問題: 緊急
前幾天給開發部門部署測試資料庫時,遇到一個很詭異的問題:建立一個連結的伺服器GEK-MIS01時,報錯如下:
訊息 15190,層級 16,狀態 1,過程 sp_dropserver,第 56 行
仍有對伺服器 ‘GEK-MIS01‘ 的遠程登入或連結登入。
指令碼如下(略去登入名稱等關鍵資訊):
View Code
因為當時是一批指令碼執行而且僅有這個指令碼出錯,當我準備查檢查出錯原因的時候,又有更緊急的事情要處理,就耽擱了處理這個問題,開發那邊在測試過程發現這個資料庫連結有問題,郵件反饋給我,我檢查時居然發現很多不可思議的現象:
(1): 我用SSMS進入“伺服器對象”——“連結的伺服器”下,居然看不到這個連結的伺服器對象,而通過sysservers等系統資料表又能查到這個伺服器連結化物件的資訊,當時我就百思不得其解,納尼啊?
(2) 重新執行上面指令碼時發現刪除連結的伺服器那段指令碼根本刪除不了該連結的伺服器,而添加連結的伺服器時則報錯
IF EXISTS (SELECT srv.name FROM sys.servers srv WHERE srv.server_id != 0 AND srv.name = N‘GEK-MIS01‘)
EXEC master.dbo.sp_dropserver @server=N‘GEK-MIS01‘, @droplogins=‘droplogins‘
GO
EXEC master.dbo.sp_addlinkedserver @server = N‘GEK-MIS01‘, @srvproduct=N‘SQL Server‘
訊息 15028,層級 16,狀態 1,過程 sp_addlinkedserver,第 82 行
伺服器 ‘GEK-MIS01‘ 已存在。
(3):接下來我測試了下連結的伺服器的使用方式,發現有些登入名稱(Windows 身份認證,sysadmin角色)下使用該資料庫連結沒有問題,而SQL Server身分識別驗證的登入名稱則會報下面錯誤:
EXEC [GEK-MIS01].DatabaseName.dbo.Procedure ‘xxxx‘
訊息 916,層級 14,狀態 1,第 1 行
伺服器主體 "username" 無法在當前安全上下文下訪問資料庫 "xxxxx"。
(4):而在SSMS下,在"伺服器對象"—>“連結的伺服器”—> "GEK-MIS01"下單擊目錄時,報如下錯誤。
具體錯誤資訊如下:
View Code
解決辦法: 查看當前USER為guest, 執行下面賦權語句即可解決問題
SELECT CURRENT_USER;
GRANT EXECUTE ON SYS.XP_PROP_OLEDB_PROVIDER TO guest;
但是對於現象1,2,3則困擾了我好久,一直以為是許可權問題,最後經過吐血的漫長排查,終於發現一個讓人吐血的原因:這台測試資料庫伺服器原先的電腦名稱為gek-mis01,後來不知道啥原因被系統管理員用作測試伺服器(曆史原因了我就不多說了),改名為GETTESTNT15,而一台新的伺服器命名為gek-mis01,結果我今天建立連結的伺服器時,就踩到了這個地雷。
接下來解決起來就比較順利了,首先刪除該連結的伺服器,修複電腦改名問題,重新建立該連結資料庫,OK,問題解決了!
Code Snippet
- exec sp_droplinkedsrvlogin‘GEK-MIS01‘ ,‘xxxxx‘
-
- exec sp_dropserver‘GEK-MIS01‘
-
-
- USE master;
- GO
- IF SERVERPROPERTY(‘servername‘) <> @@SERVERNAME
- BEGIN
- DECLARE @server sysname;
- SET @server [email protected]@SERVERNAME;
- EXEC [email protected]= @server;
- SET @server = CAST(SERVERPROPERTY(‘servername‘) AS sysname);
- EXEC [email protected][email protected], @local=‘LOCAL‘;
- END
電腦改名導致資料庫連結的詭異問題