Apex Triggerの有効化/無効化を本番環境で制御する方法

By | April 2, 2020

概要

プロセルビルダーやフローが簡単にワンクリックで有効化/無効化を切り替えられるのに対して、Apex Triggerの有効化/無効化の切り替えを本番環境で行うのは用意ではありません。

通常、Sandbox環境から無効化されたApex Triggerをリリースするなどの手間が必要となります。

今回、「カスタムメタデータ型」または「カスタム設定」を用いて簡単に各Apex Triggerの有効化/無効化を切り替えられるようにする方法についてご紹介したいと思います。

各方法のpros&cons

proscons
方法1:カスタムメタデータ型のレコードで管理・パッケージまたはメタデータ API ツールを使用して移行することが可能。
・制御対象について上限がない。
なし。
方法2:カスタムメタデータ型の同一レコード内の項目で管理・パッケージまたはメタデータ API ツールを使用して移行することが可能。・カスタムメタデータ型辺りの項目数上限100という制限があるため、制御対象が101以上の場合に対応できない。
方法3:カスタム設定で管理・パッケージまたはメタデータ API ツールを使用して移行することができない。

方法1(最推奨:カスタムメタデータ型のレコードで管理)

①「カスタムメタデータ型」の作成

②「カスタム項目」の作成

「チェックボックス」のデータ型で有効化/無効化を成業するための「カスタム項目」を作成します。

以下の画像では、「有効化フラグ(IsActive__c)」作成しています。

③「カスタムメタデータレコード」の作成

最後に制御したいTriggert単位で「カスタムメタデータレコード」を作成します。

下記の例では、AccountBeforeTriggerを制御するための「カスタムメタデータレコード」を作成しています。

④Apex Triggerへの組み込み

ApexTriggerの冒頭で上記で設定した制御フラグの値を読み込み、if判定でTRUEの場合のみ以降の処理に進みます。

下記の例では、AccountBeforeTrigger制御フラグの値を読み込み、それがTRUEである場合にのみAccountBeforeTriggerの具体的な処理が実行されるように設定されています。

trigger AccounBegoreTrigger on Account(before insert){
 ApexTriggerControlFlag__mdt Settings = [SELECT IsActive__c FROM ApexTriggerControlFlag__mdt WHERE DeveloperName = 'AccountBeforeTriggerControlRecord' LIMIT 1];
 Boolean IsActive = Settings.IsActive__c;
 if(IsActive == TRUE){
  for(Account record: trigger.new){
   ~~~
  }
 }
}

方法2(推奨:カスタムメタデータ型の同一レコード内の項目で管理)

①「カスタムメタデータ型」の作成

②「カスタム項目」の作成

「チェックボックス」のデータ型で各Triggerに対応する「カスタム項目」を作成します。

以下の画像では、AccountBeforeTriggerの有効化/無効化を制御するための「AccountBeforeTrigger制御フラグ」作成しています。

③「カスタムメタデータレコード」の作成

最後に「カスタムメタデータレコード」を作成し、②で作成した各制御フラグのTRUE/FALSEを具体的に定めます。

④Apex Triggerへの組み込み

ApexTriggerの冒頭で上記で設定した制御フラグの値を読み込み、if判定でTRUEの場合のみ以降の処理に進みます。

下記の例では、AccountBeforeTrigger制御フラグの値を読み込み、それがTRUEである場合にのみAccountBeforeTriggerの具体的な処理が実行されるように設定されています。

trigger AccounBegoreTrigger on Account(before insert){
 ApexTriggerControlFlag__mdt Settings = [SELECT AccountBeforeTriggerControlFlag__c FROM ApexTriggerControlFlag__mdt WHERE DeveloperName = 'TriggerSettings' LIMIT 1];
 Boolean IsActive = Settings.AccountBeforeTriggerControlFlag__c;
 if(IsActive == TRUE){
  for(Account record: trigger.new){
   ~~~
  }
 }
}

方法3(非推奨:カスタム設定で管理)

①「カスタム設定定義」の作成

リスト型で「カスタム設定定義」を作成します。カスタムオブジェクトを作成する的な感じです。

②「カスタム項目」の作成

「チェックボックス」のデータ型で各Triggerに対応する「カスタム項目」を作成します。

以下の画像では、OpportunityBeforeTriggerの有効化/無効化を成業するための「OpportnityBeforeTrigger制御フラグ」作成しています。

③「カスタム設定レコード」の作成

最後に「カスタム設定レコード」を作成し、②で作成した各制御フラグのTRUE/FALSEを具体的に定めます。

④Apex Triggerへの組み込み

ApexTriggerの冒頭で上記で設定した制御フラグの値を読み込み、if判定でTRUEの場合のみ以降の処理に進みます。

下記の例では、AccountAftterTrigger制御フラグの値を読み込み、それがTRUEである場合にのみAccountAfterTriggerの具体的な処理が実行されるように設定されています。

trigger AccounAfterTrigger on Account(after insert){
 ApexTriggerControlFlag__c settings = ApexTriggerControlFlag__c.getInstance('トリガ有効化設定');
 Boolean IsActive = settings.AccountAfterTriggerFlag__c;
 if(IsActive == TRUE){
  for(Account record: trigger.new){
   ~~~
  }
 }
}