カスタム ビジネス ロジックをバイパスする

カスタム ビジネス ロジックを適用せずにデータ操作を実行できるようにしたい場合があります。 これらのシナリオには、通常、多数のレコードが作成、更新、または削除される一括データ操作が含まれます。

クライアント アプリケーションの開発者は、特別な オプション パラメータ をリクエストに渡して、次の表に示す 2 種類のカスタム ビジネス ロジックを制御できます。

ロジックの種類 使用する場合
同期ロジック 一括データ操作をできる限り迅速に完了できるようにする。 変更するデータが組織の要件を満たしていることがわかっている場合、または他の手段でこのロジックを実現する計画がある場合は、同期ロジックをバイパスします。 すべてのカスタム同期ロジックをバイパスして、各操作がより速く完了し、一括操作の合計時間を短縮できるようにします。
Power Automate フロー フローをサポートするために作成された多数のシステム ジョブが Dataverse 内でバックアップを引き起こし、パフォーマンスに影響を与える場合。 一括操作の実行中にフローをトリガーしないことで、このパフォーマンスの問題を軽減できます。

同期ロジックを回避する

注意

ビジネス ロジックをバイパスするための新しい方法は、プレビュー段階です。 カスタム ビジネス ロジックをバイパスする (プレビュー) 新機能について

BypassCustomPluginExecution オプションのパラメータを使用して、カスタム同期ロジックをバイパスします。

このオプションパラメータを使用することの代わりは、同期ビジネス ロジックを含むカスタム プラグインを検索して無効にすることです。 しかし、このプラグインを無効にすることは、プラグインが無効になっている間、すべてのユーザーに対してロジックが無効になることを意味します。 また、適切なプラグインのみを無効にし、完了したら忘れずに再度有効にする必要もあります。

オプションのパラメータを使用すると、このオプションを使用するように構成されたアプリケーションによって送信される特定の要求に対して、カスタム同期プラグインを無効にすることができます。

2 つの要件があります。

  • BypassCustomPluginExecution オプション パラメータを使用して要求を送信する必要があります。
  • 要求を送信するユーザーは、prvBypassCustomPlugins 特権を持っている必要があります。 既定では、システム管理者のセキュリティ ロールを持つユーザーのみにこの特権が割り当てられます。

注意

prvBypassCustomPlugins は、現時点では UI で割り当てることはできません。 API を使用して セキュリティ ロールに特権を追加できます。 詳細情報: 別のロールへの prvBypassCustomPlugins 特権の追加

BypassCustomPluginExecution は何をしますか?

このソリューションは、組織に適用されているカスタムの同期ビジネス ロジックを対象としています。 カスタム ビジネス ロジックをバイパスする要求を送信すると、次を除くすべての同期プラグインとリアルタイム ワークフローが無効になります。

  • コア Microsoft Dataverse システムの一部であるプラグイン、またはマイクロソフトが発行元であるソリューションの一部であるプラグイン。
  • Microsoft が発行者であるソリューションに含まれるワークフロー。

システム プラグインは、特定のエンティティのコア動作を定義します。 これらのプラグインがないと、データの不整合が発生し、簡単に修正できない場合があります。

Microsoft Dynamics 365 Customer Service や Dynamics 365 Sales Solutions などの Dataverse を使用するマイクロソフトが提供するソリューションには、このオプションではバイパスできない重要なビジネス ロジックも含まれています。

重要

独自のビジネス ロジックを含む他の独立系ソフトウェア ベンダー (ISV) からソリューションを購入してインストールしたことがあるかもしれません。 これらのソリューションによって適用される同期ロジックはバイパスされます。 このオプションを使用する前に、これらの ISV に確認して、ソリューションが使用するデータでこのオプションを使用した場合にどのような影響があるかを理解する必要があります。

BypassCustomPluginExecution オプションを使用するには?

このオプションは、.NET 用 SDK または Web API のいずれかで使用できます。

.NET 用 SDK でこのオプション パラメータを使用するには 2 つの方法があります。

値をオプションのパラメータとして設定します

次の例では、CreateRequest クラス を使用して新しい取引先企業レコードを作成するときに、オプションの BypassCustomPluginExecution パラメーターを設定します。

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);
}

プラグインで開始するデータ操作のこのメソッドは、通話ユーザーが prvBypassCustomPlugins 特権を持つ時に使用できます。

CrmServiceClient.BypassPluginExecution プロパティを設定します

次の例では、新しい取引先企業レコードを作成するときに CrmServiceClient.BypassPluginExecution プロパティを設定します。

var service = new CrmServiceClient(connectionString);  

service.BypassPluginExecution = true;

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

service.Create(account);

この設定はサービスに適用されるため、false に設定されるまで、サービスを使用して送信されるすべてのリクエストに対して設定されたままになります。

注意

このプロパティは、Dataverse.Client.ServiceClient では使用できませんが、 Dataverse.Client.Extensions.CRUDExtentions メソッド では使用できます。

別のロールへの prvBypassCustomPlugins 特権の追加

prvBypassCustomPlugins 特権は、さまざまなセキュリティロールに設定される UI では使用できないため、この特権を別のセキュリティ ロールに付与する必要がある場合は、API を使用する必要があります。 たとえば、システム カスタマイザー セキュリティ ロール を使用して、この特権をユーザーに付与することができます。

prvBypassCustomPlugins 特権には、すべての組織の ID 148a9eaf-d0c4-4196-9852-c3a38e35f6a1 があります。

AddPrivilegesRoleRequest を使用して prvBypassCustomPlugins 特権をセキュリティ ロールに関連付けます。

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);
}

同期ロジックのバイパスに関するよくある質問 (FAQ)

以下は、BypassCustomPluginExecution オプション パラメータを使用して同期ビジネス ロジックをバイパスすることに関してよく寄せられる質問です。

BypassCustomPluginExecution は、マイクロソフトのプラグインによるデータ操作のためにプラグインをバイパスしますか?

いいえ。 マイクロソフトのソリューションの同期プラグインまたはリアルタイム ワークフローが他のレコードに対して操作を実行する場合、それらの操作のロジックはバイパスされません。 特定の操作に適用される同期プラグインまたはリアルタイム ワークフローのみがバイパスされます。

プラグイン内で実行するデータ操作に BypassCustomPluginExecution を使用できますか?

はい。ただし、プラグインが prvByPassPlugins 特権を持つユーザーのコンテキストで実行されている場合に限ります。 プラグインの場合、OrganizationRequest クラス から派生したクラスのオプションの BypassCustomPluginExecution パラメーターを設定します。 プラグインでは、CrmServiceClient クラスや ServiceClient クラスを使用することはできません。

非同期プラグイン ステップ、非同期ワークフロー、およびフローについてはどうしますか?

非同期ロジックはバイパスされません。 非同期ロジックは、レコードの処理コストに大きく影響しないため、このパラメーターによってバイパスされることはありません。

Power Automate フローのバイパス

Power Automate フローは、Dataverse イベントが 行が追加、変更、または削除されたとき トリガーまたは アクションが実行されたとき トリガーを使用して、 イベントに応答できます。 これらのイベントが発生すると、 Dataverse はこれらのフローを実行するシステム ジョブを作成します。

プログラムまたはプラグインが一括操作を実行すると、多数のシステム ジョブが作成される場合があります。 多数のシステム ジョブは、 Dataverse のパフォーマンスの問題を引き起こす可能性があります。 SuppressCallbackRegistrationExpanderJob オプションのパラメーターを使用して、プログラムまたはプラグインでこれらのシステム ジョブの作成をバイパスすることを選択できます。

CallbackRegistration テーブル はフロートリガーを管理し、システム ジョブを作成する エキスパンダー 呼ばれる内部操作があります。

注意

このオプションを使用すると、フローの所有者は、フロー ロジックがバイパスされたという通知を受け取りません。

Power Automate フローをバイパスする場合

重要

SuppressCallbackRegistrationExpanderJob オプション パラメータは、作成された多数の特定のシステム ジョブが原因でパフォーマンスの問題が発生していることがわかっている場合を除き、使用しないでください。

人々はビジネス上の理由でフローを追加しており、慎重に検討せずにバイパスするべきではありません。 下記の 緩和戦略 を必ず検討してください。

SuppressCallbackRegistrationExpanderJob は役に立ちますか?

このオプションは、一括操作の実行後にパフォーマンスの問題が発生し、StatusCode0 : 応答の待機中 に設定されている、多数のCallbackRegistration エクスパンダ―操作 がある場合に使用します。

次のクエリを使用して、これらのジョブのステータスに関する情報を取得できます。

総数が 50,000 より多い場合は、このクエリは次オンエラーを返します。

名前: AggregateQueryRecordLimitExceeded
コード: 0x8004E023
番号: -2147164125
メッセージ: The maximum record limit is exceeded. Reduce the number of records.

注意

クエリがエラーを返さない場合、キューに入れられたジョブの数が問題である可能性は低いです。 通常、パフォーマンスの問題が発生する前に、キューに入れられたジョブの数が 50,000 レコードを超えます。

次の例では、状態コードによって多数の CallbackRegistration 展開操作 システム ジョブを出力します。 この種類のシステムジョブに対する operationtype 値は、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}");
    }
}

出力:

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

Power Automate フローをバイパスする方法

これらのバイパス フローは、.NET 用 SDK と Web API のどちらを使用しているかによって異なります。

注意

プラグイン内で開始されるデータ操作には、.NET 用 SDK を使用する必要があります。

次の例では、Power Automate をトリガーしないアカウント レコードを作成します。

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);
}

軽減戦略

フロー所有者は、ロジックが実行されることを期待しています。 このオプションを使用すると、フローの所有者には、ロジックがバイパスされたことは通知されません。 フローの所有者に、ロジックが適用されなかった時期と理由を理解できるように、ロジックが適用されなかったことを伝えることが重要です。 その後、ロジックを適用するかどうか、または適用する方法を決定できます。

ユーザーは、手動でも、複数のトリガーによって呼び出すことができるロジックを含む子フローを作成できます。 ロジックが子フローに含まれている場合は、後で別の方法でトリガーされる可能性があります。 詳細: 子フローの作成

バイパスされるフローを特定する

バイパスされるフローを正確に特定できない場合があります。 CallbackRegistration テーブル テーブルをクエリして、どの程度の影響があるか、およびフローが実行されていないことについて誰に連絡するかを評価します。 次のテーブルは、便利な CallbackRegistration テーブル列を表示します;

Column Description
name この値が GUID 値である場合は、これは、flowid 値と一致し、URL: https://make.powerautomate.com/environments/<environmentid>/flows/<flowid>/details に追加することで、この値を持つ URL でフロー定義を表示できるはずです。
message フローが 行が追加、変更、または削除されたとき トリガーを使う場合、それはこれらのオプションを持つ CreateUpdateDelete 操作のすべての組み合わせへと登録する可能性があります:
- 1: Added
- 2: Deleted
- 3: Modified
- 4: Added または Modified
- 5: Added または Deleted
- 6: Modified または Deleted
- 7: Added または Modified または Deleted
sdkmessage フローが アクションが実行されるとき トリガーの場合、この列にはメッセージの名前が含まれます。
scope フローは、次のオプションを使用して定義された、ユーザーが指定したスコープにのみ適用されます。
- 1: User
- 2: BusinessUnit
- 3: ParentChildBusinessUnit
- 4: Organization
ownerid コールバック登録とフローの所有者。
softdeletestatus フローが削除されかどうか。 0 は削除されていません。 1 は削除済みです。

次のクエリの例では、次の値が返されます。

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,

Power Automate フローのバイパスに関してよく寄せられる質問

以下は、SuppressCallbackRegistrationExpanderJob オプション パラメータを使用して Power Automate フローをバイパスすることに関してよく寄せられる質問です。

ユーザーには特別な特権が必要ですか ?

いいえ。 バイパス同期ロジック とは異なり、特別な権限は必要ありません。

クライアント アプリケーションがこのオプション パラメータを使用する場合、操作に対して登録されたプラグインによって実行される操作も適用されますか?

いいえ。 このパラメーターは、クライアント アプリケーションからの要求によって発生するイベントに対して登録されているプラグインによって実行される操作には渡されません。 プラグインによって実行される操作のフローをバイパスする場合は、プラグイン コードで SuppressCallbackRegistrationExpanderJob オプション パラメータを使用する必要があります。

参照

Web API: HTTP 要求の作成とエラーの処理
オプションのパラメーターを使用する

注意

ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)

この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。