Oracle 只读账号的创建、授权、撤权以及权限查看的介绍
前言
最近刚好需要创建一个只读账号给非项目组的同事使用,结合网上的文章整理了一下创建只读账号的常用操作,方便后续查看,也希望文章的内容对各位读者有所帮助。
实现目标:把A用户下所有表授权给B用户,B用户对A用户下的表只有只读权限
一、只读账号的创建
只读账号的创建和正常用户的创建方式一样,区别只是后面授权的环节不一样而已
下面我们创建一个用户名为USER_READ
的用户
CREATE USER USER_READ identified by "USER_123456";
二、只读账号的授权
(一)授权
只读用户的授权可以分为2个模块,操作权限授权以及资源授权
1、操作权限授权
操作权限授权主要是指配置用户连接数据库、创建视图等权限,下面的语句可以根据实际情况执行
赋予登录权限(下面的语句任选其一)
grant connect to USER_READ ;
grant create session to USER_READ ;
赋予创建视图的权限
grant create view to USER_READ ;
赋予创建同义词的权限
grant create synonym to USER_READ ;
像我的话只需要给这个只读账号登录权限即可:grant connect to USER_READ ;
授权的小细节
Oracle
数据库新建用户之后是无法登录的,需要赋予connect
角色或者create session
权限。
注意:connect
是角色不是权限,create session
是权限不是角色。角色是权限的集合。而create session权限就是connect角色所拥有的权限之一。如果不能赋予connect角色,单给新建的用户赋予create session的权限也是能让其登录的。
2、资源授权
资源授权指的是授予用于新增/删除/修改/查看某些表的权限(这里的资源并不局限于表,像存储过程、索引也是一个资源),我们可以通过下面的语句,来获取需要授权给只读账号的资源,SQL其实并不复杂,就是把一个用户下的所有表查询权限授权给我们的只读用户而已。需要注意,授权结束后只读账号只是拥有的这些表的查询权限,只读用户下并不会多一份一模一样的表出来。
下面sql中where语句的owner
条件值是授权的用户名,我们这里先假设用户名为NORMAL_USER
。如果发现没有dba_objets
表的权限的话,可以换成user_objects
表来进行操作。
获取原账号HEPSUSR用户的所有查询表权限
SELECT
'grant select on ' || owner || '.' || object_name || ' to USER_READ;'
FROM
dba_objects
WHERE
owner IN ('NORMAL_USER')
AND object_type = 'TABLE';
我们将查询出来的结果进行执行,就完成了只读账号的授权操作了。
PS:如果有部分用户表不希望授权给只读用户的话,可以把查询的结果做一下筛选,选择性执行。
(二)使用同义词简化只读账号的访问(优化项,执不执行都行)
完成前面的授权操作后,其实只读用户就已经可以查到授权用户的表数据了,但是查询起来会比较麻烦,我们需要带上Schema
来引用相关的表名,比如select * from NORMAL_USER.order_table;
,每次都这样写有点麻烦,我们可以用SYNONYM
关键字来帮助我们简化表名的书写。
通过下面的SQL得到所有需要使用同义词的表,最后把得到的结果集执行一下就行
SELECT
'create or replace SYNONYM USER_READ.' || object_name || ' for ' || owner || '.' || object_name || ';'
FROM
dba_objects
WHERE
owner IN ('NORMAL_USER')
AND object_type = 'TABLE'
执行上一个sql得到的sql结果,例如create or replace SYNONYM USER_READ.order_table for NORMAL_USER.order_table;
到这一步,我们就可以使用select * from order_table
这种不带用户名前缀的sql,来让只读账号USER_READ
比较方便查询NORMAL_USER
用户下的表了。
三、只读账号的权限撤销
如果发现自己授权的时候写多了,可以使用以下语法来完成权限的撤销
REVOKE privileges ON object FROM user;
例如我们希望撤销USER_READ
用户对order_table
表的查看权限,可以使用REVOKE select ON NORMAL_USER.order_table FROM USER_READ;
来撤回原先已经授予的查看权限。
四、只读账号的权限查询
我们希望直到当前只读账号的所有权限,可以通过下面的命令来进行查看,只要根据实际情况填一下GRANTEE字段的值就行
需要注意,这样要登录到对应只读账号的sql窗口来执行
SELECT
GRANTOR AS 被授权对象,
OWNER AS 拥有者,
TABLE_NAME AS 表名,
PRIVILEGE AS 账号拥有的权限
FROM
USER_TAB_PRIVS
WHERE
GRANTEE = 'USER_READ'
ORDER BY
TABLE_NAME,
PRIVILEGE;