スケジュール更新の終了日を編集した後、カタログのルール テーブルのエントリが重複する

この記事では、Adobe Commerce 2.2.3 の既知の問題に対するパッチを提供しています。このパッチでは、カタログ価格ルールのスケジュール更新の終了日または時刻を変更すると、に重複するエントリが追加されます catalogrule テーブルとエラー catalogrule_rule (カタログルール製品)インデクサーの再インデックス。

問題

既存のカタログ価格ルールのスケジュール更新の終了日または時刻を変更すると、重複するエントリが catalogrule データベーステーブル。 その結果、 catalogrule_rule 再インデックスが失敗し、例外ログに次のエラーが記録されます。 同じ ID の項目が既に存在しています.

再現手順:

前提条件:次の catalogrule_rule インデクサーはに設定されています。 スケジュールに従って更新 モード。

  1. Commerce管理者で、の下に新しいカタログ価格ルールを作成します。 Marketing > プロモーション > カタログ価格ルール.
  2. が含まれる カタログ価格ルール グリッド、クリック 編集 ​新しい更新をスケジュールして設定します ステータス 対象: アクティブ。
  3. クリック 表示/編集 新しく作成された更新の横で、終了日を以前の日付に変更します。
  4. 更新を保存します。
  5. の reindex コマンドを実行します。 catalogrule_rule インデクサー。

期待される結果:

この catalogrule_rule インデクサーのインデックスが正常に再作成されました。 には重複するエントリはありません catalogrule テーブル。

実際の結果:

再インデックスに失敗し、次のエラーが発生します。 同じ ID の項目が既に存在しています ​には重複するエントリがあるためです catalogrule テーブル。

解決策

この問題を解決するには、添付されているパッチを適用し、既存の重複エントリを削除する必要があります。 を参照してください。 重複したエントリの削除 重複が存在するかどうかの確認と削除について詳しくは、を参照してください。

パッチ

パッチはこの記事に添付されています。 ダウンロードするには、記事の最後まで下にスクロールしてファイル名をクリックするか、次のリンクをクリックします。

MDVA-10974_EE_2.2.3_COMPOSER_v2.patch のダウンロード

互換性のあるAdobe Commerceのバージョン:

パッチは次のために作成されました。

  • Adobe Commerce 2.2.3

このパッチは、次のAdobe Commerceのバージョンとエディションとも互換性があります(ただし、問題が解決しない可能性があります)。

  • クラウドインフラストラクチャー上のAdobe Commerce 2.2.1 - 2.2.5
  • Adobe Commerce オンプレミス 2.2.1 ~ 2.2.2 および 2.2.4 ~ 2.2.5

パッチの適用方法

参照: Adobeが提供する composer パッチの適用方法 詳しくは、サポートナレッジベースを参照してください。

重複したエントリの削除 remove

NOTE
操作を行う前に、最新のバックアップを作成してください。

重複したエントリを探して削除するには、次の手順を実行します。

  1. 次のクエリを実行して、重複したエントリがデータベース内に存在するかどうかを確認します。

    code language-sql
    SELECT entity_id, "catalog_product_entity" AS entity_table FROM catalog_product_entity GROUP BY entity_id, created_in HAVING COUNT(*) > 1    UNION    SELECT entity_id, "catalog_product_entity" AS entity_table FROM catalog_product_entity group by entity_id, updated_in having count(*) > 1    UNION    SELECT rule_id as entity_id, "catalogrule" AS entity_table FROM catalogrule GROUP BY entity_id, created_in HAVING COUNT(*) > 1    UNION    SELECT rule_id as entity_id, "catalogrule" AS entity_table FROM catalogrule GROUP BY entity_id, updated_in HAVING COUNT(*) > 1    UNION    SELECT rule_id as entity_id, "salesrule" AS entity_table FROM salesrule GROUP BY entity_id, created_in HAVING COUNT(*) > 1    UNION    SELECT rule_id as entity_id, "salesrule" AS entity_table FROM salesrule GROUP BY entity_id, updated_in HAVING COUNT(*) > 1    UNION    SELECT page_id as entity_id, "cms_page" AS entity_table FROM cms_page GROUP BY entity_id, created_in HAVING COUNT(*) > 1    UNION    SELECT page_id as entity_id, "cms_page" AS entity_table FROM cms_page GROUP BY entity_id, updated_in HAVING COUNT(*) > 1    UNION    SELECT block_id as entity_id, "cms_block" AS entity_table FROM cms_block GROUP BY entity_id, created_in HAVING COUNT(*) > 1    UNION    SELECT block_id as entity_id, "cms_block" AS entity_table FROM cms_block GROUP BY entity_id, updated_in HAVING COUNT(*) > 1;
    

    重複するエントリがない場合、応答は空になり、それ以外の操作は必要ありません。 重複したエントリが存在する場合は、テーブル名と entity_id (次の例に示すような複製されたエンティティ)。

    table_results1.png

    特定のテーブルでは、エンティティ ID を持つフィールドの名前は次の名前とは異なることに注意してください entity_id. 例: cms_page テーブル、のようになります page_id の代わりに entity_id.

  2. 次に、重複について詳しく見ていき、どちらを削除する必要があるかを理解する必要があります。 次のようなクエリを使用して、重複を確認します。 前の手順で受け取った結果に従って、テーブル名、エンティティ ID 名、値を置き換えます。

    code language-sql
    SELECT row_id, entity_id, created_in, updated_in FROM catalog_product_entity WHERE entity_id = 483 ORDER BY created_in;
    

    複数の列を持つレコードのリストが表示されます。 例:

    table_results2.png

    この created_in および updated_in 値は、次のパターンに従う必要があります。 created_in 現在の行の値は次と等しい updated_in 前の行の値。 また、 最初の行 created_in = 1 と 最後の行 updated_in = 2147483647 が含まれている必要があります。 (行が 1 つしかない場合は、created_in=1 と表示されます。 および 更新されました_in=2147483647)。 このパターンが適用されていない行を削除する必要があります。 この例では、次を含む行になります row_id =2052 (2 行目と 3 行目の両方で created_in: 1540837826 の値が同じであるため、この値は発生しません。

  3. 次のようなクエリを使用して、重複を削除します。 前の手順で受け取った結果に従って、テーブル名、エンティティ ID 名、値を置き換えます。

    code language-sql
    DELETE FROM catalog_product_entity WHERE entity_id = 483 AND row_id = 2052;
    
  4. 次を実行してキャッシュをクリーンアップします。

    code language-bash
    bin/magento cache:clean
    

    または、の下のCommerce管理で確認できます。 システム > ツール > キャッシュ管理.

開発者向けドキュメントの便利なリンク

添付ファイル

recommendation-more-help
8bd06ef0-b3d5-4137-b74e-d7b00485808a