項目レベルセキュリティ、データローダーでメンテできるってよ

こんばんは、場末のSFコンサルタント、こー。です。
仕事で項目レベルセキュリティのリリースの段取りの話になったので、そういう話を少し書いておきたいと思います。
※ 新任admin向け、というにはやや難易度高い気もします。
  権限設定がこなれてきた際に、手数を減らすためのノウハウだと思っておいてください。


本稿のまとめ

本稿のまとめです。これでわかった人は本稿が不要な人なので読み飛ばしていただいて構いません。ご一緒に頑張りましょう。

  • 項目レベルセキュリティは、オブジェクトデータで管理されている。

  • なので、データローダーで読み書きできる。

  • 予めCSVファイルで権限設定を定めておいて一気に読み書きすると、作業ミスの防止に効果的。

項目レベルセキュリティの管理の仕組み

項目レベルセキュリティの内部的なデータ構造

まず最初に、項目レベルセキュリティ関連のデータ管理の仕組みを見ていきましょう。Salesforceでは、プロファイルや権限セットは、このようなデータ構造になっています。

プロファイルと権限セット、その周辺

【項目レベルセキュリティ】は【権限セット】の下位データ

ここで注目してほしいのが、

  • 【項目レベルセキュリティ】は、【権限セット】の下位データとして定義されている

ということです。
※ 今回、項目レベルセキュリティについての話題で記事を書いているので、詳述しませんが、オブジェクト権限や、タブ権限も同じ事がゆえます。

【権限セット】には、プロファイルと権限セット両方のデータが入っている

この図だけでは読み取れないのですが、
実は【権限セット】のオブジェクトには、プロファイルのレコードと権限セットのレコードが両方入っています。
これはおそらく実装上の都合で、以下のような設計思想によるものと推察します。

  • 項目レベルセキュリティはプロファイルと権限セット両方で登録できるから、管理するハコは【項目レベルセキュリティ】でまとめよう

  • そうするなら、プロファイルと権限セット両方の下位に項目レベルセキュリティを据えるより、
    プロファイルの下に権限セットを配置して、【権限セット】のオブジェクトを「プロファイルの下に権限セット両方のマスタ」にすればいい

このため、
項目レベルセキュリティは、「【権限セット】オブジェクトのレコードIDと、項目ごとの権限を特定すれば、データの読み書きで直接編集できる」
ようになっています。

実際にやってみよう

ということで実際にやってみましょう。
参考までにこんなデータをご用意しました。

営業担当が自分の案件についてアピールし、それを上司が査定する、というようなシーンをイメージして作りました。
査定の評価詳細やフィードバックコメント等は「上司は編集できるが、営業担当は参照できない」方がよい、というような運用でやっている、ということにします。

現在の営業担当の権限

  • 現時点の権限は以下の通りです。
    営業担当者プロファイルに対して、すべて編集権限が付いています。

  • 前述の業務要件からすると、黄色でマークした部分の編集権限はOFFの方がいいでしょう。最終的な評価値以外は参照は許可するものとします。

オレンジ部分の権限をOFFにしましょう。

ここの編集を、データローダー経由で一括編集することで実現していきましょう。

ステップ1:【権限セット】オブジェクトを検索して、カスタムプロファイル【営業担当者】のレコードIDを取得する

まず最初にやるのは、プロファイルのレコードIDを特定することです。
ここで注意したいのが、前述の通り、【項目レベルセキュリティ】は【権限セット】である、ということです。
なので、ここで調べるべきなのは、【プロファイル】オブジェクトでなく、【権限セット】オブジェクトとなります。

ということで、SOQLでデータ取得していきましょう。
以下に【権限セット】オブジェクトを一覧取得するSOQLを示します。

select
   Id
 , Type
 , License.Name
 , Profile.Name
 , Label
 , IsCustom
 , HasActivationRequired
 , Description
 , LicenseId
 , ProfileId
from PermissionSet
order by 
   Type
 , License.Name
 , Profile.Name desc 
 , Label

※ SOQLを実行するツールは何でも構いません。
  私は、Salesforce inspectorを使うことが多いです。

実行したイメージ、以下のようになります。
見るべきポイントは、Idの列となります。
レコードIDを控えておきましょう。
今回のレコードIDは【0PSxxxxxxxxxxxxxAC】でした。

ステップ2:【項目レベルセキュリティ】オブジェクトを検索して、現在の設定を退避する

次にやるべきことは、【項目レベルセキュリティ】のオブジェクトの内容を退避しておくことです。
※ 丸ごと控えておくことで、後でミスがあったときに後戻りできるようにしておきましょう。

【項目レベルセキュリティ】オブジェクトを検索するためのSOQLを示します。ParentIdの項目が、先ほどステップ1で控えた【権限セット】オブジェクトのIdが入ってくる項目になります。

select
   ParentId
 , Parent.name
 , Parent.profileid
 , Parent.profile.name
 , Id
 , SobjectType
 , Field
 , PermissionsEdit
 , PermissionsRead 
from FieldPermissions 
order by 
   ParentId
 , SobjectType
 , Field

ここで取得した値は丸ごと退避しておきましょう。
Excelやスプレッドシートなどに張り付けて取っておくとよいと思います。

※ 参考として、営業担当者プロファイルの【貢献度査定】オブジェクトのデータを抜粋したものを示します。

営業担当者プロファイルの【貢献度査定】オブジェクトのデータを抜粋したもの

見るべきところは、Fieldの項目です。
オブジェクトのAPI参照名と項目のAPI参照名をドットで連結した形式で指定していきます。

ステップ3:【項目レベルセキュリティ】オブジェクトのImportデータを作成する

データローダーで登録するためのインポートデータを作っていきましょう。
【項目レベルセキュリティ】オブジェクトインポート用に必要な項目は以下の5個になります。それぞれ指定の値を指定していきましょう。

  1.  ParentId   ・・・ ステップ2で控えた【権限セット】レコードIDを指定します。

  2. SobjectType ・・・ オブジェクトのAPI参照名を指定します

  3. Field    ・・・ 項目のAPI参照名を指定します。指定形式は前述の通りです

  4. PermissionsEdit ・・・ 編集権限をつける場合はTrueにしてください

  5. PermissionsRead ・・・ 参照権限をつける場合はTrueにしてください

もし権限をつけたくない場合は、レコードを作らないようにすればOKです。
レコードがないと権限が設定されない、ということですね。

ということで、ひな形を作ってみました。こんなイメージです。


今回の例では以下のようなファイルを作っていきます。

前述の現行権限をこんな風に修正。
修正後、実際にインポートに使う用のデータ

ステップ4:【項目レベルセキュリティ】オブジェクトのデータを入れ替える

権限データを作ったので、権限の内容を入れ替えていきます。

【現在の権限データを削除する】
まずは、ステップ2で控えたバックアップのデータから、今回修正したいプロファイル&オブジェクトの権限部分を抜粋して、【項目レベルセキュリティ】オブジェクトから削除しましょう。

ステップ2で提示した以下のデータを使ってデータローダーでDeleteをやっていきます。

再掲:営業担当者プロファイルの【貢献度査定】オブジェクトのデータを抜粋したもの。この五行を消します。

データローダーの削除の指定方法はここでは詳述しません。
データローダーでオブジェクトを指定する際には、【Show all Salesforce objects】の区分をONにしてください。

無事に削除出来たら、今度は新しい設定情報をインポートします。

再掲:ステップ3で作ったインポートデータ

ステップ5:項目レベルセキュリティが意図通りに変更されたことを確認する

これで、権限の入れ替えが出来ました。
結果を確認していきましょう。

画面で作業実施結果を確認したところ。

こうした一括入れ替えをする場合、1プロファイルの権限を丸ごと入れ替える、などが発生すると思います。
その場合は、以下のような方法を併用して正確性を担保することをお勧めします。

  1. 事前事後の【項目レベルセキュリティ】のレコード件数を比較し、妥当な値になっていることを確認する

  2. 事前事後で、【項目レベルセキュリティ】のレコードをすべて取得し、差分比較を行う。

    1. 更新されるべきものが更新されていること

    2. 更新されるべきでないものが更新されていないこと

差分比較は、明細&項目単位で比較する方がいいでしょう。
例えばExcelで現新両方張り付けて関数で比較するという形でもいいですし、Winmarge等の差分比較ソフトを利用するのも一案と思います。

結びに

項目レベルセキュリティの運用について、Tipsを記載しました。
画面でポチポチやるとどうしてもミスしますし、妥当性も保証しにくいです。

項目の権限をスプレッドシートなどで設計し、それをロードで流し込む方が安全であると思います。
皆さんの管理業務の手札として、覚えておいていただければと思う次第です。

それでは、また。

この記事が気に入ったらサポートをしてみませんか?