更新のために結合クエリでアクティビティテーブルを使用できません

私たちのセットアップでは、アクティビティに関連付けられたカスタムフィールドがあり、その値はスケジュールされたジョブによって定期的に計算されます。ジョブは次のような内容のクエリを実行します。

UPDATE civicrm_value_something sth   JOIN(
    セレクト
      a.id、値としてのsomeexpression()
    FROM civicrm_activityから
    JOIN sometables
    どこでsomecondition   )r ON r.id =
sth.entity_id SET sth.somefield = r.value;

これは、4.7.24から4.7.30に移行した今日まで、 civicrm_activity
テーブルにいくつかの新しいトリガを導入するまでうまくいきました。問題は、 MySQLは更新するトリガーの実行をサポートしていないことですトリガーを引き起こすステートメントで使用されるテーブル(読み込み専用の場合もある)。したがって、このエラーでクエリが失敗します。

[nativecode = 1442 **ストアドファンクション/トリガーで
‘civicrm_activity’テーブルを更新できません
  このストアドファンクション/トリガーを呼び出すステートメントで既に使用されているためです。]

私が見ることができる唯一の解決策は、クエリを分割し、サブクエリの結果を一時テーブルに格納することです。これはあまり利便性が低く、パフォーマンスが低く(サブクエリがメモリに収まる場合)、アトミック性が低いため、望ましくありません。

誰かが同様の問題に直面して、良い解決策を思い付いていますか?

ベストアンサー

オプションは、トリガーを無効にし、アップグレードを実行して最後に再作成することです。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です