常用的系统权限有:
create session:连接数据库
create table:建表
create view:建视图
create procedure:建过程、函数、包
create trigger:建触发器
create cluster:建簇
create public synonym:建同义词
2)显示系统权限
Oracle提供160多种系统权限,而且Oracle版本越高,提供的系统权限越多。可以通过查询数据字典视图system_privilege_map显示所有系统权限。
select * from system_privilege_map order by name;
3)授予系统权限
一般情况下,授予系统权限是由dba完成的,如果其他用户来授予系统权限,则要求该用户必须具有grant any privilege的系统权限。
在授予权限时,可以带有with admin option选项,这样,被授予权限的用户或角色还可以将该系统权限授予其他用户或是角色。
例如:
a)创建2个用户,ken、tom,初始阶段他们没有任何权限,如果登录就会报出错信息。
create user ken identified by ken;
create user tom identified by tom;
b)给用户ken授权
①grant create session,create table to ken with admin option;
②grant create view to ken;
c)用ken给用户tom授权
grant create session,create table to tom with admin option;
grant create view to tom;
4)回收系统权限
一般情况下,回收系统权限是由dba完成的,如果其他用户来回收系统权限,
要求该用户必须具有相应的系统权限及转授权系统权限的选项(with admin option),回收系统权限用revoke命令完成。
当回收系统权限后,用户就不能执行相应的操作了,但是请注意,系统权限级联回收问题?
sys---------------------à ken ---------------------------àtom
(create session) (create session) (create sessioin)
用system执行如下操作:revoke create session from ken;
请思考,tom还能登陆吗?
----------能,系统权限不是级联回收。
----------------------------------------
1)对象权限介绍
对象权限指访问其他方案对象的权力,用户可以直接访问自己方案的对象,当时如果要访问别的方案的对象,则必须要具有对象权限。
比如smith用户要访问scott.emp表(scott方案,emp表)
则必须在emp表上具有对象的权限。
常用的对象权限有:
alter:修改
delete:删除
select:查询
insert:添加
update:修改
index:索引
reference:引用
execute:执行
2)显示对象权限
通过数据字典视图dba_tab_privs可以显示用户或是角色具有的对象权限。
conn system/manager as sysdba;
select distinct privilege from dba_tab_privs;
select grantor,owner,table_name,privilege from dba_tab_privs where grantee='INDEX';
3)授予对象权限
在oracle9i之前,授予对象权限是由对象的所有者来完成的,如果其他用户来操作,则需要用户具有相应的(with grant option)权限,
从oracle9i开始,dba用户(sys,system)可以将任何对象上的对象授予其他用户。授予对象权限是用grant命令 完成的。
对象权限可以授予用户、角色和public。在授予权限时,如果带有with grant option选项,则可以将该权限转授予给其他用户。
当时要注意,with grant option选项不能授予给角色。
例如:
a)monkey用户要操作scott.emp表,则必须授予相应的对象权限
①希望monkey可以查询scott.emp表数据,怎样操作?
grant select on emp to monkey;
②希望monkey可以修改scott.emp表数据,怎样操作?
grant update on emp to monkey;
③希望monkey可以删除scott.emp表数据,怎样操作?
grant delete on emp to monkey;
④有没有更加简单的办法,一次性把所有权限赋给monkey?
grant all on emp to monkey;
4)授予alter权限
如果black用户要修改scott.emp表结构,则必须授予alter对象权限。
sql>conn scott/triger;
sql>grant alter on emp to black;
当然也可以用sys,system来完成这件事儿。
5)授予execute权限
如果用户想要执行其他方案的过程、函数、包,则必须具有execute权限。
比如为了让ken可以执行包dbms_transaction,可以授予execute权限。
sql>conn system/manager;
sql>grant execute on proc_helloworld to ken;
6)授予index权限
如果想在别的方案的表上建立索引,则必须具有index对象权限。
如:为了让black可以在scott.emp表上建立索引,就给其授予index的对象权限。
sql>conn scott/triger;
sql>grant index on emp to ken;
7)系统使用with admin option选项,对象权限使用with grant option
该选项用于转授对象权限,当时该选项只能被授予用户,不能被授予角色。
sql>conn scott/triger;
sql>grant select on emp to black with admin option;
sql>conn black/m123;
sql>grant select on scott.emp to jones;-- 转授
8)收回对象权限
在oracle9i之后,收回对象权限可以由对象的所有者来完成,也可以由dba用户(sys、system)来完成。
说明:收回对象权限以后,用户就不能执行相应的sql命令,但是要注意,对象权限是否会被级联回收?
如:
scott -------------------------à black ------------------àjones
(select on emp) (select on emp) (select on emp)
sql>conn scott/triger;
sql>revoke select on emp from black;
请思考:jones还能查询scott.emp表的数据吗?
----------不能了,对象权限是级联删除的。
-----------------------------------------------------------------------
SQL> create tablespace tbs_icbc datafile '/oracle/app/oradata/ecom/tbs_icbc.dbf' size 10M;
查看库下用户
select * from all_users;
查看当前登录用户信息
select * from user_users;
创建用户
SQL> create user icbc identified by icbc default tablespace tbs_icbc; 【alter user icbc quota unlimited on tbs_icbc;(不限制空间)】
SQL> conn icbc/icbc(不能登陆,没有创建会话权限)
ERROR:
ORA-01045: user ICBC lacks CREATE SESSION privilege; logon denied
SQL> grant create session to icbc;(sys用户登陆下)[系统权限]
SQL> conn icbc/icbc(可以正常登陆)
SQL> show user
USER is "ICBC"
查看用户默认表空间
select default_tablespace from dba_users where username='ICBC';(sys用户登陆下)
修改用户默认表空间
SQL> alter user icbc default tablespace system;(sys用户登陆下)
1.
SQL> create table tt(id int);(报错 没有创建表的权限)
create table tt(id int)
*
ERROR at line 1:
ORA-01031: insufficient privileges
2.
SQL> grant create table to icbc;(sys用户登陆下)
3.
SQL> create table tt(id int);(在表空间上权限不足,没有给用户空间配额)
4.SQL> alter user icbc quota 1M on tbs_icbc;(赋予用户空间配额,sys用户下)
或
SQL> alter user icbc quota unlimited on tbs_icbc;(不限制空间)
5.SQL> create table tt(id int) tablespace tbs_icbc; 可以创建
SQL> conn scott/lipengfei
SQL> grant select on scott.emp to icbc;(scott用户下)
(赋予icbc用户读 scott用户emp权限)
conn icbc/icbc
SQL> create table t_big tablespace tbs_icbc as select * from scott.emp;(icbc用户下)[对象权限]
SQL> insert into t_big select * from t_big;
SQL> / (多次执行一直到超出配额限制)
SQL> select count(*) from t_big;
COUNT(*)
----------
114688
删除icbc 并把用户下所有对象
SQL> drop user icbc cascade;
-------------------------------
角色:角色是一组权限的集合,将角色赋给一个用户,这个用户就拥有了这个角色中的所有权限。
oracle一共提供了33种预定义角色:
select * from dba_roles;
在Oracle中,权限太多一一分配会很累,所以提出一种内置多种基本权限的集合,称为角色;
1.预定义角色
CONNECT, RESOURCE, DBA
DBA: 拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构。
RESOURCE(资源):拥有Resource权限的用户只可以创建实体,不可以创建数据库结构。
CONNECT:拥有Connect权限的用户只可以登录Oracle,
SQL> grant dba to scott;
SQL> revoke dba from scott;(回收角色)
查询用户拥有哪里权限
select * from dba_role_privs;(查看哪个用户创建的角色)
select * from dba_sys_privs; (查看用户权限)
select * from role_sys_privs;(查看角色中的权限)
select privilege from role_sys_privs where role='RESOURCE';(查看指定角色包括的权限)
select privilege from role_sys_privs where role='CONNECT';
2.对象权限
select, update, insert, alter, index, delete, all
3.自建立角色
SQL> create role role1;
给角色赋权限(创建表和创建储存过程)
SQL> grant create any table,create procedure to role1;
create role emp_all;
grant select,delete,update,insert on scott.emp to emp_all;
把角色 赋予用户
SQL> grant role1 to scott;
删除角色
SQL> drop role role1;
-------------------------------------------------------
验证模式:
1.系统认证
2.密码文件认证
[oracle@oracle1 admin]$ vi $ORACLE_HOME/network/admin/sqlnet.ora
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
此时本地sys用户的认证方式为系统认证,即可以 sqlplus / as sysdba 方式登录
如果在sqlnet.ora 中额外添加:
SQLNET.AUTHENTICATION_SERVICES= (NTS) 或 SQLNET.AUTHENTICATION_SERVICES= (NONE)
NTS:为windows专用 linux用 NONE
把SQLNET.AUTHENTICATION_SERVICES= (NONE) 添加到NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)上面
再次登陆时 sys需要密码
------------------------------------------
profile 里参数
LOGICAL_READS_PER_CALL:指定一次执行SQL(解析、执行和提取)调用所允许读的数据块的最大数目。
CONNECT_TIME:指定会话的总的连接时间。(单位:分钟)
PRIVATE_SGA:指定一个会话可以在共享池(SGA)中所允许分配的最大空间(单位:字节)
注:该限制只在使用共享服务器结构时才有效,会话在SGA中的私有空间包括私有的SQL和PL/SQL,但不包括共享的SQL和PL/SQL
PASSWORD_LIFE_TIME:指定同一密码所允许使用的天数。
password_reuse_time指定了密码不能重用前的天数
password_reuse_max则指定了当前密码被重用之前密码改变的次数
用户会话限制
1.创建配置文件 限制用户3个会话
SQL> create profile PRO_TEST limit sessions_per_user 3;
2.
SQL> alter user SCOTT profile PRO_TEST;(给scott用户应用)
3.
SQL> show parameter limit(限制默认为关闭状态)
SQL> alter system set resource_limit=true; 打开限制
SQL> show parameter limit
4.[oracle@sq ~]$ sqlplus scott/lipengfei (操作三次)
5.第四次
SQL> conn scott/abc
ERROR:
ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit
SQL> drop profile PRO_TEST cascade;(已分配的profile,删除时必须加cascade选项,DEFAULT为默认profile,不能删除)
alter system kill session 'sid,serial#';
--查看当前用户的sid(此方式适用于sys用户)
SQL> select sid from v$mystat where rownum=1;
SID
----------
20