青年数据库学习互助会

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

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

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

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