【Salesforce】You can’t assign or unassign this permission set because it’s associated with a profile.

【Salesforce】You can’t assign or unassign this permission set because it’s associated with a profile.

月次のバッチ処理にて、コミュニティユーザの更新処理を行っています。

その処理の中で、特定の条件でコミュニティユーザのプロファイルを変更しています。

コミュニティユーザのプロファイルを変更することにより、場合によってはライセンスが変更されてしまいます。

それだけであれば良いのですが、ライセンスの変更が伴うことにより、権限セットも外れてしまうんですね。

そんなわけで、ユーザを更新する前に設定されていた権限セットをユーザの更新後にセットする処理を追加しました。

Set<Id> updateUserIdSet;
List<User> updateUserList;
List<PermissionSetAssignment> oldPermissionList;
List<PermissionSetAssignment> newPermissionList;

// 更新対象ユーザのIdを取得する
updateUserIdSet = new Set<Id>();

// ~ Id取得処理 ~

// 更新対象のユーザーを取得する
updateUserList = [select Id from User where Id IN updateUserIdSet];

// 更新対象ユーザと紐づく権限セット設定レコードを取得する
oldPermissionList = [select
                         Id, AssigneeId, PermissionSetId
                     from
                         PermissionSetAssignment
                     where
                         AssigneeId IN :updateUserIdSet]

// ~ ユーザのプロファイル変更処理 ~

update updateUserList;

// 権限セットを再度付与する
newPermissionList = new List<PermissionSetAssignment>();
for(PermissionSetAssignment permission : oldPermissionList){

    // 権限セット設定レコードをコピーする
    newPermissionList.add(permission.clone(false, true));
}

insert newPermissionList;

イメージはこんな感じです。

PermissionSetAssignmentが設定用のオブジェクトで、AssigneeIdにユーザID、PermissionSetIdに権限セットのIDが設定されています。

https://developer.salesforce.com/docs/atlas.ja-jp.api.meta/api/sforce_api_objects_permissionsetassignment.htm

そのため、取得した権限セット設定用レコードをコピーしてInsertすることで解決するはずでした。

しかし、insertの際にエラーが発生しました。

You can't assign or unassign this permission set because it's associated with a profile.: []

プロファイルに紐づく権限セットを付けたり外したり出来ませんとのことらしいです。

試しに権限セットレコードを調べてみると、自分が知らない権限セットがたくさんありました。

List<PermissionSet> permissionSetList;

// 権限セットレコードを取得する
permissionSetList = [select
                         Id, Label, IsCustom, IsOwnedByProfile
                     from
                         PermissionSet ];

権限セットオブジェクトについて調べてみると、確かにプロファイルに関連する項目があります。

https://developer.salesforce.com/docs/atlas.ja-jp.api.meta/api/sforce_api_objects_permissionset.htm

エラーメッセージにはプロファイルに紐づく権限セットの変更について書かれていましたから、IsOwnedByProfileがtrueのものを作成しなければいけそうです。

Set<Id> updateUserIdSet;
List<User> updateUserList;
List<PermissionSetAssignment> oldPermissionList;
List<PermissionSetAssignment> newPermissionList;

// 更新対象ユーザのIdを取得する
updateUserIdSet = new Set<Id>();

// ~ Id取得処理 ~

// 更新対象のユーザーを取得する
updateUserList = [select Id from User where Id IN updateUserIdSet];

// 更新対象ユーザと紐づく権限セット設定レコードを取得する
// ただし、プロファイルに関連する権限セットは取得しない
oldPermissionList = [select
                         Id, AssigneeId, PermissionSetId
                     from
                         PermissionSetAssignment
                     where
                         AssigneeId IN :updateUserIdSet
                     and
                         PermissionSetId IN (select
                                                 Id
                                             from
                                                 PermissionSet
                                             where
                                                 IsOwnedByProfile = false)]

// ~ ユーザのプロファイル変更処理 ~

update updateUserList;

// 権限セットを再度付与する
newPermissionList = new List<PermissionSetAssignment>();
for(PermissionSetAssignment permission : oldPermissionList){

    // 権限セット設定レコードをコピーする
    newPermissionList.add(permission.clone(false, true));
}

insert newPermissionList;

このように修正することにより、正常に動作するようになりました。

権限セットはあまり触ったことがないのですが、Apexで扱う際には注意が必要ですね。

No comments.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です