用户、权限、角色(2)- 权限管理

###我所使用的系统为Linux AS 4U6数据库版本为10.2.0.1.0###
权限:分为两种
1. 系统权限
2. 对象权限
系统权限:对对象、表空间、用户、数据库本身等的管理权限 - 权限有创建,更改,删除等。
所有的系统权限都放在system_privilege_map数据字典里。
下面看下里面的数量

               
            
SQL> select count(*) from system_privilege_map;  
  COUNT(*)
----------
       166
SQL> 
这里有166个
里面的权限及每个代表的意义,
 
  
简单看一下几个权限
SQL> select name from system_privilege_map where name like 'CREATE%' order by 1; 
NAME
----------------------------------------
CREATE ANY CLUSTER
CREATE ANY CONTEXT
CREATE ANY DIMENSION
CREATE ANY DIRECTORY
CREATE ANY EVALUATION CONTEXT
CREATE ANY INDEX
CREATE ANY INDEXTYPE
CREATE ANY JOB
CREATE ANY LIBRARY
CREATE ANY MATERIALIZED VIEW
CREATE ANY OPERATOR
CREATE ANY OUTLINE
CREATE ANY PROCEDURE
CREATE ANY RULE
CREATE ANY RULE SET
CREATE ANY SEQUENCE
CREATE ANY SQL PROFILE
CREATE ANY SYNONYM
CREATE ANY TABLE
CREATE ANY TRIGGER
CREATE ANY TYPE
CREATE ANY VIEW
CREATE CLUSTER
CREATE DATABASE LINK
CREATE DIMENSION
CREATE EVALUATION CONTEXT
CREATE EXTERNAL JOB
CREATE INDEXTYPE
CREATE JOB
CREATE LIBRARY
CREATE MATERIALIZED VIEW
CREATE OPERATOR
CREATE PROCEDURE
CREATE PROFILE
CREATE PUBLIC DATABASE LINK
CREATE PUBLIC SYNONYM
CREATE ROLE
CREATE ROLLBACK SEGMENT
CREATE RULE
CREATE RULE SET
CREATE SEQUENCE
CREATE SESSION
CREATE SYNONYM
CREATE TABLE
CREATE TABLESPACE
CREATE TRIGGER
CREATE TYPE
CREATE USER
CREATE VIEW
49 rows selected.
SQL> 
         
        
这里,关于CREATE有关的系统权限有49个,其中,前面加ANY的是表示对任何一个SCHEMA可以进行后面的操作。
没有ANY的,只能对其所在的SCHEMA进行操作
- scott要是只有CREATE TABLE权限,只能在scott这个SCHEMA下创建表,要是有CREATE ANY TABLE权限,就可以在任何SCHEMA下创建表。
研究一下几个重要的系统权限:
1. sysdba和sysopen:
非常重要的两个权限。相当于类UNIX系统里的root级别。权限非常大。
由于其权限太大,所以平常操作避免使用sysdba权限(sys用户)。
2. restricted session
这个权限是以restricted模式打开数据库,进行数据库维护性工作用的。
默认只有sys用户拥有该权限。
3. create session
最基本的权限。有了这个权限之后才能登录数据库。可以使用connect这个角色来代替
--关于其他各种权限,请参考官方文档中的SQL REFERENCE中的18章中GRANT小节。
4. create table权限和create any table权限。
create table权限是指能在自己的schema上创建表。create any table权限是可以在任何一个schema上创建表。
下面做一下简单的实验。
 
  
SQL> create user grant_user1 identified by test1234;
User created.
SQL> create user grant_user2 identified by test1234;
User created.
SQL> create user grant_user3 identified by test1234;
User created. -- 创建了三个用户
SQL> grant connect to grant_user1,grant_user2; --给两个用户1,2登录权限
Grant succeeded.
SQL> grant create table to grant_user1; --给用户1创建表的权限
Grant succeeded.
SQL> conn grant_user3/test1234 --因为没有给用户3登录权限,所以登录不了
ERROR:
ORA-01045: user GRANT_USER3 lacks CREATE SESSION privilege; logon denied
Warning: You are no longer connected to ORACLE.
SQL> conn grant_user2/test1234;
Connected.
SQL> create table table1 (id int); --因为没有给创建表的权限,不能创建表
create table table1 (id int)
*
ERROR at line 1:
ORA-01031: insufficient privileges
SQL> conn grant_user1/test1234
Connected.
SQL> create table table1 (id int); --虽然有创建表的权限,但没有权限使用USERS表空间
create table table1 (id int)
*
ERROR at line 1:
ORA-01950: no privileges on tablespace 'USERS'
SQL> conn / as sysdba
Connected.
SQL> grant unlimited tablespace to grant_user1; --赋予所有表空间的无限使用权限
Grant succeeded.
SQL> conn grant_user1/test1234
Connected.
SQL> create table table1 (id int); --可以正常创建表。
Table created.
SQL> 
 
  
 
从上面可以知道给某个用户权限时使用grant命令。
可以指定grant create any table to xxx来赋予对任何schema创建表的权限。
 
  
SQL> show user
USER is "GRANT_USER1"
SQL> create table grant_user2.table1 (id int); --现在的权限不够
create table grant_user2.table1 (id int)
*
ERROR at line 1:
ORA-01031: insufficient privileges
SQL> conn / as sysdba
Connected.
            
SQL> grant create any table to grant_user1; --赋予任意创建表权限
Grant succeeded.
SQL> conn grant_user1/test1234
Connected.
SQL> create table grant_user2.table1 (id int); --发现没有表空间使用权限
create table grant_user2.table1 (id int)
*
ERROR at line 1:
ORA-01950: no privileges on tablespace 'USERS'
SQL> conn / as sysdba
Connected.
SQL> grant unlimited tablespace to grant_user2; --赋予用户2表空间使用权限
Grant succeeded.
SQL> conn grant_user1/test1234;
Connected.
SQL> create table grant_user2.table1 (id int); --创建表成功
Table created.
SQL> 
-- 在上面发现,在schema - grant_user2上创建表的时候,grant_user2得有使用表空间的权限。要注意。
-- grant命令的格式,请看 "grant revoke格式"
介绍下给予表空间的使用权限。在上面,给用户1赋予了对所有表空间的无限使用权限。
-- 在上面可以看到提示是说对USERS表空间说是没有使用权限。
-- 因为没有特定指定的话,默认表空间就是USERS。
-- 关于这个,请查看"用户管理-用户创建"
也可用quota指定特定
SQL> alter user grant_user3 quota 100M on USERS;
User altered.
SQL> alter user grant_user3 quota UNLIMITED on USERS;
User altered.
这样可以对特定的用户对特定的表空间赋予使用权限。(可以是特定大小,也可是无限的 -1表示无限)
 
  
SQL> select username,tablespace_name,max_bytes from dba_ts_quotas;
USERNAME                       TABLESPACE_NAME                 MAX_BYTES
------------------------------ ------------------------------ ----------
DMSYS                          SYSAUX                          209715200
GRANT_USER3                    USERS                           104857600
SYSMAN                         SYSAUX                                 -1
OLAPSYS                        SYSAUX                                 -1
SQL> 
关于权限,还有一个比较特殊的,就是关于系统表空间。数据字典属于sys用户的表,但正常情况下是不能被访问。
这个与下面的参数有关 O7_DICTIONARY_ACCESSIBILITY (注意,第一个是字母O,不是数字0)
 
  
SQL> show parameter o7
NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
O7_DICTIONARY_ACCESSIBILITY	     boolean	 FALSE
SQL> 
 
            
这个参数决定了普通用户是否可以操作用户sys的所有对象。(存在SPFILE里面) 
建议设置为FALSE,因为别人可以随便操纵数据字典是很危险的事情。

            对象权限 

              所谓的对象权限就是你能操纵某个用户(或者说是SCHEMA)的对象。 
 
  
对象 试图 序列 存储过程,
方法,包*1
实体化
视图
数据
字典
用户定义
类型
操作 索引
类型
ALTER

DELETE

EXECUTE

DEBUG

FLASHBACK

INDEX

INSERT

ON COMMIT
REFRESH

QUERY REWFITE

READ

REFERENCES

SELECT

UNDER

UPDATE

WRITE

上面的表为能对每个对象能操作的命令.
--关于每个操作是做什么用,具体请参考"grant revoke格式"
与系统权限不同,对自己SCHEMA的对象权限是不需要赋予的.
下面有一个小实验.
 
  
SQL> create user user1 identified by test1234; --创建两个用户
User created.
SQL> create user user2 identified by test1234;
User created.
SQL> grant resource,connect to user1; --给两个用户登录和创建表的权限.
Grant succeeded.
SQL> grant resource,connect to user2; --在这个实验里没怎么用到user2的resource权限.
Grant succeeded.
SQL> grant unlimited tablespace to user1; --给予user1空间的使用权限。
Grant succeeded.
SQL> conn user1/test1234;
Connected.
SQL> create table table1 (id int); --使用user1创建表
Table created.
SQL> insert into table1 values (1); --查处两行数据
1 row created.
SQL> insert into table1 values (2);
1 row created.
SQL> select * from table1;--可以正常显示
ID
----------
1
2
SQL> conn user2/test1234;--换用户就不可以了。
Connected.
SQL> select * from user1.table1;
select * from user1.table1
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> conn user1/test1234;
Connected.
SQL>grant all on table1 to user2; --给予权限
Grant succeeded.
SQL> conn user2/test1234;
Connected.
SQL> select * from user1.table1; --可以访问
ID
----------
1
2
SQL> insert into user1.table1 values (3);--也可以插入数据
1 row created.
SQL> 
可以看出对象权限是一个用户把自己的对象操纵权限给予别的对象的。(当然sys用户是可以把任何用户的权限赋予任何用户)

上面讲到简单的权限有关的内容。下面讲一下关于权限传递。
无论是系统权限还是对象权限,赋予其他用户权限的同时,还可以把权限的管理权限一同赋予其用户
-- 例:sys用户把CREATE TABLE权限赋予user01的同时,把GRANT CREATE TABLE的权限赋予别人。
 
  
 

                      SQL> create user user01 identified by test1234; --创建两个用户
                    
 
User created.
SQL> create user user02 identified by test1234;
User created.
SQL> grant connect to user01,user02 --给两个用户登录权限
2 ;
Grant succeeded.
SQL> grant unlimited tablespace to user01,user02; --给两个用户使用表空间的权限
Grant succeeded.
SQL> grant create table to user01 with admin option; --给user01创建表的权限,也把赋予别人的权限一同赋予
Grant succeeded.
SQL> conn user01/test1234;
Connected.
SQL> create table table1 (id int);
Table created.
SQL> grant create table to user02; --把创建表的权限赋予user02
Grant succeeded.
SQL> conn user02/test1234; 
Connected.
SQL> create table table1 (id int);
--user02可以创建表
Table created.
SQL> conn / as sysdba;
Connected.
SQL> revoke create table from user01;
--收回user01的权限
Revoke succeeded.
SQL> conn user02/test1234;
Connected.
SQL> create table table2 (id int);
--user02的权限依然在
Table created.
SQL> 
在这里看到,关于系统权限的连带赋予,收回权限时,不会连带收回。
下面看一下对象权限。
 
  
SQL> create user user1 identified by test1234;--创建三个用户
User created.
SQL> create user user2 identified by test1234;
User created.
SQL> create user user3 identified by test1234;
User created.
SQL> grant connect to user1,user2,user3;--赋予登录权限
Grant succeeded.
SQL> grant unlimited tablespace to user1;--赋予user1使用表空间的权限
Grant succeeded.
SQL> grant resource to user1;--赋予user1创建表等权限
Grant succeeded.
SQL> conn user1/test1234;
Connected.
SQL> create table table1 (id int);--创建表,添加一些数据
Table created.
SQL> insert into table1 values (1);
1 row created.
SQL> insert into table1 values (2);
1 row created.
SQL> grant all on table1 to user2 with grant option;--赋予user2所有权限,包括可以赋予别人的权限。
Grant succeeded.
SQL> conn user2/test1234;
Connected.
SQL> select * from user1.table1;
ID
----------
1
2
SQL> insert into user1.table1 values(3);
1 row created.
SQL> select * from user1.table1;
ID
----------
1
2
3
SQL> grant all on user1.table1 to user3;--user2可以把权限赋予user3
Grant succeeded.
SQL> conn user3/test1234;
Connected.
SQL> select * from user1.table1;--user3也有权限。
ID
----------
1
2
3
SQL> conn user1/test1234;
Connected.
SQL> revoke all on table1 from user2;--收回user2的权限
Revoke succeeded.
SQL> conn user3/test1234;
Connected.
SQL> select * from user1.table1;--user3的权限也会连带收回
select * from user1.table1
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> 
在这里看到,对象权限是连带删除的。user1给了user2权限,user2给了user3权限,当user1收回user2的权限时,user2赋予user3的相应(被收回)的权限会连带收回。这个是与系统权限不同的地方。
上面某些地方,用到了一些角色(connect,resource等。这些代替了权限。)关于角色(role),请看"用户管理-role"。
 

你可能感兴趣的:(oracle,权限,职场,休闲,privilege)