2014-01-07 84 views
1

我想知道用戶是否對某個對象有特權。如何知道用戶是否對Object有特權?

我正在使用SQL Developer。

當我手動查詢表DBA_TAB_PRIVS,我得到所有需要的信息。

不過,我需要一些觸發器和函數中使用這些信息。

所以,我寫PL/SQL函數,將返回1,如果一個角色擁有的特權,否則爲0。

CREATE OR REPLACE FUNCTION HAS_PRIVILEGE_ON_OBJECT(rolename  IN VARCHAR2, 
                objectname IN VARCHAR2, 
                objectowner IN VARCHAR2, 
                privilegename IN VARCHAR2) 
    RETURN NUMBER 
AS 
    output NUMBER; 
    BEGIN 

    SELECT count(*) INTO output 
     FROM dba_tab_privs 
    WHERE grantee = rolename 
     AND owner = objectowner 
     AND table_name = objectname 
     AND privilege = privilegename; 

    IF output > 0 THEN 
     RETURN 1; 
    ELSE 
     RETURN 0; 
    END IF; 
    END has_privilege_on_object; 

功能無法編譯,並說:

ORA 942:表或視圖不存在。

連接的用戶可以訪問視圖DBA_TAB_PRIVS,因爲我可以查詢它,但試圖使用函數自動執行它時。它不起作用。

有什麼想法嗎?

回答

4

我敢打賭,你通過角色有權限對dba_tab_privs,而不是通過直接補助。如果要使用定義者的權限存儲函數,則該函數的所有者必須擁有直接授予的所有對象的權限,而不是通過角色授予權限。

如果你在交互式會話禁用的角色,你還能查詢dba_tab_privs?也就是說,如果你這樣做

SQL> set role none; 
SQL> select * from dba_tab_privs 

你是否得到相同的ORA-00942錯誤?假設你做

GRANT select any dictionary 
    TO procedure_owner 

會給procedure_owner用戶查詢任何數據字典表中存儲功能的能力。當然,你也可以直接撥款dba_tab_privs

+0

開門見山!太好了!謝謝 –

2

你有權限通過角色來DBA_TAB_PRIVS。所以,執行SQL可以正常工作,但PL/SQL上下文中沒有啓用角色,所以編譯失敗。

嘗試:

grant select on sys.dba_tab_privs to <user>; 

,並應照顧它。

2

你爲什麼不使用table_privileges我不明白?

select * from table_privileges; 

給你需要的,不需要任何權利的結果...

相關問題