【问题标题】:How to know if a user has a privilege on Object?如何知道用户是否对 Object 有权限?
【发布时间】:2023-04-07 11:38:01
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

    标签: sql oracle plsql privileges


    【解决方案1】:

    你可以使用table_privileges:

    select * from table_privileges;
    

    这不需要您的用户具有任何特定权限。

    【讨论】:

      【解决方案2】:

      我敢打赌,您通过角色而不是直接授予对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

      【讨论】:

        【解决方案3】:

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

        试试:

        grant select on sys.dba_tab_privs to <user>;
        

        这应该会照顾好它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-06
          • 2017-06-07
          • 1970-01-01
          • 1970-01-01
          • 2020-10-07
          • 2012-05-27
          • 2011-03-05
          • 1970-01-01
          相关资源
          最近更新 更多