#はじめに
変更セットで新しいプロファイルをリリースする時、オブジェクト権限は自動で反映されますか?
いいえ、新しいプロファイルをリリースするだけでオブジェクト権限は反映されません。
権限を設定したオブジェクトも一緒に変更セットに含める必要があります。
では新しいプロファイルだけ変更セットでリリースした場合はどうなるのか?
オブジェクト権限は全て空になってしまうのか?
いいえ、空になるのではなく、「対象組織のライセンス種別に対応する標準プロファイルで定義されている、現在のオブジェクトレベルアクセスを継承」されます。
要するに、勝手に設定されます。
詳しくはコチラ
でも、「Sandboxと本番環境に差分があるから、オブジェクトは変更セットに入れたくない!」
なんてことありますよね?
そんな時に役立つのが、データローダでオブジェクト権限一括設定です。
変更セットで新しいプロファイルリリースした後、
この作業を行えばオブジェクトをリリースすることなく権限を設定出来ます。
材料調達
-
開発者コンソールでSandboxのプロファイルIdを取得
権限セットオブジェクトからプロファイルIdを取得します。
なぜ権限セットオブジェクトかというと、オブジェクト権限オブジェクトの親が権限セットオブジェクトだからです。
詳しいデータモデルが気になる方はコチラSELECT Id FROM PermissionSet WHERE Profile.Name = 'プロファイル名'
-
開発者コンソールで本番環境のプロファイルIdを取得
SELECT Id FROM PermissionSet WHERE Profile.Name = 'プロファイル名'
-
データローダで取得したプロファイルIdをキーにSandboxからObjectPermissionを取得
extract_sandbox_objectPermission.csvSELECT Id, Name, ... FROM ObjectPermission WHERE ParentId = 'SandboxプロファイルId'
-
データローダで取得したプロファイルIdをキーに本番環境からObjectPermissionを取得
extract_prod_objectPermission.csvSELECT Id, Name, ... FROM ObjectPermission WHERE ParentId = '本番プロファイルId'
下準備
-
データ整形する用のエクセルファイルを新規作成
-
材料3.4を1の整形用エクセルファイルにぶちこむ
-
材料3シートを開く
-
すべてのParentIdを本番環境プロファイルIdに変更する
-
IdをSOBJECTTYPEをキーに本番環境のIdに置き換える
本番環境にIdがない場合はInsertするので空欄にしておきます。
オブジェクト権限が何も設定されていない場合、通常ObjectPermissionのレコードは作成されていません。
(例:Accountのオブジェクト権限何もなしの場合、SObjectType=Accountのレコードは存在しない)=IFERROR(VLOOKUP(J2,extract_prod_objectPermission!C:D,2,FALSE),"")
-
材料4シートを開く
-
本番環境のみに存在するレコードを探す
Sandboxではオブジェクト権限を設定していないのに、勝手にオブジェクト権限を設定されているレコードを探します。
列を一つ追加して以下の関数をぶちこんで判定します。=COUNTIF(extract_sandbox_objectPermission!N:N,extract_prod_objectPermission!O5)
-
7の関数で値が0のレコードの以下の項目を全てFALSEにする
余計な権限が付いている状態なので、全ての権限をなくす- PERMISSIONSCREATE
- PERMISSIONSDELETE
- PERMISSIONSEDIT
- PERMISSIONSMODIFYALLRECORDS
- PERMISSIONSREAD
- PERMISSIONSVIEWALLRECORDS
-
材料3シートに8のレコードを全てくっつける
-
材料3シートをコピーしてUpsert用CSVを作成
調理
- データローダでUpsertを選択
- オブジェクト権限(ObjectPermissions)を選択
- Upsert用CSVを選択
- キー項目はIdを選択
- Upsertを実行
- 完成!
補足
今回はオブジェクト権限の一括設定を解説しましたが、項目レベルセキュリティも同じような手順で設定出来ます。