質問

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

この制限を克服するためにどのような一連のフープを飛び越えることができるか知っている人はいますか?

編集:トリガーで次の @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;

    }
}
役に立ちましたか?

解決

それはそれよりも最悪だし、あなたも、トリガー内千行のクエリの制限(行数にこのスケールがありますのでトリガがされている、最初の場所でそれらの15kのレコードを取得できるようにするつもりはありません以下のために呼ばれ、それはおそらくdoesntのヘルプ)

ドキュメントでその上に読み -

私はそれを行うには、あなたの唯一の方法は@futureタグであると思います。それはあなたがはるかに高いの限界を与えます。けれども、あなただけの一日のもののように多くを呼び出すことができます - あなたは何とか親オブジェクトが子どもを更新していたのを追跡する必要があり、そのオフラインで処理することができるように、

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

私は、これらの制限は、最初は厳しいと思っていたが、あなたのバッチ物事が正しく、私たちは定期的にトリガから行の千さんを更新した場合、実際にあなたはその中の多くの地獄を行うことができます。そして、はるかにそれよりも、アーキテクチャの観点から、あなたは本当に、通常のトリガによって活性化されたありえない、とにかく処理するバッチを話しています。確かに一つの事が - 彼らはあなたがそれを行うためにフープを介してジャンプします。

他のヒント

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

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

この質問がどれだけ古いものであるかに今気づきましたが、この回答が他の人に役立つことを願っています。

私はCodekは右、API /外部ツールのルートを行くことに行くには良い方法であると思います。ガバナ制限は適用されますが、あまり厳格なAPI呼び出しです。それはに見て何かあるかもしれないので、Salesforceは最近、自分のデータローダーツールを刷新します。

あなたが試みることができるもう一つは、あなたの端にWebサービスを呼び出すために送信メッセージとワークフロールールを使用しています。ただ、親オブジェクトを介して送信し、あなたの最後のプロセスは、APIを介して子レコードの更新を処理しましょう。アウトバウンドメッセージで注意すべきことの一つは、それが何らかの形であなたの側での処理をキュー、そしてすぐにSalesforceのに対応するために最善です。そうでない場合は、Salesforceのメッセージを再送信します。

@futureは仕事が(すべてのレコードを更新しない)しないのですか?奇妙な。あなたは、自動テストであなたの関数を使用してみましたか?それが動作するはずですし、と注釈が無視されるべきである(それは即座に実行されますテスト中に、試験方法は、より高い限界を持っています)。私はそれはあなたが達成したいものに最善の解決策のように思える、あなたはもう少しこれを調査勧めます。

また - ?多分トリガーではない、あなたのクラスからそれを呼び出すようにしてみてください。

デイジーチェーン接続トリガは一緒に仕事、私は過去にそれを試してみたことはありません。

(すべての組織が、今ではそれを持っている必要がありますのでWinter'10リリースから)

あなたの最後のオプションは、バッチApexのかもしれません。これは、大容量データの更新/検証ジョブのためにあなたは一般的に(それがスケジュールすることができます)、通常のデータベースで一晩実行事を意味しています。 //www.salesforce: HTTPを参照してください。 .COM /コミュニティ/ winter10 /カスタム・クラウド/プログラム・クラウド・ロジック/バッチcode.jsp とリリースノートPDFます。

私は1000年の制限が削除されているAPIのバージョン18を信じています。 (そのドキュメンテーションは言いますが、いくつかのケースでは、私はまだ限界に達し)

あなたはバッチ頂点を使用することができる場合がそう。単一APEX更新文で

のような何かます:

  

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

     以下のための

(childObect__cのC:[SELECT ....]){

     
    

c.foo__c = 'バー';

         

children.add(C)

  
     

}   更新(子供);;

Besureあなたのティガーをbulkifyも参照 HTTP ://sfdc.arrowpointe.com/2008/09/13/bulkifying-a-trigger-an-example/する

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top