アクセス制御に関する考慮点
いくつかのアドバンス SQL API を使用してアクセス制御を使用しないようにできます。このような状況が検出されると、AdvancedQueryAccessException が発生します。以下のようにアドバンス照会を使用した場合に、この例外が発生します。
• 副問い合わせ (wt.query.SubSelectExpression)
• MINUS または INTERSECT 複合ステートメント (wt.query.CompoundQuerySpec)
• 外部テーブル (wt.query.ExternalTableExpression)
• 集約関数 (wt.query.SQLFunction)
AVERAGE
MAXIMUM
MINIMUM
SUM
COUNT
• ROWNUM キーワード (wt.query.KeywordExpression)
この例外は、知らないうちにアクセス制御がバイパスされないようにするために発生します。アクセス制御を使用しないこれらのアドバンス SQL 機能を使用することが合理的な場合もあります。このような場合は、アドバンスチェックを実行時に使用不可能にできます。照会仕様クラスは、サーバー側のコードからのみ設定できる advancedQueryEnabled 属性をサポートします。可能な場合は、PersistenceManager の照会および検出 API に渡される照会のインスタンスでこの属性を真に設定し、例外が発生することなくこれらの照会を実行できるようにします。
// Use advanced APIs to build query.
// Disable checking of advance features statement.setAdvancedQueryEnabled(true);
// Execute query with access control
PersistenceHelper.manager.find(statement);
find() メソッドは、アクセス制御が適用されるステートメントを実行します。そのため、アクセス制御に関連するコラムが暗黙的に選択に追加される場合があります。集約関数である INTERSECT および MINUS など一部のアドバンス機能では、これらのコラムの追加により、予測される結果が影響を受ける、または SQL 例外が発生する場合があります。その場合、照会を正常に実行するには、サーバー側でアクセス制御が適用されない query() メソッドを使用します。
PersistenceServerHelper.manager.query(statement);