【茶包射手筆記】SQL 錯誤-Server 'XXX' is not configured for RPC

在測試台運作正常,程式部署到正式環境後出現 SQL 錯誤:

System.Data.SqlClient.SqlException (0x80131904): Server 'XXX' is not configured for RPC.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)

追查程式,錯誤點在以下這段呼叫 Linked Server 端 Stored Procedure 的 SQL 指令: (XXX 為 Linked Server 名稱)

EXECUTE ('CALL PKG_BLAH.SP_BLOO(?,?,?)', @P1, @P2, @Result OUTPUT) AT [XXX];

爬文查到此與 Linked Server 的 RPC Out 選項被設成 False 有關。比對正式與測試 SQL Server,的確正式台 RPC Out 設 False,測試台設 True,將測試台設定改成 False 則可重現錯誤。

鐵證如山,調整正式台 RPC Out 設定為 True 後,問題排除。

最後補充,冷門選項 RPC 與 RPC Out 是什麼鬼?

依據 MSDN Blog What is the RPC and RPC Out option on a SQL Server linked-server- – Jason's Technical Topics

RPC 用於古老的 Remote Server 功能(Linked Server 的前身),SQL 2005 之後幾已絕跡,可直接放生。

至於 RPC Out,則與 Linked Server 有關,「呼叫 Linked Server 上的遠端 Stored Proceure」可視同 RPC (Remote Procedure Call),有兩種寫法:

  • EXEC [myserver].master.dbo.sp_helpdb
  • EXEC (‘master.dbo.sp_helpdb’) AT myserver

SQL 預設封鎖這類遠端 Stored Procedure 呼叫,必須將 RPC Out 設為 True 才放行,否則就如本案例,將產生 Msg 7411, Level 16, State 1, Line 1  Server ‘myserver’ is not configured for RPC. 錯誤。

猜想是基於安全考量,SQL 預設封閉未用到的管道以降低風險,故若系統包含呼叫 Linked Server 端 Stored Procedure 的情境,記得要解除封印。

歡迎推文分享:
Published 12 July 2017 11:38 PM 由 Jeffrey
Filed under: ,
Views: 2,809



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<July 2017>
SunMonTueWedThuFriSat
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication