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)
。 expr1
、expr2
和expr3
对应于ALL_OBJECTS
系统视图中的OBJ_ID
、SCHEMA_ID
和USER_ID
字段。
下面介绍 对象类型
和 操作类型
的取值说明。
对象类型
expr4
支持的对象类型如下,如果指定空串或者不是以下类型名,则表示对象类型ID为0
。expr4
支持直接指定对象类型ID。- 如果想指定
对象类型
名,只能选择表格中的对象类型名
;如果想指定对象类型ID
,可以通过查找 ALL_OBJECTS 系统视图中的OBJ_TYPE
字段,其对应的值为对象类型ID
。
对象类型名 | 对象类型ID | 说明 |
---|---|---|
TAB | 5 | 表 |
VIEW | 9 | 视图 |
PROC | 7 | 存储过程或函数 |
PACK | 18 | 包 |
SEQ | 8 | 序列 |
UDT | 19 | 用户自定义类型 |
DB | 1 | 数据库 |
SCHEMA | 4 | 模式 |
SPACE | 2 | 表空间 |
TRIG | 11 | 触发器 |
DBLINK | 12 | DBLINK访问连接 |
REPLICATION | 13 | 数据复杂 |
JOB | 22 | 定时作业任务 |
操作类型
expr5
支持的操作类型如下,如果指定空串或者不是以下类型名,则表示操作类型ID为0
(表示检查是否拥有对象上的任何一种操作权限)。expr5
支持直接指定操作类型ID(表示检查是否拥有对象上的某一种操作权限)。- 如果想指定
操作类型
名,只能选择表格中的操作类型名
;如果想指定操作类型ID
,可以通过查找 SYS_AUDIT_RESULTS 系统视图中的ACTION
字段,其对应的值为操作类型ID
。
操作类型名 | 操作类型ID | 说明 |
---|---|---|
R | 0 | 查询行 |
W | 2 | 更新行 |
I | 1 | 插入行 |
D | 3 | 删除行 |
F | 5 | 引用 |
X | 4 | 执行过程或函数 |
M | 26 | 修改对象 |
* | 0 | 查询 |
C | 10 | 创建对象 |
A | 46 | - |
G | 38 | 授权 |
S | 47 | 设置安全策略 |
U | 50 | 设置审计 |
提示
- 如果指定操作类型名,函数只判断类型名的首字母,匹配则表示检查特定的操作权限。
输出结果
返回 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] 权限不够