OCP认证考试指南(7):管理数据库用户(2)

1、系统权限

Oracle 10G中常见的系统权限

权限 说明
CREATE SESSION 允许被授权者连接数据库实例。
CREATE TABLE 允许被授权者在自己的模式中创建表。
CREATE VIEW 允许被授权者在自己的模式中创建视图。
CREATE SYNONYM 允许被授权者在自己的模式中创建私有的同义词。
CREATE PUBLIC SYSNONYM 允许被授权者在SYS模式中创建同义词,数据库中所有用户都能使用这个同义词(公有同义词)。
CREATE PROCEDURE 允许被授权者在自己的模式中创建存储过程或函数。
CREATE SEQUENCE 允许被授权者在自己的模式中创建序列。
CREATE TRIGGER 允许被授权者在自己的模式中创建触发器。
CREATE USER 允许被授权者在数据库内创建另一个用户,并且在创建用户时指定口令与其他设置。
ALTER USER 允许被授权者能够修改数据库中另一个用户的用户信息,包括更改该用户的口令。
DROP ANY TABLE 允许被授权者删除数据库内任何模式中的任何表。
ALTER ANY TABLE 允许被授权者更改数据库内任何模式中的任何表。
BACKUP ANY TABLE 允许被授权者使用Export实用程序生成数据库内任何表的一个副本。
SELECT ANY TABLE 无论是否显式地授予被授权者对数据库内的任何表执行SELECT语句的权限,都允许被授权者执行上述行为。
INSERT ANY TABLE 无论是否显式地授予被授权者对数据库内的任何表执行INSERT语句的权限,都允许被授权者执行上述行为。
UPDATE ANY TABLE 无论是否显式地授予被授权者对数据库内的任何表执行UPDATE语句的权限,都允许被授权者执行上述行为。
DELETE ANY TABLE 无论是否显式地授予被授权者对数据库内的任何表执行DELETE语句的权限,都允许被授权者执行上述行为。

1.1、授予系统权限

指派系统权限的语法如下:

?[Copy to clipboard] View Code SQL
GRANT privilege [, privilege, ...]
TO username [, username, ...]
[WITH ADMIN OPTION];

可以看到,可以同时为多个用户授予多个权限,并且,被授予的权限是用户来说是立刻可以使用的。再来复习一次原来所学的吧,呵呵。

?[Copy to clipboard] View Code SQL
SQL> create user dandan identified by dandan1982
  2  default tablespace mydemo
  3  temporary tablespace mydemotemp
  4  quota 10M on mydemo;
 
User created.
 
SQL> grant create session, create table
  2  to dandan;
 
Grant succeeded.
 
SQL> conn dandan/dandan1982
Connected.
 
SQL> create table test (
  2  tid int,
  3  tname varchar2(20));
 
Table created.

1.2、WITH ADMIN OPTION权限

一个用户被授予某个系统权限时,授权者也可以选择允许被授权者将相同的权限授予其他用户。如果希望进行这样的操作,那么授权者可以使用WITH ADMIN OPTION授予权限。

1.3、取消系统权限

取消系统权限的REVOKE命令与授予系统权限的命令具有类似的语法:

?[Copy to clipboard] View Code SQL
REVOKE privilege [, privilege, ...]
TO username [, username, ...];

注意:使用WITH ADMIN OPTION为某个用户授予权限,如果这个用户为其他用户授予相同的权限,无法取消授予这些用户的该权限,也可以说是不会级联取消。

1.4、确定被授予的系统权限

我们可以通过查询DBA_SYS_PRIVS和USER_SYS_PRIVS数据字典视图来了解被授予的系统权限。

?[Copy to clipboard] View Code SQL
SQL> conn / as sysdba
Connected.
SQL> select * from dba_sys_privs
  2  where grantee = 'DANDAN';
 
SQL> conn dandan/dandan1982
Connected.
SQL> select * from user_sys_privs;

2、对象权限

2.1、授予对象权限

授予对象权限的语法:

?[Copy to clipboard] View Code SQL
GRANT privilege [, privilege, ...] | ALL [(column[, column, ...])]
ON objectname
TO user | role | PUBLIC
[WITH ADMIN OPTION];

对象权限由对象的拥有者授予。

对象权限及其授予对象

对象权限 授予对象
SELECT TABLE、VIEW、SEQUENCE
INSERT TABLE、VIEW
UPDATE TABLE、VIEW
DELETE TABLE、VIEW
ALTER TABLE、VIEW
INDEX TABLE
REFERENCES TABLE
EXECUTE PROCEDURE、FUNCTION、PACKAGE

2.2、WITH ADMIN OPTION权限

与授予系统权限所使用的WITH ADMIN OPTION相似,如果使用WITH GRANT OPTION授予对象权限,那么就允许被授予这个权限的用户向其他用户授予该权限。

2.3、取消对象权限

取消对象权限的语法与授予对象权限的语法相似:

?[Copy to clipboard] View Code SQL
REVOKE privilege [, privilege, ...] | ALL [(column[, column, ...])]
ON objectname
TO user | role | PUBLIC
[WITH ADMIN OPTION];

注意:如果取消某个用户的对象权限,那么对于这个用户使用WITH ADMIN OPTION授予权限的用户来说,同样还会取消这些用户的相同权限,也就是说取消授权是级联的。

2.4、确定被授予孤对象权限

通过查询数据字典能够确定为某个用户授予的对象权限或被这个用户授予的权限:

  • USER_TAB_PRIVS_MADE视图:某个用户授予其他用户在该用户模式对象上的对象权限。
  • USER_TAB_PRIVS_RECD视图:为某个用户授予的,在其他模式对象上的权限。
  • ALL_TAB_PRIVS_MADE视图:某个用户授予其他用户在该用户模式对象与其他模式对象上的对象权限。
  • ALL_TAB_PRIVS_RECD视图:为某个用户授予的,在该用户模式对象与其他模式对象上的权限。
  • USER_COL_PRIVS_MADE视图:某个用户授予其他用户在其模式中表上的列权限。
  • USER_COL_PRIVS_RECD视图:为某个用户授予的,在其他模式中表上的列权限。
  • ALL_COL_PRIVS_MADE视图:某个用户授予其他用户在该用户模式中表上与在其他模式中表上的列权限。
  • ALL_COL_PRIVS_MADE视图:为某个用户授予的,在该用户模式中表上与在其他模式中表上的列权限。

在这里,把上面的所有理论都练习一下,也验证一下这些理论的真伪。

?[Copy to clipboard] View Code SQL
#################################################
# 连接打开数据库,准备进行操作
#################################################
$ sqlplus / as sysdba
 
SQL*Plus: Release 10.2.0.1.0 - Production on Tue Sep 23 22:00:37 2008
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
Connected to an idle instance.
 
SQL> startup
ORACLE instance started.
 
Total System Global Area  264241152 bytes
Fixed Size                  1218868 bytes
Variable Size              71304908 bytes
Database Buffers          188743680 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.
 
#################################################
# 创建3个表空间
#################################################
 
SQL> create tablespace ats
  2  datafile '/ora02/oradata/ocp/ats.dbf' size 5M;
 
Tablespace created.
 
SQL> create tablespace bts
  2  datafile '/ora02/oradata/ocp/bts.dbf' size 5M;
 
Tablespace created.
 
SQL> create tablespace cts
  2  datafile '/ora02/oradata/ocp/cts.dbf' size 5M;
 
Tablespace created.
 
#################################################
# 创建3个用户
#################################################
 
SQL> create user a identified by a123
  2  default tablespace ats
  3  profile default;
 
User created.
 
SQL> create user b identified by b123
  2  default tablespace bts
  3  quota 5M on bts
  4  profile default;
 
User created.
 
SQL> create user c identified by c123
  2  default tablespace cts
  3  quota 5M on cts
  4  profile default;
 
User created.
 
#################################################
# 给c用户授权,给a用户授权并加上WITH ADMIN OPTION
#################################################
 
SQL> grant create session,create table to c;
 
Grant succeeded.
 
SQL> grant create session, create table to a
  2  with admin option;
 
Grant succeeded.
 
#################################################
# 分别连接a用户和c用户,可以发现,加了WITH ADMIN OPTION的效果不一样
#################################################
 
SQL> conn c/c123
Connected.
SQL> grant create session to b;
grant create session
*
ERROR at line 1:
ORA-01031: insufficient privileges
 
SQL> conn a/a123
Connected.
SQL> grant create session to b;
 
Grant succeeded.
 
#################################################
# 我自己做个测试,给b用户WITH ADMIN OPTION权限,这里可以测试出2问题
# 1、确定当a用户被取消权限时,b用户依然有权限
# 2、发现要能给别人授权,授权控制要在一个语句中,比如说CREATE SESSION不能给别人
#################################################
 
SQL> grant create table to b
  2  with admin option;
 
Grant succeeded.
 
SQL> conn / as sysdba
Connected.
SQL> revoke create session, create table from a;
 
Revoke succeeded.
 
SQL> conn b/b123
Connected.
SQL> grant create session, create table to a;
grant create session, create table
*
ERROR at line 1:
ORA-01031: insufficient privileges
 
SQL> grant create table to a;
 
Grant succeeded.
 
#################################################
# 下面是对象权限了,c用户在自己模式下建ct表,SELECT to a
#################################################
 
SQL> conn c/c123
Connected.
SQL> create table ct (
  2  cid int,
  3  cname varchar2(20));
 
Table created.
 
SQL> grant select on ct to a
  2  with grant option;
 
Grant succeeded.
 
#################################################
# 以SYSDBA身份登录后,要做的是新建用户并授权连接权限
# a用户没有CREATE SESSION权限了,在这里加上
#################################################
 
SQL> conn / as sysdba
Connected.
 
SQL> grant create session to a;
 
Grant succeeded.
 
SQL> create user d identified by d123;
 
User created.
 
SQL> grant create session to d;
 
Grant succeeded.
 
#################################################
# 以a用户登录授权给d,SELECT to d,再以a、d用户分别执行查询c.ct表的命令
#################################################
 
SQL> conn a/a123
Connected.
SQL> grant select on c.ct to d
  2  with grant option;
 
Grant succeeded.
 
SQL> select * from c.ct;
 
no rows selected
 
SQL> conn d/d123
Connected.
SQL> select * from c.ct;
 
no rows selected
 
#################################################
# c用户取消a用户的权限,同时d用户也没有权限了
#################################################
 
SQL> conn c/c123
Connected.
SQL> revoke select on ct from a;
 
Revoke succeeded.
 
SQL> conn a/a123
Connected.
SQL> select * from c.ct;
select * from c.ct
                *
ERROR at line 1:
ORA-00942: table or view does not exist
 
 
SQL> conn d/d123
Connected.
SQL> select * from c.ct;
select * from c.ct
                *
ERROR at line 1:
ORA-00942: table or view does not exist

实践出真知,光有理论没用啊,不过我们经过练习测试,发现理论都还是对的,呵。

你可能感兴趣的:(sql,数据库,session,user,table,insert)