在实际的生产用户过程中,角色的应用很广泛,那么到底什么是角色呢? 角色是一组权限的集合,可以授权给用户或角色,用于控制用户对对象的访问和行为。 创建用户的时候,你是否为了贪图方便直接授权DBA角色给它呢?其实这是种非常有风险的行为。 下面你可以思
在实际的生产用户过程中,角色的应用很广泛,那么到底什么是角色呢?
角色是一组权限的集合,可以授权给用户或角色,用于控制用户对对象的访问和行为。
创建用户的时候,你是否为了贪图方便直接授权DBA角色给它呢?其实这是种非常有风险的行为。
下面你可以思考两个问题:
1. connect,resource角色包含哪些权限?
2. 如何查询用户具有哪些角色?
可以通过DBA_SYS_PRIVES视图来查询
可见,我们将connect,resource角色授于用户就能满足一般用户的需要了。
因此,我们也可以很方便地根据PRIVILEGE字段来查询某些具体的权限,再根据对应角色授权给用户,做好权限控制。
SQL> select * from dba_sys_privs where GRANTEE = 'DBA';
受让人特权 ADM
------------------------------------------ -------------------- -------------------- ---
DBA 变更通知 是
DBA 管理任何 SQL 调整集 是
DBA 更改任何 SQL 配置文件 是
DBA 创建规则 是
DBA 导出完整数据库 是
DBA 执行任何评估上下文 是
DBA 使任何队列出队 是
DBA 删除任何索引类型 是
DBA 更改任何索引类型 是
DBA 执行任何库 是
DBA 创建任何库 是
DBA 创建任何目录 是
DBA 更改配置文件 是
DBA 执行任何程序 是
DBA 创建角色 是
DBA 选择任何序列 YES
DBA 删除任何索引 是
DBA 更新任何表 是
DBA 插入任何表 是
DBA 选择任何表 YES
DBA 删除回滚段 是
DBA 成为用户 是
DBA 删除表空间 是
DBA 更改会话 是
DBA 创建会话 是
DBA 分析任何字典 是
DBA 更改任何规则集 是
DBA 创建规则集 是
DBA 调试任何程序 是
DBA 创建维度 是
DBA 更改任何库 是
任何类型的 DBA 是
DBA 放弃任何物化视图 是
DBA 删除任何触发器 YES
DBA 更改任何程序 是
DBA 强制任何交易 是
DBA 更改数据库 是
DBA 删除任何表 是
DBA 更改回滚段 是
DBA 执行任何程序 是
DBA 执行任何规则 是
DBA 导入完整数据库 是
DBA 执行任何规则集 是
DBA 创建任何规则集 是
DBA 闪回任何表 是
DBA 可恢复 是
DBA 管理数据库触发器 是
DBA 创建任何大纲 是
DBA 更改任何维度 是
DBA 创建任何维度 是
DBA 执行任何操作员 是
DBA 创建类型 是
DBA 创建触发器 是
DBA 授予任何角色 是
DBA 放弃任何视图 是
DBA 创建视图 是
DBA 锁定任何表 是
DBA 更改用户 是
DBA 创建用户 是
DBA 更改表空间 是
DBA 创建表空间 是
DBA 限制会议 是
DBA 创建任何工作 是的
DBA 创建作业 是
DBA 创建任何规则 是
DBA 放弃任何评估上下文 是
DBA 创建任何评估上下文 是
DBA 创建评估上下文 是
DBA 授予任何对象权限 是
DBA 选择任何字典 是
DBA 放弃任何维度 是
任何表下的 DBA 是
DBA 创建索引类型 是
DBA 创建任何运算符 是
DBA 删除任何库 是
DBA 分析任何“是”
DBA 更改任何角色 是
DBA 创建任何序列 是
DBA 创建任何索引 是
DBA 创建任何表 是
DBA 管理文件组 是
DBA 管理调度程序 是
DBA 管理资源经理 是
DBA 更改任何大纲 是
DBA 删除任何上下文 是
DBA 执行任何索引类型 是
任何观点下的 DBA 是
DBA 删除任何类型 是
DBA 更改任何类型 是
DBA 更改任何物化视图 是
DBA 创建个人资料 是
DBA 删除公共数据库链接 是
DBA 更改任何索引 是
DBA 创建集群 是
DBA 对任何表进行评论 是
DBA 删除任何表 是
DBA 创建回滚段 是
DBA 审计系统 是
DBA 更改系统 是
DBA 管理任何文件组 是
DBA 执行任何类 是
DBA 放弃任何规则集 是
DBA 调试连接会话 是
DBA 提交刷新 是
DBA 使任何队列入队 是
DBA 创建任何索引类型 是
DBA 创建任何类型 是
DBA 删除任何目录 是
DBA 更改资源成本 是
DBA 创建任何过程 是
DBA 创建过程 是
DBA 强制交易 是
DBA 更改任何序列 是
DBA 创建序列 是
DBA 创建任何视图 是
DBA 删除公共同义词 YES
DBA 删除任何同义词 YES
DBA 创建任何集群 是
DBA 备份任何表 是
DBA 创建表 是
DBA 管理 SQL 调整设置 YES
DBA 合并任何视图 是
DBA 删除任何大纲 是
DBA 创建运算符 是
DBA 创建库 是
DBA 授予任何特权 是
DBA 删除个人资料 是
DBA 更改任何触发器 是
DBA 创建任何触发器 是
DBA 放弃任何程序 是
DBA 审计 任何 是
DBA 放弃任何角色 是的
DBA 删除任何序列 是
DBA 创建公共同义词 YES
DBA 创建同义词 YES
DBA 删除任何集群 是
DBA 更改任何表 是
DBA 创建外部作业 是
DBA 读取任何文件组 是
DBA 创建任何 SQL 配置文件 是
DBA 删除任何 SQL 配置文件 是
DBA 选择任何事务 是
DBA 顾问 是
DBA 放弃任何规则 是
DBA 更改任何规则 是
DBA 更改任何评估上下文 是
DBA 创建任何上下文 是
DBA 管理任何队列 是
DBA 全局查询重写 是
DBA 查询重写是
DBA 删除任何操作员 是
DBA EXECUTE ANY TYPE YES
DBA CREATE ANY MATERIALIZED VIEW YES
DBA CREATE MATERIALIZED VIEW YES
DBA CREATE PUBLIC DATABASE LINK YES
DBA CREATE DATABASE LINK YES
DBA CREATE ANY SYNONYM YES
DBA ALTER ANY CLUSTER YES
DBA DROP USER YES
DBA MANAGE TABLESPACE YES
160 rows selected.
这足以说明DBA角色的权限非常大了,因此不要轻易将DBA角色授权给管理员以外的用户。
可以通过DBA_ROLE_PRIVS视图来查询
SQL> create user t1 account unlock identified by t1;
User created.
SQL> create user t2 account unlock identified by t2;
User created.
SQL> grant connect,resource to t2;
Grant succeeded.
SQL> grant dba to t1;
Grant succeeded.
下面,通过简单的实例说明权限控制:
T1用户拥有DBA角色,T2用户只有最基本的角色,现将实现T2用户对T1的所有表只读权限:
SQL> connect t1/t1
Connected.
SQL> create table t1(id number);
Table created.
SQL> grant SELECT ANY table to t2;
Grant succeeded.
SQL> connect t2/t2
Connected.
SQL> select * from t1.t1;
no rows selected
SQL> drop table t1.t1;
drop table t1.t1
*
ERROR at line 1:
ORA-01031: insufficient privileges
SQL> delete from t1.t1;
delete from t1.t1
*
ERROR at line 1:
ORA-01031: insufficient privileges
如果你的其他想实现的权限,可以通过DBA_SYS_PRIVS.PRIVILEGE字段来对应授权。
因此,如果你担心生产用户的表或存储过程或序列号等被其他用户恶意修改,你可以创建一个单独的查询用户,将生产用户的表、存储过程、序列号的只读权限赋予它,而后都通过查询用户来查询。这样就大大降低了生产的风险。
-------------------------------------------------------------------------------------------------
本文来自于我的技术博客 http://blog.csdn.net/robo23
转载请标注源文链接,否则追究法律责任!