0

0

如何创建与管理Oracle角色_CREATE ROLE与权限批量授予机制

P粉602998670

P粉602998670

发布时间:2026-03-13 13:35:02

|

646人浏览过

|

来源于php中文网

原创

CREATE ROLE 最易漏掉 NOT IDENTIFIED 和 IDENTIFIED BY;不加则11g默认不可授予,12c+虽默认NOT IDENTIFIED但显式声明更安全可靠。

CREATE ROLE 语法里最容易漏掉的两个关键词

oracle 中 create role 默认创建的是“普通角色”,它不能被授予给其他角色,也不能跨 pdb(在多租户环境中)自动继承。如果你后续想用 grant role_name to role_name 做角色嵌套,或者希望角色在应用连接时默认生效,必须显式加上 not identifiedidentified by —— 即使你并不打算用密码激活它。

常见错误现象:ORA-01923(角色已存在但无法被授予)、ORA-01932(管理员权限不足,实则是角色未声明可被授予)。根本原因常是忘了加 NOT IDENTIFIED,导致角色被创建为“不可授予”类型。

  • CREATE ROLE app_reader NOT IDENTIFIED:推荐写法,明确支持角色嵌套和 GRANT TO ROLE
  • CREATE ROLE app_reader IDENTIFIED BY pwd123:仅当你需要密码激活(比如通过 SET ROLE 手动启用)才用
  • 不加任何 IDENTIFIED 子句 → Oracle 默认创建为 NOT IDENTIFIED,但这是 12c+ 的行为;11g 及更早版本会创建为“不可授予”角色,兼容性风险高

批量授予权限时,SYS.DBMS_SQL 不是好选择

有人想用 DBMS_SQL 动态拼 SQL 给多个对象授相同权限,结果触发大量硬解析、权限检查开销,还容易因引号/空格出错。真正高效且安全的做法,是用数据字典视图生成授权语句,再统一执行。

使用场景:给 50 张表统一授予 SELECT,或把某用户下所有 PROCEDUREEXECUTE 授给一个角色。

  • 先查出目标对象:SELECT 'GRANT SELECT ON ' || owner || '.' || table_name || ' TO app_reader;' FROM dba_tables WHERE owner = 'APP_SCHEMA' AND status = 'VALID'
  • SPOOL 或客户端导出为脚本,人工审核后再 @grant_script.sql 执行
  • 避免用 EXECUTE IMMEDIATE 在循环里反复调用 GRANT:每次都会触发完整的权限校验与审计日志写入,性能差且难追溯
  • 注意 dba_tab_privsdba_role_privs 区分“对象权限”和“角色权限”,别混用

角色启用状态(ENABLED)比你想象中更脆弱

即使你把 app_reader 授给了用户,并且用户登录后能 SELECT,也不代表该角色始终生效——Oracle 默认只在会话初始化时检查 DEFAULT ROLE,之后如果 DBA 执行了 ALTER USER ... DEFAULT ROLE NONE,或用户自己执行了 SET ROLE NONE,角色就静默失效了。

性能影响不大,但排查时极易误判:明明 GRANT 过了,SELECT 却报 ORA-00942(表或视图不存在),其实是角色没启用,导致对象不可见。

Nanonets
Nanonets

基于AI的自学习OCR文档处理,自动捕获文档数据

下载
  • 检查当前会话启用的角色:SELECT * FROM session_roles
  • 确保角色设为默认:ALTER USER app_user DEFAULT ROLE app_reader
  • 如果应用用连接池(如 UCP、Druid),某些驱动会在连接复用时不清除角色状态,导致前一个用户的 SET ROLE 影响下一个用户 —— 此时应在连接获取后显式执行 SET ROLE app_reader

回收权限时,CASCADE 不等于“连子角色一起删”

DROP ROLE 本身不会级联删除依赖它的权限,但 REVOKE 有隐含行为:如果某个权限是通过角色 A 授予的,而你只对用户执行 REVOKE 角色 A,那用户失去的是整个角色包含的所有权限;但如果角色 A 被其他角色 B 依赖,B 并不会因此失效 —— Oracle 不维护角色依赖图谱。

容易踩的坑是以为 REVOKE app_reader FROM app_user 就万事大吉,结果发现用户还能查表,原因是:表权限曾被直接授予过该用户(GRANT SELECT ON t TO app_user),和角色无关。

  • 查直接授给用户的对象权限:SELECT * FROM dba_tab_privs WHERE grantee = 'APP_USER'
  • 查该用户拥有的角色:SELECT granted_role FROM dba_role_privs WHERE grantee = 'APP_USER'
  • 回收前务必确认是否要同时清理直接授予的权限,否则权限残留会导致最小权限原则失效
  • DROP ROLE 后,原角色名可立即重用,但之前基于它的 GRANT 记录仍保留在数据字典中(DBA_ROLE_PRIVS 里对应行消失,但 DBA_SYS_PRIVS 等不受影响)

角色管理真正的复杂点不在创建或授权,而在权限生命周期的可见性:你很难一眼看出“这个用户到底能访问哪些表”,因为路径可能是用户 → 角色A → 角色B → 对象权限,中间任意一环都可能被单独修改或禁用。别依赖记忆,定期用 SELECT * FROM role_role_privssession_privs 验证实际生效链路。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1134

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

381

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2174

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

380

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1703

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

586

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

440

2024.04.29

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号