我有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。
有谁知道这有什么问题?
答案 0 :(得分:0)
确保对象名称使用大写,即使将对象名称作为参数传递,除非您专门使用双引号创建对象。如果在创建对象名称时不使用双引号,则对象名称将在内部以大写形式存储。
您没有初始化Output - 函数的返回值。如果查询与任何行不匹配,会发生什么?这意味着返回值可能是不确定的。
除非您专门使用双引号将Table1命名为Table1(当创建Table1时),否则Table1将在内部存储,作为TABLE1存储在数据字典中。这意味着如果使用ObjectName(表名)参数“Table1”调用函数中的查询可能不一定匹配任何行。
这也不是必需的,但最好在函数中添加异常处理程序,以确保异常不会阻止返回值按预期完全设置。