HAS_FUNCTION_PRIVILEGE

说明

判断指定用户在指定函数/过程上是否具有指定权限,不指定用户则查询当前用户的权限。

语法

has_function_privilege ::=

参数

func_name

TEXT类型,被查询函数/过程的名称。

func_oid

OID类型,被查询函数/过程的ID。

user_name

NAME类型,被查询用户的用户名。

user_id

INT4类型,被查询用户的用户ID。

priv_type

TEXT类型,希望查询的权限类型,函数/过程上拥有的具体权限类型详情请见 GRANT 的对象权限列表。

返回值

BOOL 表示是否有权限

示例

-- 准备环境
CONNECT SYSDBA/szoscar55;
DROP FUNCTION FUNC1;
DROP FUNCTION FUNC2;
DROP PROCEDURE PROC1;
DROP USER U1;
DROP TABLE T1;

CREATE TABLE T1(a INT);
CREATE USER U1 PASSWORD 'szoscar55';
CREATE OR REPLACE PROCEDURE PROC1 
AS
BEGIN   
	  INSERT INTO T1 VALUES (1); 
END;
/
CREATE OR REPLACE FUNCTION FUNC1(a INT) RETURN INT
AS
BEGIN   
	  RETURN  a; 
END;
/
-- 授权
GRANT EXECUTE ON PROCEDURE PROC1 TO U1;


-- 使用用户名、函数名和权限类型查询
SELECT HAS_FUNCTION_PRIVILEGE('U1', 'PROC1()', 'EXECUTE');
HAS_FUNCTION_PRIVILEGE(boolean)      |
-------------------------------------
true                                 |
总数目:1

SELECT HAS_FUNCTION_PRIVILEGE('U1', 'FUNC1(INT)', 'DEBUG');
HAS_FUNCTION_PRIVILEGE(boolean)      |
-------------------------------------
false                                |
总数目:1

-- 使用用户ID、函数名和权限类型查询
SELECT HAS_FUNCTION_PRIVILEGE(usesysid, 'PROC1()', 'EXECUTE') FROM v_sys_user WHERE usename = 'U1';
HAS_FUNCTION_PRIVILEGE(boolean)      |
-------------------------------------
true                                 |
总数目:1

SELECT HAS_FUNCTION_PRIVILEGE(usesysid, 'FUNC1(INT)', 'DEBUG') FROM v_sys_user WHERE usename = 'U1';
HAS_FUNCTION_PRIVILEGE(boolean)      |
-------------------------------------
false                                |
总数目:1

-- 使用用户名、函数ID和权限类型查询
SELECT HAS_FUNCTION_PRIVILEGE('U1', oid, 'EXECUTE') FROM sys_proc WHERE proname = 'PROC1';
HAS_FUNCTION_PRIVILEGE(boolean)      |
-------------------------------------
true                                 |
总数目:1

SELECT HAS_FUNCTION_PRIVILEGE('U1', oid, 'DEBUG') FROM sys_proc WHERE proname = 'FUNC1';
HAS_FUNCTION_PRIVILEGE(boolean)      |
-------------------------------------
false                                |
总数目:1
-- 使用用户ID、函数ID和权限类型查询
CREATE OR REPLACE FUNCTION FUNC2(user_name TEXT, func_name TEXT, priv_name TEXT) RETURN BOOL AS
DECLARE 
	proc_id INT;
	user_id  INT;
BEGIN      
	SELECT oid INTO proc_id FROM sys_proc WHERE proname = func_name;
	SELECT usesysid INTO user_id FROM v_sys_user WHERE usename = user_name;

	RETURN HAS_FUNCTION_PRIVILEGE(user_id,  proc_id,  priv_name);	  
END;

/
SELECT FUNC2('U1', 'PROC1', 'EXECUTE');
FUNC2(boolean)      |
--------------------
true                |
总数目:1

SELECT FUNC2('U1', 'FUNC1', 'DEBUG');
FUNC2(boolean)      |
--------------------
false               |
总数目:1

-- 使用函数名和权限类型查询
SELECT HAS_FUNCTION_PRIVILEGE('PROC1()', 'EXECUTE');
HAS_FUNCTION_PRIVILEGE(boolean)      |
-------------------------------------
true                                 |
总数目:1

SELECT HAS_FUNCTION_PRIVILEGE('FUNC1(INT)', 'DEBUG');
HAS_FUNCTION_PRIVILEGE(boolean)      |
-------------------------------------
true                                 |
总数目:1

-- 使用函数ID和权限类型查询
SELECT HAS_FUNCTION_PRIVILEGE(oid, 'EXECUTE') FROM sys_proc WHERE proname = 'PROC1';
HAS_FUNCTION_PRIVILEGE(boolean)      |
-------------------------------------
true                                 |
总数目:1

SELECT HAS_FUNCTION_PRIVILEGE(oid, 'DEBUG') FROM sys_proc WHERE proname = 'FUNC1';
HAS_FUNCTION_PRIVILEGE(boolean)      |
-------------------------------------
true                                 |
总数目:1

DROP PROCEDURE PROC1;
DROP USER U1;
DROP FUNCTION FUNC1;
DROP FUNCTION FUNC2;
DROP TABLE T1;