Benutzerdefinierte Dataverse-Logik umgehen

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

Da es keine Möglichkeit gibt, Dataverse anzuweisen, die Geschäftslogik nicht aufzurufen, müssen Sie die einzelnen benutzerdefinierten Plug-Ins und Workflows, die die Geschäftslogik enthalten, suchen und deaktivieren. Das Deaktivieren von Plug-Ins und Workflows bedeutet, dass die Logik für alle Benutzer deaktiviert wird, während diese Plug-Ins und Workflows deaktiviert werden. Es bedeutet auch, dass Sie darauf achten müssen, nur die richtigen Plug-Ins und Workflows zu deaktivieren, und daran denken müssen, sie wieder zu aktivieren, wenn Sie fertig sind.

Anstelle dieses manuellen Prozesses können Sie als Entwickler einer Clientanwendung oder eines Plug-Ins spezielle optionale Parameter mit Ihren Anforderungen übergeben, um zwei Arten benutzerdefinierter Geschäftslogik zu steuern, wie in der folgenden Tabelle beschrieben:

Logiktyp Wann sollte umgangen werden?
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.
Asynchrone Logik Wenn eine große Anzahl von Systemaufträgen zur Verarbeitung asynchroner Logik erstellt wird, entsteht eine Verzögerung in Dataverse, welche die Leistung beeinträchtigen kann. Sie können dieses Leistungsproblem mildern, indem Sie beim Ausführen von Massenvorgängen die asynchrone Logik nicht auslösen.

Hinweis

Power Automate Flows stellen einen anderen Typ asynchroner Logik dar, der separat verwaltet werden kann. Siehe Power Automate-Flows umgehen

Optionale Parameter

Verwenden Sie diese optionalen Parameter, um die Geschäftslogik zu steuern, die in Dataverse ausgeführt wird:

Optionaler Parameter Beschreibung
BypassBusinessLogicExecution Übergeben Sie die Werte CustomSync, CustomAsync oder CustomSync,CustomAsync für diesen optionalen Parameter, um die synchrone Logik, die asynchrone Logik oder beide zu umgehen.
BypassBusinessLogicExecutionStepIds Übergeben Sie eine durch Kommas getrennte Liste von Plug-In-Schrittregistrierungen, um nur die angegebenen Plug-In-Schritte zu umgehen.
BypassCustomPluginExecution Umgehen Sie nur die synchrone Logik. Dieser optionale Parameter wird unterstützt, aber nicht empfohlen. Verwenden Sie BypassBusinessLogicExecution mit dem CustomSync-Wert, um dasselbe Ergebnis zu erhalten.

BypassBusinessLogicExecution

Der optionale BypassBusinessLogicExecution-Parameter funktioniert ähnlich wie der optionale Parameter BypassCustomPluginExecution, außer dass Sie wählen können, ob die synchrone Logik, die asynchrone Logik oder beides umgangen werden soll.

Dieser optionale Parameter zielt auf die benutzerdefinierte Geschäftslogik, die für Ihr Unternehmen angewendet wurde. Wenn Sie Anforderungen senden, die die benutzerdefinierte Geschäftslogik umgehen, werden alle benutzerdefinierten Plug-Ins und 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 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.

In der folgenden Tabelle wird beschrieben, wann die Parameterwerte mit BypassBusinessLogicExecution verwendet werden sollen.

Parameter Beschreibung
CustomSync Umgehen Sie nur die synchrone benutzerdefinierte Logik.
Die für die synchrone Logik erforderliche Rechenzeit addiert sich zur Gesamtzeit, die zum Ausführen jeder Datenoperation erforderlich ist. Verwenden Sie diese Option, um die zum Abschließen von Massenvorgängen erforderliche Zeit zu verkürzen.
CustomAsync Umgehen Sie nur die asynchrone benutzerdefinierte Logik, ausgenommen Power Automate-Flows.
Dataverse wendet asynchrone Logik an, nachdem ein Vorgang abgeschlossen ist. Wenn eine große Anzahl von Operationen asynchrone Logik auslöst, erfordert Dataverse mehr Ressourcen, um die benutzerdefinierte Logik zu verarbeiten, und dieser Ressourcenverbrauch kann sich auf die Leistung auswirken. Verwenden Sie diese Option, um allgemeine Leistungsprobleme zu vermeiden, die auftreten können, wenn eine große Anzahl von Vorgängen asynchrone Logik auslöst.
CustomSync,CustomAsync Umgehen Sie synchrone und asynchrone benutzerdefinierte Logik, ausgenommen Power Automate-Flows.

Voraussetzungen für die Verwendung des optionalen BypassBusinessLogicExecution-Parameters

Wie nutze ich den optionalen BypassBusinessLogicExecution-Parameter?

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

Das folgende Beispiel legt den optionalen Parameter BypassBusinessLogicExecution für synchrone und asynchrone benutzerdefinierte Logik beim Erstellen eines neuen Kontodatensatzes mit der SDK für .NET CreateRequest-Klasse fest.

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

    CreateRequest request = new()
    {
        Target = account
    };
    request.Parameters.Add("BypassBusinessLogicExecution", "CustomSync,CustomAsync");
    service.Execute(request);
}

BypassBusinessLogicExecutionStepIds

Verwenden Sie den optionalen BypassBusinessLogicExecutionStepIds-Parameter, um angegebene registrierte Plug-In-Schritte anstelle der gesamten synchronen und asynchronen benutzerdefinierten Logik zu umgehen. Übergeben Sie mit diesem Parameter die GUID-Werte der registrierten Plug-In-Schrittregistrierungen. Wenn die übergebene Schritt-ID in der angegebenen Anforderung nicht ausgeführt wird, wird sie ignoriert.

Wie verwende ich die Option „BypassBusinessLogicExecutionStepIds“?

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

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

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

   CreateRequest request = new()
   {
         Target = account
   };
   request.Parameters.Add("BypassBusinessLogicExecutionStepIds", "45e0c603-0d0b-466e-a286-d7fc1cda8361,d5370603-e4b9-4b92-b765-5966492a4fd7");
   service.Execute(request);
}

Identifizieren Sie die Schritte, die Sie umgehen möchten

Es gibt mehrere Möglichkeiten, die GUID-Werte der Plug-In-Schrittregistrierung zu finden.

Das Plug-in-Registrierungstool verwenden

  1. Wählen Sie im Menü Ansicht die Option Nach Entität anzeigen aus.

  2. Wählen Sie die Entität und Nachricht aus

  3. Wählen Sie den Schritt.

    Im Detailbereich wird auf der Registerkarte Eigenschaften die StepId angezeigt. Kopieren Sie den Wert von dort.

    Das Plug-In-Registrierungstool verwenden, um den StepID-Wert zu finden

Weitere Informationen zum Plug-In-Registrierungstool

Ihre Umgebung mit Web-Api abfragen

Verwenden Sie eine Abfrage wie die folgende, um die festgelegten Plug-In-Schrittregistrierungen für eine bestimmte Tabelle und Nachricht abzurufen. Das folgende Beispiel gibt die account-Tabelle unter Verwendung des logischen Tabellennamens an. Create ist der Name der Nachricht. Ersetzen Sie diese Werte durch die Tabelle und Nachricht, die Sie benötigen.

Anfordern

GET [Organization URI]/api/data/v9.2/sdkmessagefilters?$select=sdkmessagefilterid
&$filter=primaryobjecttypecode eq 'account' 
and sdkmessageid/name eq 'Create'
&$expand=sdkmessagefilterid_sdkmessageprocessingstep($select=name;
$filter=statecode eq 0 
and customizationlevel eq 1 
and iscustomizable/Value eq true)
Accept: application/json   
OData-MaxVersion: 4.0   
OData-Version: 4.0 

Response

Suchen Sie in der Antwort nach den sdkmessageprocessingstepid-Werten. Verwenden Sie den Wert name, um das Plug-In zu identifizieren, das Sie umgehen möchten.

In diesem Fall gibt es nur eines: 4ab978b0-1d77-ec11-8d21-000d3a554d57

{
   "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#sdkmessagefilters(sdkmessagefilterid,sdkmessagefilterid_sdkmessageprocessingstep(name))",
   "value": [
      {
         "@odata.etag": "W/\"31434372\"",
         "sdkmessagefilterid": "c2c5bb1b-ea3e-db11-86a7-000a3a5473e8",
         "sdkmessagefilterid_sdkmessageprocessingstep": [
            {
               "@odata.etag": "W/\"115803276\"",
               "name": "BasicPlugin.FollowupPlugin: Create of account",
               "_sdkmessagefilterid_value": "c2c5bb1b-ea3e-db11-86a7-000a3a5473e8",
               "sdkmessageprocessingstepid": "4ab978b0-1d77-ec11-8d21-000d3a554d57"
            }
         ],
         "sdkmessagefilterid_sdkmessageprocessingstep@odata.nextLink": "[Organization URI]/api/data/v9.2/sdkmessagefilters(c2c5bb1b-ea3e-db11-86a7-000a3a5473e8)/sdkmessagefilterid_sdkmessageprocessingstep?$select=name&$filter=statecode%20eq%200%20and%20customizationlevel%20eq%201%20and%20iscustomizable/Value%20eq%20true"
      }
   ]
}

Erfahren Sie mehr über die Datenabfrage mit der Web-API

Ihre Umgebung mit FetchXml abfragen

Verwenden Sie eine Abfrage wie die folgende, um die festgelegten Plug-In-Schrittregistrierungen für eine bestimmte Tabelle und Nachricht abzurufen. Das folgende Beispiel gibt 1 an, um die account-Tabelle darzustellen, unter Verwendung des Tabellenobjekttypcodes.

Hinweis

Bei Tabellen, deren Objekttypcode größer als 10000 ist, ist der Wert nicht in jeder Umgebung derselbe, da diesem Wert beim Erstellen der Tabelle ein inkrementeller Wert zugewiesen wird.

Wenn Sie den logischen Namen der Tabelle kennen, können Sie den Objekttypcode mithilfe einer Web-API-Anforderung abrufen. Diese Anforderung gibt den Wert 1 zurück, den Objekttypcode für die account-Tabelle.

GET [Organization URI]/api/data/v9.2/EntityDefinitions(LogicalName='account')/ObjectTypeCode/$value

Create ist der Name der Nachricht. Ersetzen Sie diese Werte durch die Tabelle und Nachricht, die Sie benötigen.

Verwenden Sie diese FetchXml-Abfrage, um step.sdkmessageprocessingstepid-Werte zurückzugeben, die Sie mit dem optionalen Parameter BypassBusinessLogicExecutionStepIds verwenden können.

<fetch>
  <entity name='sdkmessagefilter'>
    <filter>
      <condition attribute='primaryobjecttypecode'
        operator='eq'
        value='1' />
    </filter>
    <link-entity name='sdkmessage'
      from='sdkmessageid'
      to='sdkmessageid'
      link-type='inner'
      alias='message'>
      <filter>
        <condition attribute='name'
          operator='eq'
          value='Create' />
      </filter>
    </link-entity>
    <link-entity name='sdkmessageprocessingstep'
      from='sdkmessagefilterid'
      to='sdkmessagefilterid'
      link-type='inner'
      alias='step'>
      <attribute name='name' />
      <filter>
        <condition attribute='statecode'
          operator='eq'
          value='0' />
        <condition attribute='customizationlevel'
          operator='eq'
          value='1' />
        <condition attribute='iscustomizable'
          operator='eq'
          value='1' />
      </filter>
    </link-entity>
  </entity>
</fetch>

Weitere Informationen zum Abfragen von Daten mit FetchXml

Beschränken auf die Anzahl von Schritten

Um sicherzustellen, dass die Parametergröße nicht zu groß wird, beträgt die Standardbegrenzung für die Anzahl der Schritte, die Sie übergeben können, drei. Die Begrenzung wird mithilfe von Daten in der Spalte „OrgDbOrgSettings“ der Organisationstabelle gesteuert. Verwenden Sie das OrgDBOrgSettings-Tool für Microsoft Dynamics CRM oder die OrgDbOrgSettings-App, um den BypassBusinessLogicExecutionStepIdsLimit-Wert zu ändern.

Die maximal empfohlene Größe für diese Begrenzung beträgt 10 Schritte.

BypassCustomPluginExecution

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

Hinweis

Dies war der erste optionale Parameter, der eine Einschränkung der Geschäftslogik ermöglichte. Er wird weiterhin unterstützt, wir empfehlen jedoch, BypassBusinessLogicExecution, mit dem CustomSync-Wert zu verwenden, um dasselbe Ergebnis zu erzielen.

Verwenden Sie diesen optionalen Parameter auf die gleiche Weise wie BypassBusinessLogicExecution, mit dem Unterschied, dass er eine andere Berechtigung erfordert: prvBypassCustomPlugins

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.

Einer anderen Rolle die erforderlichen Berechtigungen hinzufügen

Die in diesem Artikel beschriebenen optionalen Parameter erfordern Berechtigungen, die nur zur Systemadministrierenden-Sicherheitsrolle hinzugefügt werden. Diese Berechtigungen sind im Sicherheitsrollen-Designer nicht zum Hinzufügen zu anderen Sicherheitsrollen verfügbar. Wenn Sie dieses Recht einer anderen Sicherheitsrolle erteilen müssen, müssen Sie die API verwenden. Sie könnten dieses Recht z. B. einem Benutzer mit der Sicherheitsrolle „Systemanpasser“ gewähren.

Um das Recht einer anderen Sicherheitsrolle hinzuzufügen, benötigen Sie die ID des Rechts.

Name des Dataflows Kennung Optionale Parameter
prvBypassCustomBusinessLogic 0ea552b0-a491-4470-9a1b-82068deccf66 BypassBusinessLogicExecution
BypassBusinessLogicExecutionStepIds
prvBypassCustomPlugins 148a9eaf-d0c4-4196-9852-c3a38e35f6a1 BypassCustomPluginExecution

Diese ID-Werte sind für alle Dataverse-Umgebungen gleich.

Ordnen Sie das prvBypassCustomBusinessLogic-Recht einer Sicherheitsrolle mit AddPrivilegesRoleRequest zu.

static void AddprvBypassCustomPluginsToRole(IOrganizationService service, Guid roleId)
{
    var request = new AddPrivilegesRoleRequest
    {
        RoleId = roleId,
        Privileges = new[]{
            new RolePrivilege{
                PrivilegeId = new Guid("0ea552b0-a491-4470-9a1b-82068deccf66"),
                Depth = PrivilegeDepth.Global
            }
        }
    };
    service.Execute(request);
}

Häufig gestellte Fragen zum Umgehen von Geschäftslogik (FAQ)

Nachfolgend finden Sie häufig gestellte Fragen zur Verwendung optionaler Parameter zum Umgehen synchroner Geschäftslogik.

Umgehen diese optionalen Parameter Plug-Ins für Datenoperationen durch Microsoft-Plug-Ins?

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

Kann ich diese optionalen Parameter für Datenoperationen verwenden, die ich innerhalb eines Plug-Ins durchführe?

Ja, aber nur, wenn das Plug-In im Kontext von Benutzenden läuft, welche die erforderliche Berechtigung haben. Für Plug-Ins setzen Sie den optionalen Parameter auf die von der OrganizationRequest-Klasse abgeleitete Klasse. Sie können die Klassen CrmServiceClient oder ServiceClient nicht in einem Plug-In verwenden.

Siehe auch

Power Automate-Flows umgehen
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).