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指定特定这样可以对特定的用户对特定的表空间赋予使用权限。(可以是特定大小,也可是无限的 -1表示无限)
SQL> alter user grant_user3 quota 100M on USERS; User altered. SQL> alter user grant_user3 quota UNLIMITED on USERS; User altered.
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"。