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] 权限不够