MENU
Abo
某SIer勤務。
新卒文系からエンジニア就職。
日々の学びをつらつらと書いています。
保有資格:
Salesforce認定アドミニストレーター  
Salesforce認定Platformデベロッパー
Salesforce認定上級Platformデベロッパー
カテゴリー
アーカイブ

【Salesforce】ファイル権限まとめ!権限の種類と更新方法まるわかり

今回はファイルの権限についてまとめてみました。

権限ごとにできるアクションの違いや、権限の変更方法について記載しています。

備忘録です。

目次

ファイル権限区分とアクション

ファイルに対する権限は、大きく分けると以下の3つに分類されます。

  • 所有者
  • コラボレータ
  • 閲覧者

それそれの権限でファイルに対して実行可能なアクションが異なります。

スクロールできます
アクション \ 権限有者コラボレータ閲覧者
参照またはプレビュー
ダウンロード
共有
新しいバージョンをアップロード
詳細の編集
権限の変更
レコードから削除
削除

ファイルを削除できるのはファイルの所有者のみとなっています。

レコードから削除」のアクションについては、ファイルは完全に削除されず、添付先のレコードから削除される、という処理になります。

ファイルに対する権限の付与・確認方法

ファイルに対する権限を確認するには、確認対象のファイルのアクションから「共有」を選択します。

下画像では、ファイルの所有者が「abo dev」で「ユーザ01」に対して「コラボレータ」権限が付与されていることが分かります。

この画面の「共有先」からユーザやグループを選択することで、ファイルに対する権限を付与することが可能です。

レコードに添付されたファイルの権限

レコードの詳細ページに「ファイル」関連リストを表示することでレコードにファイルを添付することができます。

レコードにファイルを添付するとファイルの「共有」の「アクセス権のあるユーザ」に添付先のレコードが表示されます。

そこで選択できる権限として以下の2つがあります。

  • 閲覧者(デフォルト)
  • レコードごとに設定

「閲覧者」権限

「共有」からファイルに対する権限を確認すると、

添付先のレコード(取引先01)に対する権限が「閲覧者」と表示されています。

これは取引先01レコードを参照できるユーザに対して「閲覧者」権限を付与しますよ、という意味です。

逆に取引先01レコードに対する参照権限がないユーザは添付ファイルにアクセスすることができません。

また、レコードにファイルを添付するとデフォルトで「閲覧者」権限が設定されます。

「レコードごとに設定」

レコードに添付されたファイルに対する権限として「レコードごとに設定」を選択することができます。

端的に説明すると、レコード権限を継承するようにファイルに対する権限を設定することができます

具体的には次のような権限設定になります。

  • レコードに対する参照・更新権限があるユーザには、添付ファイルに対する 「コラボレータ」アクセス権を付与
  • レコードに対する参照権のみがあるユーザには、添付ファイルに対する 「閲覧者」アクセス権を付与

上画像の例の場合、取引先01に対して参照・更新権限をもつユーザには添付ファイルに対するコラボレータ権限を付与し、参照権限のみの場合は、閲覧者権限を付与するということです。

レコードにファイルを添付するとデフォルトで「閲覧者」権限が設定されますが、
以下の設定を行うことで、デフォルトの権限を「レコードごとに設定」に変更可能です。

設定 > Salesforce Files > 一般設定
[レコードに添付されたファイルのファイルアクセス権を [レコードごとに設定] に設定] を有効化

ライブラリに格納されたファイルの権限

ライブラリにファイルをアップロードすると「ライブラリごとに設定」というファイル権限が割り当てられます。

ファイルへのアクセス権はライブラリへのアクセス権に従うという意味です。

また、この設定を変更することはできません。

ファイル権限の変更

続いて、ファイルの権限の変更方法についてです。

今回は以下の3つの方法で更新してみました。

  • 「共有」から変更
  • Apexによる変更
  • データローダによる変更

注意点としては、ライブラリに共有されているファイルの権限を変更することはできません。

たとえレコード、ユーザに共有されている場合でも、ライブラリへ共有されている限り権限変更不可となります。

「共有」から変更

ファイル権限変更の1つ目は「共有」から変更する方法です。

最もシンプルかつ簡単に権限変更できますが、大量のファイルの権限を一括で変更したい時には向いてない方法ですね

Apexによる変更

Apexを使用してファイル権限を変更する方法です。

ファイルが添付されているオブジェクトを指定し、一括でファイル権限を変更することができます

処理の流れとしては以下のようになります。

  1. FileTypeが「メモ」でない、かつ、ライブラリに共有されていない「ContentDocument」を取得
  2. ①で取得したContentDocumentIdを使用して「ContentDocumentLink」を取得
  3. ContentDocumentLinkの「ShareType」が「V(閲覧者権限)」、かつ、Accountに添付されているファイルの場合、「ShareType」を「I(権限は関連するレコードに依存)」に更新
Abo

メモやファイル周辺のオブジェクト構成については、こちらの記事にまとめていますの良かったらご覧ください。

最終的なゴールとしては、ファイルの権限情報を保持しているContentDocumentLink「ShareType」の更新です。

ShareTypeの値には以下「V」、「C」、「I」があります。

ContentDocumentLink

下記コード例では、取引先レコードに添付されたファイル権限を「閲覧者」から「レコードごとに設定」に更新しています。

Abo

コピペで匿名実行コンソールから実行可能です。

Set<Id> idSet = new Set<Id>();
List<ContentDocumentLink> clList = new List<ContentDocumentLink>();

//FileTypeが「メモ」でない、かつ、ライブラリに共有されていない「ContentDocument」を取得
for(ContentDocument cd : [Select Id, FileType from ContentDocument Where FileType != 'SNOTE' AND ParentId = null]){
    idSet.add(cd.Id);
}

//ContentDocumentIdを使用して「ContentDocumentLink」を取得
for(ContentDocumentLink cl : [Select Id, ShareType, LinkedEntityId From ContentDocumentLink Where ContentDocumentId IN: idSet]){
    if(cl.ShareType == 'V' && cl.LinkedEntityId.getSobjectType() == Account.SObjectType){
        /*ShareTypeが「V(閲覧者権限)」、かつ、Accountに添付されているファイルの場合、
        ShareTypeを「I(権限は関連するレコードに依存)」に更新*/
        ContentDocumentLink clRec = new ContentDocumentLink();
        clRec.Id = cl.Id;
        clRec.ShareType = 'I';
        clList.add(clRec);
    }    
}

if(clList.size() > 0){
    //ContentDocumentLink更新
    update clList;
}

簡単にポイントを挙げておきます。

ポイント
  • 5行目:ContentDocumentには「メモ」も格納されているため、「FileType != ‘SNOTE’」で「メモ」を排除
  • 5行目:ライブラリに共有されているファイルの権限は更新できないため、「ParentId = null」でライブラリに共有されているファイルを排除
  • 11行目:「LinkedEntityId.getSobjectType() == Account.SObjectType」で取引先に添付されているファイルのみに更新対象を絞り込み

データローダによる変更

最後にデータローダを使用した権限の変更方法です。

STEP
ContentDocumentを取得

オブジェクトにContentDocumentを選択し、

以下のSOQLを元にContentDocumentを取得します。

SOQL

Select Id, FileType from ContentDocument Where FileType != ‘SNOTE’ AND ParentId = null

STEP
ContentDocumentLinkを取得

STEP1で取得したContentDocumentのIdを条件に指定し、ContentDocumentLinkを取得します。

SOQL

Select Id, ShareType, LinkedEntityId From ContentDocumentLink Where ContentDocumentId = ‘0695h00000B1NtFAAV’

STEP
ContentDocumentLinkを更新

STEP2で取得したレコードのうち、「ShareType」が「V」のものを「I」に更新

データローダでの更新は、個人的には以下の点から少々使いにくさを感じました。

注意点
  • ContentDocumentLink取得時にContentDocumentIdを指定する必要あり(数が多いと大変)
  • ContentDocumentLink取得時にファイルの添付先のオブジェクトを指定できない
  • ContentDocumentLink取得時にShareTypeを指定できない

一括でファイル権限を更新したい時は、2つ目に記載したApexによる更新を利用した方がよいかもしれませんね。

まとめ

今回はファイルの権限についてまとめてみました。

相変わらずファイル周辺はややこしいですね。

ファイル権限の変更については個人的には、以下のような使い分けがよさそうな印象です。

  • 1件の特定のファイル権限を変更
    ⇒ 「共有」から変更
  • 複数のファイル権限を一括変更
    ⇒ Apexによる変更

データローダはエクスポートを複数回する必要があったりと少し面倒なので。

今回はここまで!

参考資料

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

某SIer勤務。
新卒文系からエンジニア就職。
日々の学びをつらつらと書いています。
保有資格:Salesforce認定アドミニストレーター
     Salesforce認定Platformデベロッパー
     Salesforce認定上級Platformデベロッパー

コメント

コメントする

CAPTCHA


目次