0

このような単純な関数を作成しようとしましたが、機能しません。データは返されますが、ポリシーがない場合と同じです。

CREATE OR REPLACE FUNCTION test (schema in varchar2, tab in varchar2)
RETURN varchar2 AS
   predicate varchar2(4000);
   pre2 VARCHAR2(2000);
BEGIN
   pre2 := sa_session.SA_USER_NAME('policy');
   predicate := '"USER" = '''|| pre2 ||'''';
   return (predicate);
END test;
/

この関数を VPD ポリシーで使用して、ユーザーがテーブルから選択するときに行のみを選択できるようにします。

4

1 に答える 1

0

問題はこれです:

「クエリ SELECT sa_session.sa_user_name('policy') FROM DUAL を実行すると、使用しているデータベース ユーザーのユーザー名が返されます」

USER は、「データベース ユーザーのユーザー名」も返す SQL 疑似列です。したがって、基本的に述語は次のように評価されます...

where 1 = 1

...そしてそれが結果セットを制限しない理由です。

必要なのは、ポリシー名をテーブル列に適用する述語です。したがって、テーブルの列が USER_NAME の場合、次のようになります。

BEGIN
   pre2 := sa_session.SA_USER_NAME('policy');
   predicate := ' user_name = '''|| pre2 ||'''';
   return (predicate);
END test;

おそらく、テーブルの列名として USER が含まれています。それは残念なことですが(そして驚くほど悪い習慣です)、次の方法で状況を救うことができるかもしれません:

BEGIN
   pre2 := sa_session.SA_USER_NAME('policy');
   predicate := tab||'.user = '''|| pre2 ||'''';
   return (predicate);
END test; 
于 2013-06-12T19:04:52.350 に答える