在測試台運作正常,程式部署到正式環境後出現 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 的情境,記得要解除封印。