权限
权限
1 控制用户存取
访问数据库里的数据,要经过oracle用户名和密码的验证,通过验证后才能登陆到数据库对数据进行访问
sqlplus scott/tiger 使用用户名/密码验证
sqlplus / as sysdba是操作系统认证方式,操作系统中oracle用户属于dba组,有权限对数据库进行管理
外部认证:把用户名和口令存储在目录服务器上
2 创建用户
DBA使用create user语句创建用户:
语法:create user user_name identified by user_password;
create user venom identified by venom666;
2.1 修改用户密码
DBA可以创建用户和修改密码
用户可以自己使用alter user语句来修改密码
语法:alter user user_name identified by user_password;
【修改密码方法一】:
alter user venom identified by oracle;
【修改密码方法二】:
sqlplus / as sysdba password venom;
2.2 解锁用户
为用户解锁:
用户:alter user user_name account unlock;
为用户设置密码并解锁:
语法:alter user user_name identified by user_password account unlock;
2.3 使用新用户登录
conn venom/oracle
缺少创建会话的权限(create session)
3 权限
系统权限:能够在数据库中做什么操作(如创建表)
对象权限:能够对指定的对象做什么操作(如对表的DML操作权限)
【模式定义】:
schema:某个用户下所有对象的集合。模式与用户一一对应
【例子】:select * from scott.emp;
【例子说明】访问scott模式下emp这个对象
4 系统权限
create table:在自己的方案中创建表
create any table:跨方案创建表
8i 80+, 9i 100+, 10g 11g 200+
权限分布细化,提高安全性
【sysdba与dba关系】
sysdba是系统权限,权限最大,用sys用户登录时,要使用as sysdba
dba是角色
角色:权限的集合
4.1 用户的系统权限
5 角色
dba是角色 sysdba是系统权限
【角色目的】oracle可以用角色来简化权限的管理
【授予流程】创建角色 -> 把所需的权限给角色 -> 把角色给用户
5.1 创建角色并给角色授权
5.2 默认角色connect/resource
CONNECT、RESOURCE是系统默认角色
查看CONNECT、RESOURCE角色包含的权限:
select * from role_sys_privs where role in ('CONNECT','RESOURCE');
【分配权限原则】:给用户分配能够完成任务的最低标准权限
例子eg:授予venom用户CONNECT、RESOURCE默认角色,并测试创建表:
grant connect,resource to venom; grant unlimited tablespace to venom;
ORACLE 12C之后的版本中需要授予空间占有权限,才可以创建表:11G之前的版本不用单独授此权限
6 对象权限
index权限:在表上创建索引的权限
references权限:参考一个对象的权限
6.1 授予对象权限
- 不同的对象具有不同的对象权限
- 对象的拥有者拥有所有权限
- 对象的拥有者可以向外分配权限
grant select on emp to venom;
select * from scott.emp;
【说明】
对象权限可以精确到列(insert/update)
grant update (dname,loc) on dept to venom;
6.2 with grant option和public
with grant option:这个用户还可以把授权给他的权限给其他用户
【例如】A把权限授予B,B还可以把这个权限授予其他用户C
grant select,insert on dept to venom with grant option;
这个例子中Damon用户可以把相关权限,再授予给其他用户
grant select on scott.dept to hr;
【PUBLIC 角色】:
数据库中任何一个用户都默认拥有public角色,授予给public权限(grant ... to public),会使所有用户拥有这个权限。
7 权限相关数据字典视图
select * from session_privs; select * from session_roles; select * from role_sys_privs; select * from user_sys_privs; select * from user_tab_privs_recd; select * from user_col_privs_recd;
col owner for a10 col table_name for a10 col privilege for a10 col grantor for a10 select * from user_tab_privs_recd;
8 收回权限
- 使用revoke语句撤销权限
- 使用with grant option子句所分配的权限同样被收回
cascade constraints:收回外键约束权限时,先把外键约束删掉
A -> B -> C -> D
对象权限:with grant option
对象权限的回收是级联:A收回B的权限,CD权限也被收回
回收原则谁授予谁回收:A不能直接回收 C 的权限
scott -> damon -> hr
A -> B -> C -> D
系统权限:with admin option
系统权限的回收不是级联的:A 收回B的权限,CD 权限还在
回收原则:只要被授权时有with admin option,就可以回收这个权限
9 总结
系统权限和对象权限语法格式不同,不能混合使用
系统权限和角色语法相同,可以合并授予
一条语句可以给多个用户授权
可以通过授权语句来创建用户
【知识扩展:如何阅读官方脚本中的授权语句】
查看创建scott用户方案的脚本,里面有一些授权的例子可以参考:
more $ORACLE_HOME/rdbms/admin/utlsampl.sql
10 补充扩展:select any table
1)使用demo用户查询scott.dept,没有权限
select * from scott.dept;
2)使用sys用户把select any table权限赋予给demo
grant select any table to demo;
3)demo用户再次查询,可以查看scott.dept
select * from scott.dept;
问:普通用户如何查询数据字典视图
答:给用户赋予权限select any dictionary
1)demo用户查询dba_数据字典(视图),如dba_users,无法查询
select username,account_status from dba_users where USERNAME='DEMO';
2)给用户赋予权限select any dictionary
grant select any dictionary to demo;
3)demo用户再次查询,可以查看dba_users
select username,account_status from dba_users where USERNAME='DEMO';
11 补充扩展:设置用户密码永不过期
*查看用户的profile(一般是default)
col USERNAME for a20 col PROFILE for a20 select username,profile from dba_users;
*查看default概要文件设置的密码有效期(默认180天)
col LIMIT for a20
col RESOURCE_NAME for a30 select * from dba_profiles where resource_name ='PASSWORD_LIFE_TIME' and profile='DEFAULT';
*将密码有效期设置为无限制
alter profile default limit password_life_time unlimited; select * from dba_profiles where resource_name ='PASSWORD_LIFE_TIME' and profile='DEFAULT';
12 扩展:查看执行计划set autotrace
plustrace是一个角色,public也是一个角色
set autotrace on/off/traceonly
例子eg:简单使用
1)sys用户:创建plustrace角色
@?/sqlplus/admin/plustrce.sql
2)将角色赋给scott
grant plustrace to scott;
2)或者将角色赋给public,这样所有用户都可set autotrace
grant plustrace to public; conn scott/tiger show autotrace
3)查看执行结果和执行计划
set autotrace on select * from dept where deptno=10;
4)只查看执行计划
set autotrace traceonly select * from dept where deptno=10;
5)关闭自动跟踪
set autotrace off show autotrace