【发布时间】:2016-01-25 13:54:58
【问题描述】:
我有一个 PL/SQL 函数来检查角色是否对某个对象具有特权
CREATE OR REPLACE FUNCTION HasPrivilegeOnObject(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
output := 1;
END IF;
RETURN output;
END hasprivilegeonobject;
我会检查它:
call dbms_output.put_line(HasPrivilegeOnObject('Role1','Table1','TableOwner','UPDATE'));
结果是:1;
但是当我运行与函数内部相同的查询时:
select count(*) from DBA_TAB_PRIVS where
GRANTEE = 'Role1' and
OWNER = 'TableOwner' and
TABLE_NAME = 'Table1' and
Privilege = 'UPDATE';
结果为 0。
有人知道这是怎么回事吗?
【问题讨论】:
-
在你的函数 ObjectName "Table1" 被用于 TABLE_NAME 过滤器,但是在实际查询中它使用 RoleName "Role1",因此我相信结果不同。
-
两种情况下参数不同可能导致o/p不同。
-
将查询复制到 Stackoverflow 时实际上是一个错误 :) !我编辑了线程。
-
这就是更改发布内容的问题;有可能(甚至在这种情况下可能)您在两个示例中使用的值有所不同,但是因为您已经更改了它们,所以我们无法发现它。我猜你有错字或交换了两个字段,但这只能是一个猜测,唉。
-
在查询中添加“where rownum 0 ...”代码了。
标签: oracle