2017-03-28 39 views
0

我想創建一個函數,以防止當前登錄用戶在scott.emp表中查看他們自己的記錄。防止當前用戶看到他們的記錄? VPD - ORACL12C

我寫了一個函數來執行該策略。目前返回聲明是return 'ename != CURRENT_USER';但是這不起作用。

我不確定是否必須添加一個新的函數參數,或者如果我只需要更改返回語句。在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你是對的,需要工作的命名約定大聲笑 –

回答

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', 'CURRENT_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上下文的預定義名稱空間。上下文是數據庫存儲在內存中的名稱值巴黎的集合。 'SYS_CONTEXT'返回與上下文'namespace'關聯的參數的值。此外,您可以創建自己的環境。 [創建上下文](https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_5002.htm#SQLRF01202) –

相關問題