我想知道用户是否对某个对象拥有特权。
我正在研究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,因为我可以查询它,但是在尝试使用函数自动化它时。它不起作用。
有什么想法吗?
答案 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>;
这应该照顾它。