function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
tk0604tk0604 

権限のないオブジェクトへのApexからの追加・更新・削除

プロファイルで、あるオブジェクトへの追加・更新・削除ができず、参照のみができるように権限設定がされている場合、

Apexのクラス(トリガーではない)のメソッドからそのオブジェクトへ、

insertやupdateやdeleteを行う方法はありますか?

 

「クラスの先頭にwith sharingを付けなければ、システム管理者権限でApexメソッドが実行される」と聞いたのですが、

つけた場合と同じ結果になってしまい、上手くいきませんでした。

 

方法があれば、教えて頂ければ幸いです。

よろしくお願いいたします。

ikouikou

オブジェクトのCRUDはApex上で無視されるので、そこが原因で登録できないってことはないと思います。

別の原因じゃないでしょうか。

 

ちなみにwith sharing はレコードへの共有ルールを適用するかどうかであって、CRUDとは別の話しです。

共有ルールを無視してシステム権限で動作させるのであれば、with sharingを付けないのではなく、

without sharingを付けましょう。

 

この辺のリンクが詳しいです。

http://blog.flect.co.jp/salesforce/2010/11/with-sharingwit.html

tk0604tk0604

お早いご返信、ありがとうございます。

with sharingについては勘違いでした。

共有権限については、無視して実行するようなことは無いので、with sharingは付けたままにしています。

 

更新できない原因を調べたところ、visualforceにて、InputTextを使って更新権限のないオブジェクトの項目を表示させていて、

そこに値を入力して画面遷移する⇒オブジェクトのチェックが走ってしまうことでした。

 

このチェックに引っかかってはどうしようもないので、一応、オブジェクトの権限は必要に応じて持つことにしていますが、

このチェックをさせないことは可能でしょうか?

minoawminoaw

どうやら権限のないオブジェクトの項目へ直接バインディングしているとエラーが発生するようですね。
値を別のクラスに切り離してそれを参照することでエラーを出さずに権限のないユーザでも保存できました。

public class UnauthorizedDML {
    public String name { get; set; }
    public void save() {
        Account acc = new Account();
        acc.Name = name;
        upsert acc;
    }
}

 

 

<apex:page controller="UnauthorizedDML">
    <apex:pageMessages ></apex:pageMessages>
    <apex:form >
        <apex:commandButton action="{!save}" value="save" />
        <apex:inputText value="{!name}" />
    </apex:form>
</apex:page>

 

 

tk0604tk0604

ご返信、ありがとうございます。

やはりvisualforceでバインドするとエラーになるのですね。器用にApexだけから参照するような形にしなければいけないですね。

 

直接バインドすれば必須入力チェックや入力規則が行われるので、できればVisualforceにバインドしたいですが、

それらのチェックと同時に権限のチェックも行われてしまうということであれば、それは無理そうですね・・・。

ただ、頂いたソースを参考にし、バインドしなければ大丈夫という事は確認できました。

ありがとうございます!

 

 

ちなみに、昨日発見したのですが、

オブジェクトの標準ボタンを、Visualforceページで上書く機能がありますよね。

あれを使用し、「編集」ボタン押下で、項目が何もない空のページに飛ばすように設定したところ、

オブジェクトの詳細画面でのインライン入力も、できなくなるという現象が起きました。

 

(要はユーザがApex以外からオブジェクトを編集できなくしたいので、)

権限上はオブジェクトへの更新をできるようにし、編集ボタン遷移先を空ページなどにすることで、

結果的にユーザは編集できなくなりますので、

この方法を使えたら、行けそうだと思っております。

 

 

・・・しかし、

「編集ボタン遷移先で、何も編集できなくすると、詳細画面のインライン編集もできなくなる」などという仕様はどこにも書いていないので、本当にそういう仕様だと信じて使っていいものなのでしょうか?

という、ちょっと不安があります。

salesforceの仕様についてご存知の方いらっしゃいましたら、教えて頂けると助かるのですが・・・(><)

何度も質問して、すみません。