如何知道用户是否拥有Object权限?

时间:2014-01-07 22:27:34

标签: sql oracle plsql privileges

我想知道用户是否对某个对象拥有特权。

我正在研究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,因为我可以查询它,但是在尝试使用函数自动化它时。它不起作用。

有什么想法吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

我不明白你为什么不使用table_privileges

select * from table_privileges;

给出您需要的结果,不需要任何权利......

答案 2 :(得分:2)

您目前可以通过角色访问DBA_TAB_PRIVS。因此,执行SQL工作正常,但是在PL / SQL上下文中没有启用角色,因此,编译失败。

尝试:

grant select on sys.dba_tab_privs to <user>;

这应该照顾它。