Benutzerdefinierte Geschäftslogik umgehen

Es gibt Zeiten, in denen Sie in der Lage sein wollen, Datenoperationen durchzuführen, ohne dass eine benutzerdefinierte Geschäftslogik angewendet wird. Diese Szenarien umfassen normalerweise Massendatenvorgänge, bei denen eine große Anzahl von Datensätzen erstellt, aktualisiert oder gelöscht werden.

Als Entwickler einer Client-Anwendung können Sie spezielle optionale Parameter mit Ihren Anforderungen übergeben, um zwei Typen von benutzerdefinierter Geschäftslogik zu steuern, wie in der folgenden Tabelle beschrieben:

Logiktyp Verwenden des s
Synchrone Logik Damit Massendatenvorgänge so schnell wie möglich abgeschlossen werden können. Umgehen Sie die synchrone Logik, wenn bekannt ist, dass die Daten, die Sie ändern, den Anforderungen der Organisation entsprechen, oder Sie planen, diese Logik auf andere Weise zu erreichen. Umgehen Sie die gesamte benutzerdefinierte synchrone Logik, sodass jeder Vorgang schneller abgeschlossen werden kann, wodurch die Gesamtzeit des Massenvorgangs verkürzt wird.
Power Automate-Flows Wenn eine große Anzahl von Systemaufträgen, die zur Unterstützung von Flows erstellt wurden, eine Sicherung innerhalb Dataverse verursachen, die sich auf die Leistung auswirken kann. Sie können dieses Leistungsproblem mindern, indem Sie die Flows nicht auslösen, während Massenvorgänge ausgeführt werden.

Synchrone Logik umgehen

Verwenden Sie den optionalen Parameter BypassCustomPluginExecution, um benutzerdefinierte synchrone Logik zu umgehen.

Die Alternative zur Verwendung des optionalen Parameters ist das Auffinden und Deaktivieren der benutzerdefinierten Plug-Ins, die die synchrone Geschäftslogik enthalten. Das Deaktivieren von Plug-Ins bedeutet jedoch, dass die Logik für alle Benutzer deaktiviert wird, während diese Plug-Ins deaktiviert werden. Es bedeutet auch, dass Sie darauf achten müssen, nur die richtigen Plug-Ins zu deaktivieren und daran denken müssen, sie wieder zu aktivieren, wenn Sie fertig sind.

Wenn Sie den optionalen Parameter verwenden, können Sie benutzerdefinierte synchrone Plug-Ins für bestimmte Anforderungen deaktivieren, die von einer Anwendung gesendet werden, die für die Verwendung dieser Option konfiguriert ist.

Es gibt zwei Anforderungen:

  • Sie müssen die Anforderungen mit dem optionalen Parameter BypassCustomPluginExecution senden.
  • Der Benutzer, der die Anfragen sendet, muss die Berechtigung prvBypassCustomPlugins haben. Standardmäßig haben nur Benutzer mit der Sicherheitsrolle "Systemadministrator" diese Berechtigung.

Hinweis

Die prvBypassCustomPlugins kann derzeit nicht in der Benutzeroberfläche zugewiesen werden. Sie können einer Sicherheitsrolle über die API ein Privileg hinzufügen. Weitere Informationen: Hinzufügen des Privilegs prvBypassCustomPlugins zu einer anderen Rolle

Was macht BypassCustomPluginExecution?

Diese Lösung zielt auf die benutzerdefinierte synchrone Geschäftslogik, die für Ihr Unternehmen angewendet wurde. Wenn Sie Abfragen senden, die die benutzerdefinierte Geschäftslogik umgehen, werden alle synchronen Plug-ins und Echtzeit-Workflows deaktiviert, außer:

  • Plug-Ins, die Teil des Microsoft Dataverse-Kernsystems oder Teil einer Lösung sind, bei der Microsoft der Herausgeber ist.
  • Workflows, die in einer Lösung enthalten sind, bei der Microsoft der Herausgeber ist.

System-Plug-ins definieren die Kernverhaltensweisen für bestimmte Entitäten. Ohne diese Plug-Ins würden Sie auf Dateninkonsistenzen stoßen, die möglicherweise nicht leicht zu beheben sind.

Von Microsoft ausgelieferte Lösungen, die Dataverse verwenden, wie z. B. Microsoft Dynamics 365 Customer Service oder Dynamics 365 Sales enthalten auch kritische Geschäftslogik, die mit dieser Option nicht umgangen werden kann.

Wichtig

Sie haben möglicherweise Lösungen von anderen unabhängigen Software-Anbietern (ISVs) erworben und installiert, die ihre eigene Geschäftslogik enthalten. Die synchrone Logik, die von diesen Lösungen angewendet wird, wird umgangen. Sie sollten sich mit diesen ISVs in Verbindung setzen, bevor Sie diese Option verwenden, um zu verstehen, welche Auswirkungen es haben kann, wenn Sie diese Option mit Daten verwenden, die deren Lösungen nutzen.

Wie verwende ich die Option BypassCustomPluginExecution?

Sie können diese Option entweder mit dem SDK für .NET oder der Web-API verwenden.

Es gibt zwei Möglichkeiten, diesen optionalen Parameter mit dem SDK für .NET zu verwenden.

Legen Sie den Wert als optionalen Parameter fest

Das folgende Beispiel bestimmt den optionalen BypassCustomPluginExecution-Parameter beim Erstellen eines neuen Kontodatensatzes mithilfe der CreateRequest-Klasse.

static void DemonstrateBypassCustomPluginExecution(IOrganizationService service)
{
    Entity account = new("account");
    account["name"] = "Sample Account";

    CreateRequest request = new()
    {
        Target = account
    };
    request.Parameters.Add("BypassCustomPluginExecution", true);
    service.Execute(request);
}

Sie können diese Methode für Datenvorgänge verwenden, die Sie in Ihren Plug-Ins initiieren, wenn der aufrufende Benutzer das prvBypassCustomPlugins-Recht besitzt.

Legen Sie die CrmServiceClient.BypassPluginExecution-Eigenschaft fest

Das folgende Beispiel setzt die CrmServiceClient.BypassPluginExecution-Eigenschaft beim Erstellen eines neuen Kontodatensatzes:

var service = new CrmServiceClient(connectionString);  

service.BypassPluginExecution = true;

var account = new Entity("account");
account["name"] = "Sample Account";

service.Create(account);

Da diese Einstellung auf den Dienst angewendet wird, bleibt sie für alle Anforderungen gesetzt, die über den Dienst gesendet werden, bis sie auf false gesetzt wird.

Hinweis

Diese Eigenschaft ist nicht im Dataverse.Client.ServiceClient, aber in den Dataverse.Client.Extensions.CRUDExtentions-Methoden verfügbar.

Hinzufügen des Privilegs prvBypassCustomPlugins zu einer anderen Rolle

Da die prvBypassCustomPlugins-Berechtigung in der Benutzeroberfläche nicht verfügbar ist, um sie für verschiedene Sicherheitsrollen festzulegen, müssen Sie die API verwenden, wenn Sie diese Berechtigung einer anderen Sicherheitsrolle zuweisen müssen. Sie könnten dieses Recht z. B. einem Benutzer mit der Sicherheitsrolle "Systemanpasser" gewähren.

Die prvBypassCustomPlugins-Berechtigung hat in jeder Organisation die ID 148a9eaf-d0c4-4196-9852-c3a38e35f6a1.

Assoziieren Sie das prvBypassCustomPlugins-Privileg für Sicherheitsrolle mit AddPrivilegesRoleRequest.

static void AddprvBypassCustomPluginsToRole(IOrganizationService service, Guid roleId)
{
    var request = new AddPrivilegesRoleRequest
    {
        RoleId = roleId,
        Privileges = new[]{
            new RolePrivilege{
                PrivilegeId = new Guid("148a9eaf-d0c4-4196-9852-c3a38e35f6a1"),
                Depth = PrivilegeDepth.Global
            }
        }
    };
    service.Execute(request);
}

Häufig gestellte Fragen zur Umgehung der synchronen Logik (FAQ)

Im Folgenden finden Sie häufig gestellte Fragen zur Verwendung des optionalen Parameters BypassCustomPluginExecution zum Umgehen der synchronen Geschäftslogik.

Umgeht BypassCustomPluginExecution Plug-Ins für Datenvorgänge durch Microsoft-Plug-Ins?

Nein. Wenn ein synchrones Plug-In oder ein Echtzeit-Workflow in einer Microsoft-Lösung Vorgänge auf anderen Datensätzen durchführt, wird die Logik für diese Vorgänge nicht umgangen. Es werden nur die synchronen Plug-Ins oder Echtzeit-Workflows umgangen, die für den spezifischen Vorgang gelten.

Kann ich BypassCustomPluginExecution für Datenvorgänge verwenden, die ich innerhalb eines Plug-Ins durchführe?

Ja, aber nur, wenn das Plug-In im Kontext eines Benutzers läuft, der das prvByPassPlugins-Recht hat. Für Plug-Ins setzen Sie den optionalen Parameter BypassCustomPluginExecution auf die von der OrganizationRequest-Klasse abgeleitete Klasse. Sie können die Klassen CrmServiceClient oder ServiceClient nicht in einem Plug-In verwenden.

Was ist mit asynchronen Plug-In-Schritten, asynchronen Workflows und Flows?

Asynchrone Logik wird nicht umgangen. Asynchrone Logik trägt nicht wesentlich zu den Kosten für die Verarbeitung der Datensätze bei, daher wird sie nicht durch diesen Parameter umgangen.

Power Automate-Flows umgehen

Power Automate-Flows können auf Dataverse-Ereignisse reagieren, indem sie die Auslöser Wenn eine Zeile hinzugefügt, geändert oder gelöscht wird oder Bei einer ausgeführten Aktion verwenden. Wenn diese Ereignisse eintreten, erstellt Dataverse Systemaufträge, um diese Flows auszuführen.

Wenn ein Programm oder Plug-In Massenvorgänge durchführt, kann eine große Anzahl von Systemaufträgen erstellt werden. Eine große Anzahl von Systemaufträgen kann Leistungsprobleme für Dataverse verursachen. Sie können die Erstellung dieser Systemaufträge in Ihrem Programm oder Plug-In umgehen, indem Sie den optionalen Parameter SuppressCallbackRegistrationExpanderJob verwenden.

Die CallbackRegistration-Tabelle verwaltet Flow-Trigger, und es gibt einen internen Vorgang namens expander, der die Systemaufträge erstellt.

Hinweis

Wenn diese Option verwendet wird, erhalten die Flow-Besitzer keine Benachrichtigung, dass ihre Flow-Logik umgangen wurde.

Wann sollen Power Automate-Flows umgangen werden?

Wichtig

Verwenden Sie den optionalen Parameter SuppressCallbackRegistrationExpanderJob nicht, es sei denn, Sie wissen, dass die auftretenden Leistungsprobleme auf eine große Anzahl spezifischer Systemaufträge zurückzuführen sind, die erstellt werden.

Benutzer haben Flows aus geschäftlichen Gründen hinzugefügt, und sie sollten nicht ohne sorgfältige Überlegung umgangen werden. Berücksichtigen Sie unbedingt die unten genannten Risikominderungsstrategien.

Wird SuppressCallbackRegistrationExpanderJob Ihnen helfen?

Verwenden Sie diese Option nur dann, wenn Leistungsprobleme nach Massenvorgängen auftreten und Sie eine große Anzahl von CallbackRegistration Expander Operation-Systemaufträgen haben, bei denen StatusCode auf 0 : Warten auf Ressourcen festgelegt ist.

Sie können die folgenden Abfragen verwenden, um Informationen über den Status dieser Aufträge zu erhalten.

Wenn die Gesamtanzahl größer als 50.000 ist, geben diese Abfragen den folgenden Fehler zurück.

Name: AggregateQueryRecordLimitExceeded
Code: 0x8004E023
Nummer: -2147164125
Meldung: The maximum record limit is exceeded. Reduce the number of records.

Hinweis

Wenn die Abfragen keinen Fehler zurückgeben, ist die Anzahl der Aufträge in der Warteschlange wahrscheinlich nicht das Problem. Normalerweise übersteigt die Anzahl der Aufträge in der Warteschlange 50.000 Datensätze, bevor Leistungsprobleme auftreten.

Die folgenden Beispiele geben die Anzahl der CallbackRegistration Expander Operation-Systemaufträge nach Zustandscode aus. Der operationtype-Wert für diese Art von Systemaufträgen ist 79.

static void RetrieveCallbackRegistrationExpanderStatus(IOrganizationService service)
{
    string fetchXml = @"<fetch aggregate='true'>
        <entity name='asyncoperation'>
        <attribute name='statuscode' alias='statuscode' groupby='true' />
        <attribute name='statuscode' alias='count' aggregate='count' />
        <filter>
            <condition attribute='operationtype' operator='eq' value='79' />
        </filter>
        </entity>
    </fetch>";

    FetchExpression fetchExpression = new(fetchXml);

    EntityCollection response = service.RetrieveMultiple(fetchExpression);

    foreach (Entity result in response.Entities)
    {
        string statusCode = result.FormattedValues["statuscode"];
        int count = (int)((AliasedValue)result["count"]).Value;
        Console.WriteLine($"{statusCode}: {count}");
    }
}

Ausgabe:

Canceled: 4101
Failed: 13
Waiting for Resources: 50,000

Wie sollen Power Automate-Flows umgangen werden?

Wie Sie Flows umgehen, hängt davon ab, ob Sie das SDK für .NET oder die Web-API verwenden.

Hinweis

Für Datenvorgänge, die innerhalb von Plug-Ins initiiert werden, müssen Sie das SDK für .NET verwenden.

Die folgenden Beispiele erstellen einen Kontodatensatz, der Power Automate nicht auslöst.

static void DemonstrateSuppressCallbackRegistrationExpanderJob(IOrganizationService service)
{
    Entity account = new("account");
    account["name"] = "Sample Account";

    CreateRequest request = new()
    {
        Target = account
    };
    request.Parameters.Add("SuppressCallbackRegistrationExpanderJob", true);
    service.Execute(request);
}

Risikominderungsstrategien

Flow-Besitzer erwarten, dass ihre Logik ausgeführt wird. Flow-Besitzer werden nicht benachrichtigt, dass ihre Logik umgangen wurde, wenn Sie diese Option verwenden. Es ist wichtig, Flow-Besitzern mitzuteilen, dass die Logik nicht angewendet wurde, damit sie wissen, wann und warum ihre Logik nicht angewendet wurde. Sie können dann entscheiden, ob oder wie sie ihre Logik anwenden.

Benutzer können untergeordnete Flows erstellen, die Logik enthalten, die von mehreren Triggern aufgerufen werden kann, sogar manuell. Wenn die Logik in einem untergeordneten Flow enthalten ist, kann sie später auf andere Weise ausgelöst werden. Weitere Informationen: Untergeordnete Flows erstellen

Identifizieren Sie Flows, die umgangen werden

Möglicherweise können Sie nicht genau erkennen, welche Flows umgangen werden. Sie können die Tabelle CallbackRegistration abfragen, um abzuschätzen, wie groß die Auswirkungen sein werden und an wen Sie sich wenden müssen, wenn der Flow nicht ausgeführt wird. Die folgende Tabelle beschreibt einige CallbackRegistration-Tabellenspalten, die nützlich sind;

Spalte Beschreibung
name Wenn dieser Wert ein GUID-Wert ist, sollte er mit dem flowid-Wert übereinstimmen, und Sie sollten in der Lage sein, die Flow-Definition in einer URL mit diesem Wert anzuzeigen, indem Sie ihn zu dieser URL hinzufügen: https://make.powerautomate.com/environments/<environmentid>/flows/<flowid>/details .
message Wenn der Flow den Trigger Wenn eine Zeile hinzugefügt, geändert oder gelöscht wird verwendet, kann er alle Kombinationen von Create-, Update- und Delete-Vorgängen mit diesen Optionen abonnieren:
- 1: Hinzugefügt
- 2: Gelöscht
- 3: Geändert
- 4: Hinzugefügt oder geändert
- 5: Hinzugefügt oder gelöscht
- 6: Geändert oder gelöscht
- 7: Hinzugefügt oder geändert oder gelöscht
sdkmessage Wenn der Flow den Trigger Bei einer ausgeführten Aktion verwendet, enthält diese Spalte den Namen der Nachricht.
scope Flows gelten nur für den vom Benutzer angegebenen Bereich, wie mit diesen Optionen definiert:
- 1: Benutzer
- 2: BusinessUnit
- 3: ParentChildBusinessUnit
- 4: Organisation
ownerid Der Besitzer der Rückrufregistrierung und des Flows.
softdeletestatus Ob der Flow gelöscht wird. 0 wird nicht gelöscht. 1 wird gelöscht.

Die folgenden Beispielabfragen geben diese Werte zurück:

static void RetrieveCallbackOperations(IOrganizationService service)
{

    QueryExpression callbackRegistrationQuery = new("callbackregistration")
    {
        ColumnSet = new ColumnSet("name", "entityname", "message", "sdkmessagename", "scope", "ownerid"),
        Criteria = new FilterExpression(LogicalOperator.And)
        {
            Conditions = {
                { new ConditionExpression("softdeletestatus",ConditionOperator.Equal,0) },
                // Add more conditions here to filter the results
            }
        }
    };

    EntityCollection callbackRegistrations = service.RetrieveMultiple(callbackRegistrationQuery);

    foreach (Entity callbackRegistration in callbackRegistrations.Entities)
    {
        string ownerid = callbackRegistration.FormattedValues["ownerid"];
        string scope = callbackRegistration.FormattedValues["scope"];
        string name = callbackRegistration.GetAttributeValue<string>("name");
        string message = callbackRegistration.FormattedValues["message"];
        string entityname = callbackRegistration.GetAttributeValue<string>("entityname");
        string sdkmessage = callbackRegistration.GetAttributeValue<string>("sdkmessagename");

        Console.WriteLine($"{ownerid},{scope},{name},{message},{entityname},{sdkmessage},");
    }
}

Output

FirstName LastName,Organization,de7153ba-9221-4079-82cc-c884bbd05dc0,Modified,account,,
FirstName LastName,Organization,Callback Registration Id: b44090aa-adde-4866-ac2e-d68fbcbe7d5a,Added,account,,
FirstName LastName,Organization,Callback Registration Id: dabfa1a1-b794-44d0-ad34-cd49ea650606,Added,none,sample_BusinessEvent,

Häufig gestellte Fragen zur Umgehung von Power Automate-Flows (FAQ)

Im Folgenden finden Sie häufig gestellte Fragen zur Verwendung des optionalen Parameters SuppressCallbackRegistrationExpanderJob zum Umgehen von Power Automate-Flows.

Benötigen Benutzer eine spezielle Berechtigung?

Nein. Anders als bei Synchrone Logik umgehen ist keine besondere Berechtigung erforderlich.

Wenn meine Client-Anwendung diesen optionalen Parameter verwendet, werden alle Vorgänge, die von Plug-Ins ausgeführt werden, die für den Vorgang registriert sind, auch angewendet?

Nein. Der Parameter wird nicht an Vorgänge weitergegeben, die von Plug-Ins ausgeführt werden, die für die Ereignisse registriert sind, die aufgrund von Anforderungen von Ihrer Clientanwendung auftreten. Wenn Sie Flows für von Plug-Ins ausgeführte Vorgänge umgehen möchten, müssen Sie den optionalen Parameter SuppressCallbackRegistrationExpanderJob in Ihrem Plug-In-Code verwenden.

Siehe auch

Web-API: HTTP-Anfragen zusammenstellen und Fehler behandeln
Optionale Parameter verwenden

Hinweis

Können Sie uns Ihre Präferenzen für die Dokumentationssprache mitteilen? Nehmen Sie an einer kurzen Umfrage teil. (Beachten Sie, dass diese Umfrage auf Englisch ist.)

Die Umfrage dauert etwa sieben Minuten. Es werden keine personenbezogenen Daten erhoben. (Datenschutzbestimmungen).