1

更新されたばかりのレコードのすべての子レコードに対してバッチ更新を行う「更新後」トリガーを作成しようとしています。これは、一度に15,000以上の子レコードを処理できる必要があります。残念ながら、制限は100であるように見えますが、これは私のニーズをはるかに下回っており、許容範囲にさえ近づいていません。レコードをそれぞれ100のバッチに分割しようとはしていません。これにより、トリガーの実行ごとに1万回の更新の上限が設定されます。(たぶん、トリガーをデイジーチェーン接続するだけでいいのではないでしょうか?

この制限を克服するために私がジャンプできる一連のフープを誰かが知っていますか?

編集:トリガーで次の@future関数を呼び出そうとしましたが、子レコードが更新されません:

global class ParentChildBulkUpdater
{
    @future 
    public static void UpdateChildDistributors(String parentId) {
        Account[] children = [SELECT Id FROM Account WHERE ParentId = :parentId];

        for(Account child : children)
            child.Site = 'Bulk Updater Fired';
        update children;

    }
}
4

6 に答える 6

4

この問題を解決するための最良の(そして最も簡単な)ルートは、Batch Apexを使用することです。バッチクラスを作成し、トリガーから起動できます。@futureと同様に、別のスレッドで実行されますが、最大50,000,000レコードを処理できます。

使用する前にバッチクラスに情報を渡して、使用database.executeBatchする親IDのリストを取得する必要があります。そうしないと、もちろんすべてのアカウントを取得できます;)

この質問の古さに気付いたばかりですが、この回答が他の人の役に立つことを願っています。

于 2011-05-04T23:55:24.013 に答える
2

それよりも最悪なのは、トリガー内に1,000行のクエリ制限があるため、そもそもこれらの15kレコードを取得することさえできないということです(これは、トリガーが要求されている行数に比例します。しかし、それはおそらく助けにはなりません)

それを行う唯一の方法は@futureタグを使用することだと思います-ドキュメントでそれを読んでください。それはあなたにはるかに高い制限を与えます。ただし、1日に呼び出すことができるのは非常に多くのオブジェクトだけです。そのため、どの親オブジェクトの子が更新されているかを何らかの方法で追跡し、それをオフラインで処理する必要がある場合があります。

最後のオプションは、外部ツールを介してAPIを使用することです。ただし、コード内のすべてがバッチ処理されていることを確認する必要があります。

これらの制限は最初は厳しいものだと思っていましたが、実際には、正しくバッチ処理すれば、制限内で多くのことを実行できます。トリガーから1,000行を定期的に更新します。そして、アーキテクチャの観点からは、それ以上のものであり、通常はトリガーによってアクティブ化されないバッチ処理について話していることになります。確かなことの1つは、フープを飛び越えてそれを実行することです。

于 2010-04-09T08:26:51.753 に答える
1

Codekは正しいと思います。API/外部ツールルートを使用するのが良い方法です。ガバナーの制限は引き続き適用されますが、API呼び出しではそれほど厳密ではありません。Salesforceは最近、DataLoaderツールを刷新したため、調査する必要があるかもしれません。

もう1つ試すことができるのは、アウトバウンドメッセージを含むワークフロールールを使用して、自分の側でWebサービスを呼び出すことです。親オブジェクトを送信し、APIを介して子レコードの更新を処理するようにします。アウトバウンドメッセージで注意すべきことの1つは、何らかの方法でプロセスをキューに入れ、すぐにSalesforceに応答することです。それ以外の場合、Salesforceはメッセージを再送信します。

于 2010-04-09T16:10:19.277 に答える
1

@futureが機能しません(レコードをまったく更新しません)?変。自動テストで関数を使用してみましたか?それは機能するはずであり、注釈は無視されるべきです(テスト中は即座に実行され、テストメソッドにはより高い制限があります)。これをもう少し調査することをお勧めします。これは、達成したいことに対する最善の解決策のようです。

また、トリガーではなく、クラスから呼び出してみてください。

デイジーチェーントリガーは一緒に機能しません、私は過去にそれを試しました。

最後のオプションはバッチApexである可能性があります(Winter'10リリースからなので、すべての組織が今までにそれを持っているはずです)。これは、大量のデータ更新/検証ジョブを対象としています。これは、通常のデータベースで通常一晩実行するものです(スケジュールすることができます)。http://www.salesforce.com/community/winter10/custom-cloud/program-cloud-logic/batch-code.jspおよびリリースノートPDFを参照してください。

于 2010-04-11T07:03:41.110 に答える
0

APIのバージョン18では、1000の制限が削除されたと思います。(ドキュメントには記載されていますが、場合によってはまだ制限に達しています)

したがって、バッチアペックスを使用できる場合があります。単一のAPEX更新ステートメント

何かのようなもの:

子のリスト=新しいリスト{};

for(childObect__c c:[SELECT ....]){

c.foo__c='バー';

children.add(c);

} update(children);;

ティガーを大きくすることを忘れないでください。http: //sfdc.arrowpointe.com/2008/09/13/bulkifying-a-trigger-an-example/も参照してください。

于 2010-04-10T07:58:20.377 に答える
0

たぶん、あなたのデータモデルへの変更はここでより良いオプションです。親からのデータにアクセスする子オブジェクトに数式を作成することを考えてください。これはおそらくはるかに効率的です。

于 2011-02-13T12:30:14.623 に答える