暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle只读账号如何简化权限管理

 
在日常的运维中,经常会遇到只读账号需求(如报表,数据安全管控等),但是Oracle权限管理一直被诟病,因为在oracle 23ai之前都没有办法做schema级别的授权,如果想让用户A,拥有对用户B所有表的只读权限,需要将B用户下的所有表做单独赋权,这就非常麻烦,如果用户B又经常有新建表或者新建视图等,那么每增加一个表都需要单独赋权非常不方便,每次新增加一个表都需要DBA来介入做赋权,很是繁琐! 
Oracle 23ai新特性schema级别授权:将用户test下所有表赋予norton用户只读权限。
    SQL> grant select any table on schema test to norton;


    复制
    针对时不时就有开发同仁找我来处理无法访问新建的表的问题,我做了一个如下的脚本来定时刷权限。
    这个脚本实现的是将ods和cache用户下的所有table和view赋予readrpt只读权限,并根据ddl的频率,设定为每日或者每周执行一次,刷新一次赋权即可
      #!/bin/bash
      # 抓取Oracl环境变量
      source home/oracle/.bash_profile
      # 日志文件路径
      LOG_FILE="/tmp/oracle_grant.log"


      # 清空日志文件并记录开始时间
      echo "==== 权限刷新开始 $(date) ====" > $LOG_FILE


      # 赋予READRPT用户对ODS/CACHE用户下所有table view SELECT权限
      sqlplus -s as sysdba <<EOF >> $LOG_FILE
      SET SERVEROUTPUT ON
      DECLARE
          v_sql VARCHAR2(1000);
      BEGIN
          -- 处理ODS用户的表和视图
          FOR tbl IN (
              SELECT table_name FROM all_tables WHERE owner = 'ODS'
              UNION
              SELECT view_name AS table_name FROM all_views WHERE owner = 'ODS'
          ) LOOP
              BEGIN
                  v_sql := 'GRANT SELECT ON ODS."' || tbl.table_name || '" TO READRPT';
                  EXECUTE IMMEDIATE v_sql;
                  DBMS_OUTPUT.PUT_LINE('Granted SELECT on ODS.' || tbl.table_name);
              EXCEPTION WHEN OTHERS THEN
                  DBMS_OUTPUT.PUT_LINE('Failed for table/view: ODS.' || tbl.table_name || ' - ' || SQLERRM);
              END;
          END LOOP;


          -- 处理CACHE用户的表和视图
          FOR tbl IN (
              SELECT table_name FROM all_tables WHERE owner = 'CACHE'
              UNION
              SELECT view_name AS table_name FROM all_views WHERE owner = 'CACHE'
          ) LOOP
              BEGIN
                  v_sql := 'GRANT SELECT ON CACHE."' || tbl.table_name || '" TO READRPT';
                  EXECUTE IMMEDIATE v_sql;
                  DBMS_OUTPUT.PUT_LINE('Granted SELECT on CACHE.' || tbl.table_name);
              EXCEPTION WHEN OTHERS THEN
                  DBMS_OUTPUT.PUT_LINE('Failed for table/view: CACHE.' || tbl.table_name || ' - ' || SQLERRM);
              END;
          END LOOP;
      END;
      /
      EXIT;
      EOF


      # 记录完成时间
      echo "==== 权限刷新完成 $(date) ====" >> $LOG_FILE
      复制
      再利用一键部署脚本将这个脚本一次性部署到全部的报表数据库中,解决频繁需要手动赋权的麻烦。
      相关链接脚本链接
      如何一键完成20个Oracle实例运维脚本部署
      Oracle自动处理表空间不足脚本
      分享两个ADG监控脚本
      oracle常用监控脚本(纯干货,没有EMCC,ZABBIX也不怕)
      DataDocks 数据码头 💬

      最近联合几个 ACE 开通了一个付费微信群,加群后会有一些会员福利(分享各类技术文档,干货资源,问题解答等等),更有特邀嘉宾会定期在群内直播,解读AWR,快问快答等!有兴趣联系微:xiaowai23z

      私域知识库共享超多干货,无需再去网上搜索繁杂的资料,就可搞定日常数据库运维

      文章转载自青年数据库学习互助会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论