2017-03-28 7 views
0

現在ログインしているユーザーが自分のレコードをscott.empテーブルに表示できないようにする関数を作成しようとしています。現在のユーザーに自分のレコードが表示されないようにしますか? VPD-ORACL12C

私はポリシーを実施する機能を書いています。現在、return文はreturn 'ename != CURRENT_USER';ですが、これは機能しません。

新しい関数パラメータを追加する必要があるのか​​、return文を変更する必要があるのか​​わかりません。 return文に複数の引用符を入れると、エラーのある関数がコンパイルされます。私は行方不明の書式がありますか?

create or replace function self(
    p_schema in varchar2, 
    p_object in varchar2) 
return varchar2 as 
begin 
    return 'ename != CURRENT_USER'; 
end; 
/

begin 
    dbms_rls.add_policy 
    (object_schema => 'SCOTT', 
    object_name => 'EMP', 
    policy_name => 'self', 
    policy_function => 'self'); 
end; 
/
+0

'self'は、キーワードである - それはタイプで使われています。 Oracleではこれを使用することができますが、別の名前を使用する方が良いでしょう。どのように 'not_self'(これもまた真実です)はどうですか? – APC

+0

@APCあなたは正しいです、命名規則lol –

答えて

1

あなたの現在の機能は、固定文字列を返して "私の関数のreturn文は、しかし、これは動作しません...です"。あなたのテーブルにCURRENT_USERというカラムがない限り、それは常にランタイムエラーを投げます。

"return文に複数の引用符を入れると、エラーのある関数がコンパイルされます。"

あなたはどのようなエラーが発生するのかわかりませんが、私はORA-00984: column not allowed hereを推測しています。これは、current_user()が有効なOracleデータベース関数ではないためです(JDBCではサポートされていると思いますが、それとは異なります)。

必要なものは、USERです。この機能を試してみてください、それはあなたのために動作します:

create or replace function banself(
    p_schema in varchar2, 
    p_object in varchar2) 
return varchar2 as 
begin 
    return 'ename != USER'; 
end; 
/
+0

に取り組む必要があります。これはうまくいきました、ありがとう!私はちょうど 'ename!= USER'としても動作することに注意したい。 あなたが正しいと思いますが、私はエラーを表示して、それらをチェックすることを完全に忘れていました。申し訳ありません。 –

+0

@ MarkD - あなたは大丈夫です。 – APC

0

CURRENT_USERはSYS_CONTEXT( 'USERENV'、 'C​​URRENT_USER')または関数DBMS_UTILITY.OLD_CURRENT_USERでアクセス可能です。

あなたは返信文をに変更する必要があります。 return 'ename != DBMS_UTILITY.OLD_CURRENT_USER '; またはreturn 'ename != sys_context (''userenv'', ''current_user'') ';

+0

私は参照してください... 'userenv'パラメータはbtwを表していますか? –

+0

'Userenv'はOracleコンテキストの事前定義された名前空間です。コンテキストは、dbがメモリに格納する名前と値のparisのセットです。 'SYS_CONTEXT'はコンテキスト' namespace'に関連するパラメータの値を返します。さらに独自のコンテキストを作成することもできます。 [コンテキストの作成](https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_5002.htm#SQLRF01202) –

関連する問題