美文网首页
Oracle 只读账号的创建、授权、撤权以及权限查看的介绍

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

作者: moutory | 来源:发表于2024-07-25 14:58 被阅读0次

    前言

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

    实现目标:把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授予/撤销权限

    相关文章

      网友评论

          本文标题:Oracle 只读账号的创建、授权、撤权以及权限查看的介绍

          本文链接:https://www.haomeiwen.com/subject/exgphjtx.html