Commerce Server Upgrade Wizardが「無効なオブジェクト名『sysprocesses』」エラーで失敗する


説明

古いCommerce Serverバージョンを11.3以降のバージョンにアップグレードする際、Upgrade Wizardに以下のようなエラーが表示されます:

ログ ファイルに、下記のようなエントリーが出力されます:

<Product Catalog>: Info: Beginning product catalog schema migration
<Product Catalog>: Info: Product catalog schema migration failed, however, the changes to full text catalogs cannot be rolled back.
<Product Catalog>: Error: System.Data.SqlClient.SqlException (0x80131904): Invalid object name 'sysprocesses'.
   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.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at CommerceServer.Core.Internal.ServerUtility.ExecuteSqlScriptFromString(SqlConnection connection, SqlTransaction transaction, String sqlScriptContents)
   at CommerceServer.Core.Internal.ServerUtility.ExecuteSqlScript(SqlConnection connection, SqlTransaction transaction, String sqlFileName)
   at CommerceServer.Core.Migration.CatalogComponent.RunMigrationSchema(CatalogExecutionContext executionContext, String catalogCreateSqlPath)
   at CommerceServer.Core.Migration.CatalogComponent.Migrate()
ClientConnectionId:9cc4600d-649c-44a1-b3ac-10c09d6cad36
Error Number:208,State:1,Class:16

解決策

このエラーは、dbo.ctlg_DropPersistentTablesInScratchDBストアド プロシージャに関連するDBスキーマの変更によって発生します。このストアド プロシージャでは、sysprocessesオブジェクトに単一の識別子を使用していますが、SQLサーバーの古いバージョン(SQL 2008など)では、三つの部分からなる識別子のフォーマット([database_name].[schema_name].object_name)を使用することが前提とされているため、エラーが発生します。

下記の変更をCatalogCreate.sqlファイル(デフォルトではC:\Program Files (x86)\Commerce Server 11にインストールされています) に適用することで、この問題を解決することができます。

作成されたdbo.ctlg_DropPersistentTablesInScratchDBプロシージャ内には、以下のステートメントが3回出現します(行頭はCREATE PROCEDURE dbo.ctlg_DropPersistentTablesInScratchDBで始まります)。

Select '*' From sysprocesses Where  spid = @Tablespid_tmp

3回出現する上記のステートメントを、以下のように変更します:

Select '*' From master..sysprocesses Where  spid = @Tablespid_tmp

上記の変更をCatalogCreate.sqlファイルに保存し、Upgrade Wizardを再度実行してください。