Oracle 只读账号的创建、授权、撤权以及权限查看的介绍

2024-07-25  本文已影响0人  moutory

前言

最近刚好需要创建一个只读账号给非项目组的同事使用,结合网上的文章整理了一下创建只读账号的常用操作,方便后续查看,也希望文章的内容对各位读者有所帮助。

实现目标:把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的权限也是能让其登录的。

查看CONNECT角色的权限
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;

参考文章:

Oracle创建只读账号的详细步骤
Oracle授予/撤销权限

上一篇下一篇

猜你喜欢

热点阅读