【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が設定されています。
そのため、取得した権限セット設定用レコードをコピーして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.