一 权限分类
1.库级权限
connect 权限
拥有连接数据库的权限
执行SELECT、INSERT、UPDATE 和 DELETE 语句,如果用户有必要的表级权限
创建视图,如果用户有对底层表的 Select 权限
创建同义词
创建临时表及创建临时表上的索引
授予表或视图的权限,如果该用户拥有该表(或已经由 WITH GRANT OPTION 关键字被授予对表的权限)
resource 权限
除了包含connect权限外,还有 create table,create index,create udr ,create type 权限
dba权限
除了包含resource外还拥有如下额外权限
将任何数据库级权限授予另一用户,包括 DBA 权限
将任何表级权限授予另一用户或角色
将角色授予用户或授予另一角色
取消权限,您在 REVOKE 语句的 AS 子句中将其 grantor 指定为 revoker
当注册 UDR 时,限制 DBA 的 Execute 权限
执行 SET SESSION AUTHORIZATION 语句
创建任何数据库对象
创建表、视图和索引,指定另一用户为这些对象的所有者
改变、删除或重命名数据库对象,不管谁拥有它们
执行 UPDATE STATISTICS 语句的 DROP DISTRIBUTIONS 选项
执行 DROP DATABASE 和 RENAME DATABASE 语句
2.对象级权限
表权限
INSERT DELETE SELECT UPDATE REFERENCES INDEX ALTER UNDER ALTER
ALL 关键字将所有可能的表级权限授予指定的用户
分区级权限
INSERT DELETE UPDATE
ALL
例程
EXECUTE
序列
ALTER SELECT
ALL
语言
在注册 UDR时 需要语言级权限
SPL C JAVA
public 权限
public权限 是特殊的权限控制组,具有一组权限,默认的权限为 su-idx---
s(选择)、u(更新)、*(列级别特权)、i(插入)、d(删除)、x(索引)、a(改变)和 r(引用)
二权限的转授
WITH GRANT OPTION 关键字将权限递给 user,随同将相同的权限授予其他用户的权利
三权限的转移
AS grantor
默认情况下是执行当前授权语句的用户,使用as grantor 后 授权者为grantor
在数据库中一般遵循谁授权谁起效的原则
比如dba1 授权 001 用户 查询 t1表的权限,也应该由dba1回收该权限,dba2 无权操作
四鉴权流程
1 检查用户权限
2 检查角色继承权限
3 检查public权限
只要以上任何一个环节检查到拥有所需权限,该用户的访问就被允许
用户拥有的最终权限是(直接权限 + 角色权限 + PUBLIC 权限)的并集
五基础使用
1 创建用户 user01
2 授予库级权限
grant connect/resource/dba to user01;
3 回收权限
revoke connect/resource/dba from user01;
4 表级权限
GRANT ALL ON tab1 TO user01;
revoke all on tab1 from user01;
5 例程级权限
GRANT EXECUTE ON PROCEDURE/FUNCTION/ROUTINE delete_order TO user01;
REVOKE EXECUTE ON PROCEDURE/FUNCTION/ROUTINE delete_order FROM user01;
6 序列级权限
grant all on seq to user01;
REVOKE ALL ON seq FROM user01;
7 语言级权限
GRANT USAGE ON LANGUAGE SPL/C/JAVA TO user01;
REVOKE USAGE ON LANGUAGE SPL/C/JAVA FROM user01;
8.public 权限
GRANT ALL ON tab1 TO public;
revoke all on tab1 from public;
注册UDR 与创建UDR 的区别
创建UDR 指的是使用原生的PL语言创建
注册UDR 指的是引用c或这java等外部语言创建的UDR
六权限查询
1 库级权限查询
database test;
select * from sysusers where username='user01';
username 用户名
usertype 权限类型 D DBA C CONNECT R RESOURCE
2 查询表/序列 级权限
SELECT
t.owner, -- 表的所有者
t.tabname, -- 表名
a.tabauth -- 权限代码
FROM
systabauth a,
systables t,
sysusers u
WHERE
a.tabid = t.tabid
AND a.grantee = u.username
AND u.username = 'user01';
3 查询例程级权限
SELECT
p.procname, -- 例程的名字
a.grantee, -- 被授予权限的用户
a.procauth -- 权限代码
FROM
sysprocauth a,
sysprocedures p
WHERE
a.procid = p.procid -- 关联查询例程名称
AND a.grantee = '你要查的用户名';
4 查询语言级权限(是否有权限注册UDR)
SELECT
langid, -- 语言 ID
grantee, -- 被授权用户
langauth -- 权限代码
FROM
syslangauth
WHERE
grantee = 'username'; -- 替换为你想要查询的用户名
对照关系为
langid langname commet
0 builtin 内建
1 c c
2 spl 原生plsql语法
3 java java
4 client 可能是4GL 几乎用不到
七案例
创建只读用户
1 先查询当前库下所有表的所有这
select tabname,owner from systables where tabid >99;
2 回收表的public 权限
3 授予 select 权限
drop procedure if exists grant_onlyselect(varchar);
create procedure grant_onlyselect(p_user varchar(128))
define p_tab varchar(128);
FOREACH select tabname into p_tab from systables where tabid > 99 and tabtype = 'T'
execute immediate "revoke all on "||p_tab||" from public";
execute immediate "grant select on "||p_tab||" to "||p_user|| " with grant option";
END FOREACH;
end procedure;
数据库对象的拥有者具有该对象的绝对控制,非拥有者需要授权访问