Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


CHECK_AUTH

📄字数 2.1K
👁️阅读量 加载中...

功能描述

检查当前用户对特定对象ID是否具有某项操作类型的权限。TRUE 表示有权限,FALSE 表示没有权限。

语法格式

sql
ABS(expr1, expr2, expr3, expr4, expr5)

输入参数

  • expr1:对象ID,INTEGER 类型,或能隐式转换 INTEGER 类型的其他类型。
  • expr2:模式ID,INTEGER 类型,或能隐式转换 INTEGER 类型的其他类型。
  • expr3:属主ID,INTEGER 类型,或能隐式转换 INTEGER 类型的其他类型。
  • expr4:对象类型ID或对象类型,INTEGER/VARCHAR 类型,或能隐式转换 INTEGER/VARCHAR 类型的其他类型。
  • expr5:操作类型ID或操作类型,INTEGER/VARCHAR 类型,或能隐式转换 INTEGER/VARCHAR 类型的其他类型。

提示

  • NULL 无具体的类型,参数均为 NULL 时,会产生异常 E10100 候选函数出现多义性,需要手动为参数指定具体的类型,如:CHECK_AUTH(NULL, NULL, NULL, NULL, NULL::INTEGER)
  • expr1expr2expr3 对应于 ALL_OBJECTS 系统视图中的 OBJ_IDSCHEMA_IDUSER_ID 字段。

下面介绍 对象类型操作类型 的取值说明。

对象类型

  • expr4 支持的对象类型如下,如果指定空串或者不是以下类型名,则表示对象类型ID为 0
  • expr4 支持直接指定对象类型ID。
  • 如果想指定 对象类型 名,只能选择表格中的 对象类型名;如果想指定 对象类型ID,可以通过查找 ALL_OBJECTS 系统视图中的 OBJ_TYPE 字段,其对应的值为 对象类型ID
对象类型名对象类型ID说明
TAB5
VIEW9视图
PROC7存储过程或函数
PACK18
SEQ8序列
UDT19用户自定义类型
DB1数据库
SCHEMA4模式
SPACE2表空间
TRIG11触发器
DBLINK12DBLINK访问连接
REPLICATION13数据复杂
JOB22定时作业任务

操作类型

  • expr5 支持的操作类型如下,如果指定空串或者不是以下类型名,则表示操作类型ID为 0(表示检查是否拥有对象上的任何一种操作权限)。
  • expr5 支持直接指定操作类型ID(表示检查是否拥有对象上的某一种操作权限)。
  • 如果想指定 操作类型 名,只能选择表格中的 操作类型名;如果想指定 操作类型ID,可以通过查找 SYS_AUDIT_RESULTS 系统视图中的 ACTION 字段,其对应的值为 操作类型ID
操作类型名操作类型ID说明
R0查询行
W2更新行
I1插入行
D3删除行
F5引用
X4执行过程或函数
M26修改对象
*0查询
C10创建对象
A46-
G38授权
S47设置安全策略
U50设置审计

提示

  • 如果指定操作类型名,函数只判断类型名的首字母,匹配则表示检查特定的操作权限。

输出结果

返回 BOOLEAN 类型,任一输入参数为 NULL 时,输出结果为 UNKNOWN

示例

sql
-- 新建用户和角色
SQL> CREATE USER user_test IDENTIFIED BY '123QWE$$&';

SQL> CREATE ROLE role_1;

SQL> GRANT ROLE role_1 TO user_test;

-- 新建表对象
SQL> CREATE TABLE tab_test_privilege(a INT);

-- 给角色授予 `SELECT, INSERT, UPDATE, DELETE` 权限
SQL> GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE tab_test_privilege TO role_1 WITH GRANT OPTION;

-- 切换会话的用户为新建的 user_test 用户
SQL> $user_test

-- 查询新建的表对象 tab_test_privilege 的 ID
SQL> SELECT OBJ_ID, SCHEMA_ID , USER_ID FROM ALL_OBJECTS WHERE OBJ_NAME = 'tab_test_privilege';

+---------+-----------+---------+
| OBJ_ID  | SCHEMA_ID | USER_ID |
+---------+-----------+---------+
| 1048601 | 1         | 1       |
+---------+-----------+---------+

-- 检查 user_test 是否拥有表对象 tab_test_privilege 的 INSERT 权限
SQL> SELECT CHECK_AUTH(1048601, 1, 1 , 5, 1);

+-------+
| EXPR1 |
+-------+
| T     |
+-------+

SQL> SELECT * FROM SYSDBA.tab_test_privilege;

+---+
| A |
+---+
+---+

SQL> INSERT INTO SYSDBA.tab_test_privilege VALUES (1), (3), (4);

Total 3 records effected.
Use time:0 ms.

SQL> SELECT * FROM SYSDBA.tab_test_privilege;

+---+
| A |
+---+
| 1 |
| 3 |
| 4 |
+---+

-- 检查 user_test 是否拥有表对象 tab_test_privilege 的 UPDATE 权限
SQL> SELECT CHECK_AUTH(1048601, 1, 1 , 5, 2);

+-------+
| EXPR1 |
+-------+
| T     |
+-------+

SQL> UPDATE SYSDBA.tab_test_privilege SET a = 100 WHERE a < 4;

Total 2 records effected.
Use time:1 ms.

SQL> SELECT * FROM SYSDBA.tab_test_privilege;

+-----+
|  A  |
+-----+
| 100 |
| 100 |
| 4   |
+-----+

-- 检查 user_test 是否拥有表对象 tab_test_privilege 的 DROP 权限
SQL> SELECT CHECK_AUTH(1048601, 1, 1 , 5, 32);

+-------+
| EXPR1 |
+-------+
| F     |
+-------+

SQL> DROP TABLE SYSDBA.tab_test_privilege;

Error: [E18012] 权限不够