Frage

Ich versuche, einen „After Update“-Trigger zu schreiben, der eine Stapelaktualisierung aller untergeordneten Datensätze des Datensatzes durchführt, der gerade aktualisiert wurde.Dies muss in der Lage sein, mehr als 15.000 untergeordnete Datensätze gleichzeitig zu verarbeiten.Leider scheint die Grenze bei 100 zu liegen, was so weit unter meinen Anforderungen liegt, dass es nicht einmal annähernd akzeptabel ist.Ich habe nicht versucht, die Datensätze in Stapel zu je 100 aufzuteilen, da ich dadurch immer noch eine Obergrenze von 10.000 Aktualisierungen pro Triggerausführung erreiche.(Vielleicht könnte ich Trigger einfach miteinander verketten?Pfui.)

Weiß jemand, durch welche Reihe von Reifen ich springen kann, um diese Einschränkung zu überwinden?

Bearbeiten:Ich habe versucht, die folgende @future-Funktion in meinem Trigger aufzurufen, aber die untergeordneten Datensätze werden dadurch nie aktualisiert:

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;

    }
}
War es hilfreich?

Lösung

Es ist schlimmer als das, du wirst in der Lage sein nicht einmal die 15k Datensätze an erster Stelle zu bekommen, weil es innerhalb eines Triggers ein 1000 Reihe Abfragelimit ist (Diese Skalen auf die Anzahl der Zeilen die Auslöser Wesen gefordert, aber das ist wahrscheinlich nicht hilft)

Ich denke, die einzige Art und Weise ist es mit dem @future Tag zu tun - lesen Sie in der Dokumentation auf das wieder wett. Es gibt Ihnen viel höhere Grenzen. Obwohl, können Sie nur nennen, so viele von denen an einem Tag -., So dass Sie irgendwie müssen möglicherweise den Überblick behalten, von denen übergeordnete Objekte haben ihre Kinder zu aktualisieren, und dann diese offline verarbeiten

Eine letzte Option kann die API über ein externes Tool verwenden. Aber Sie werden immer noch sicher, dass alles in Ihrem Code vornehmen müssen, ist chargiert werden.

dachte ich, diese Grenzen zunächst drakonisch waren, aber eigentlich kann man eine verdammt viel in ihnen tun, wenn Sie Batch Dinge richtig, regelmäßig wir 1000 die Zeilen von Trigger aktualisieren. Und aus architektonischer Sicht, viel mehr als das und Sie sprechen wirklich Batch-Verarbeitung sowieso, die normalerweise durch einen Trigger aktiviert isnt. Ein Ding sicher - sie machen Sie durch Reifen springen, es zu tun

.

Andere Tipps

Der beste (und einfachste) Weg mit diesem Problem zu ergreifen, um den Einsatz ist Batch Apex , können Sie eine Stapelklasse erstellen und aus dem Trigger ausgelöst. Wie @future läuft es in einem separaten Thread, aber es kann bis zu 50 Millionen Datensätze verarbeiten!

Sie müssen einige Informationen zu Ihrem Batch-Klasse übergeben, bevor Sie database.executeBatch, so dass sie die Liste der Eltern-IDs Arbeit hat mit, oder Sie könnten nur alle Konten natürlich bekommen;)

Ich habe gerade erst bemerkt, wie alt diese Frage ist aber hoffentlich diese Antwort wird andere helfen.

Ich denke, Codek richtig ist, geht die API / externe Werkzeugroute ist ein guter Weg zu gehen. Die Reglergrenzen gelten weiterhin, sind aber viel weniger streng mit API-Aufrufe. Salesforce neu gestaltete vor kurzem ihre Dataloader-Tool, so dass etwas Einblick in sein könnte.

Ein andere Sache, die Sie könnten versuchen, ist eine Workflow-Regel mit einer Outbound Nachricht über einen Web-Dienst auf Ihrem Ende zu nennen. Bitte senden Sie einfach über das übergeordnete Objekt und lassen ein Prozess auf dem Ende der untergeordneten Datensatz-Updates über das API behandeln. Eine Sache bewusst zu sein, mit ausgehenden Nachrichten, ist es am besten, den Prozess auf Ende Schlange irgendwie, und sofort reagieren Salesforce. Andernfalls wird die Nachricht erneut senden Salesforce.

@future nicht funktioniert (nicht aktualisiert Datensätze überhaupt)? Seltsam. Haben Sie versucht, Ihre Funktion in der automatisierten Test? Es sollte funktionieren und und die Anmerkung sollte ignoriert werden (während des Tests wird es sofort ausgeführt werden, müssen Prüfverfahren höhere Grenzen). Ich schlage vor, Sie dies ein wenig untersuchen, wie es scheint beste Lösung zu dem, was Sie erreichen möchten.

Auch - vielleicht versuchen, es aus Ihrer Klasse zu rufen, nicht die Auslöser

Daisy-Chaining-Trigger wird nicht zusammen arbeiten, ich habe es in der Vergangenheit versucht.

Ihre letzte Option könnte Batch-Apex sein (von Winter'10 Release, so dass alle Organisationen sollten sie jetzt haben). Es ist für die Massendatenaktualisierung bedeutete / Validierung Jobs, Dinge, die Sie normalerweise über Nacht in normalen Datenbanken laufen (es können so geplant werden). Siehe http: //www.salesforce .com / community / winter10 / custom-Wolke / Programm-Cloud-Logik / Batch-code.jsp und Release Notes PDF.

Ich glaube, dass in Version 18 der API die 1000-Grenze entfernt wurde.(so heißt es in der Dokumentation, aber in manchen Fällen stoße ich immer noch an eine Grenze)

Daher können Sie möglicherweise Batch-Apex verwenden.Mit einer einzigen APEX-Update-Anweisung

Etwas wie:

List Children = new List{};

for(childObect__c c :[WÄHLEN ....]) {

c.foo__c = 'bar';

kinder.add(c);

} Update (Kinder) ;;

Stellen Sie sicher, dass Sie Ihren Tigger sperrig machen, siehe auch http://sfdc.arrowpointe.com/2008/09/13/bulkifying-a-trigger-an-example/

Vielleicht eine Änderung des Datenmodells ist die bessere Option hier. Denken Sie an eine Formel auf dem Kinder-Objekt erstellen, wo Sie die Daten aus dem übergeordneten zugreifen. Dies würde wahrscheinlich viel effizienter sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top