API Only
とAPI Enabled
を除き、すべてが無効になっているユーザープロファイルがあります。このユーザープロファイルには、RESTサービスが定義されている一連のクラスにアクセスできるようになっています。Schema.getGlobalDescribe()の呼び出しを、共有しないと宣言されたクラスのシステムコンテキストで実行しないでください。
Schema.getGlobalDescribe()
を呼び出すと、非常に奇妙な動作が見られます。すべてのクラスが同じ方法で定義されていても、そのクラスを呼び出すクラスに応じて異なる応答を受け取ります。問題の簡略化されたバージョンは次のとおりです。
global without sharing class WebServiceClass {
{
System.debug(WebServiceClass.fieldsContainName()); // THIS RETURNS TRUE
System.debug(UtilityClass.fieldsContainName()); //THIS RETURNS FALSE!
}
global static Boolean fieldsContainName() {
System.debug(Schema.getGlobalDescribe().get('contact').getDescribe().fields.getMap().keySet().contains('name'));
}
}
global without sharing class UtilityClass {
global static Boolean fieldsContainName() {
System.debug(Schema.getGlobalDescribe().get('contact').getDescribe().fields.getMap().keySet().contains('name'));
}
}
これはなぜでしょうか?
'共有しないでください 'は、クラスが共有せずに実行されますが、システムモードではなくユーザーモードで実行されますか?私はなぜSOQL文を実行して(クラスがシステムモードで実行されていることを示唆する)カラムを取得できるのか分かりませんが、 'Database.query()'を使って同じクエリを実行すると、 ?それはなぜでしょうか? – barelyknown
共有とシステムモードは2つの直交状態です。共有はシステムの行にのみ影響し、ユーザーとシステムのモードはどのオブジェクトとフィールドに影響を与えますか。 – superfell
違いを見る特定の例を投稿できますが、動的なsoqlは通常のインラインクエリと同じにする必要があります。 – superfell