用户和权限

创建用户
 CREATE USER user_name IDENTIFIED BY password;
 DROP USER user_name [cascade];
 ALTER USER user_name ACCOUNT [UN]LOCK;


什么是权限
 权限就是用来控制特定的用户发送特定的SQL语句是否允许正确的执行
 在多用户环境,DBA需要维护数据库访问的安全
 以确保特定用户拥有特定的操作权限

数据库的权限分为
 系统权限
 对象权限
 
系统权限
 大部分是针对对象的创建,删除,修改,审计等等的操作
 查看系统都具备哪些权限
  select PRIVILEGE from dba_sys_privs;
 查看当前会话都具备哪些权限
  select * from session_privs;


 
对象权限
 授予特定用户对特定对象的权限
 特定对象:表、视图、序列、过程、函数、程序包上。

角色
 系统中有166个权限 我们不便于管理
 于是oracle对很多需求的权限定义成了角色的模式 来方便我们管理
 角色就是一组权限的集合
 我们也可以自己建立包含自己拟定权限的角色
 查看oracle给你定制了哪些角色
 select distinct GRANTEd_role  from dba_role_privs ;

 

常见的角色中包含的权限
 dba connect resource
 
 
查看角色中都包含了哪些权限
session A:> select GRANTEE,PRIVILEGE  from dba_sys_privs where GRANTEE='RESOURCE';

GRANTEE          PRIVILEGE
------------------------------ ----------------------------------------
RESOURCE         CREATE TRIGGER
RESOURCE         CREATE SEQUENCE
RESOURCE         CREATE TYPE
RESOURCE         CREATE PROCEDURE
RESOURCE         CREATE CLUSTER
RESOURCE         CREATE OPERATOR
RESOURCE         CREATE INDEXTYPE
RESOURCE         CREATE TABLE

8 rows selected.

session A:> select GRANTEE,PRIVILEGE  from dba_sys_privs where GRANTEE='CONNECT';

GRANTEE          PRIVILEGE
------------------------------ ----------------------------------------
CONNECT          CREATE SESSION

session A:>  
 
CREATE any table和create table他们是有区别的
可以在任意用户模式下建表
只可以在自己的模式下建表

用户被创建后,就需要授予他系统权限,刚创建的用户连登陆权限都没有(create session)

对于应用开发用户需要的基本权限:
 CREATE SESSION
 CREATE TABLE
 CREATE SEQUENCE
 CREATE VIEW
 CREATE PROCEDURE

授权通过grant
语法:
GRANT object_priv[(columns)]
[ON object]
TO {user|role|public}
[WITH GRANT OPTION]

回收通过revoke
语法:
REVOKE {privilege[,privilege...]|ALL}
[ON object]
FROM {user[,user...]|role|PUBLIC}
[CASCADE CONSTRAINTS]

SYS@ora10g> create user u1 identified by p1;

User created.

SYS@ora10g> grant connect,resource to u1;

Grant succeeded.

SYS@ora10g> desc dba_role_privs;
 Name            Null?    Type
 ----------------------------------------------------------- -------- ----------------------------------------
 GRANTEE             VARCHAR2(30)
 GRANTED_ROLE           NOT NULL VARCHAR2(30)
 ADMIN_OPTION             VARCHAR2(3)
 DEFAULT_ROLE             VARCHAR2(3)

SYS@ora10g> select * from dba_role_privs where GRANTEE='U1';

GRANTEE          GRANTED_ROLE        ADM DEF
------------------------------ ------------------------------ --- ---
U1          RESOURCE         NO  YES
U1          CONNECT         NO  YES

SYS@ora10g> revoke RESOURCE,CONNECT from u1;

Revoke succeeded.

SYS@ora10g> select * from dba_role_privs where GRANTEE='U1';

no rows selected

session A:> alter user u1 account lock;

User altered.

session A:> alter user u1 account unlock;

User altered.

session A:>

SYS@ora10g> drop user u1;

User dropped.

SYS@ora10g>

如果用户模式下有对象是不能删除用户的 可以加cascade连同对象一起删
session A:> create table u1.t as select * from scott.emp;

Table created.

session A:> drop user u1;
drop user u1
*
ERROR at line 1:
ORA-01922: CASCADE must be specified to drop 'U1'


session A:> drop user u1 cascade;

User dropped.

session A:>


角色操作
session B:> drop role r1;

Role dropped.

session B:> create role r1;

Role created.

session B:> grant connect,create table to r1;

Grant succeeded.

session B:> create role r2;

Role created.

session B:> grant create view to r2;

Grant succeeded.

session B:> grant r2 to r1;

Grant succeeded.

session B:> grant r1 to scott;

Grant succeeded.

session B:>


授权的级联
grant选项
with admin option 权限回收无级联 适用系统权限和角色
with grant option 权限回收有级联 适用对象权限

session B:> create user u1 identified by u1;

User created.

session B:> create user u2 identified by u2;

User created.

session B:> grant connect to u1 with grant option;
grant connect to u1 with grant option
                         *
ERROR at line 1:
ORA-01939: only the ADMIN OPTION can be specified


session B:> grant connect to u1 with admin option;

Grant succeeded.

session B:> conn u1/u1
Connected.

session B:> grant connect to u2 ;

Grant succeeded.

session B:> conn / as sysdba
Connected.
session B:> select * from dba_role_privs where GRANTEE in ('U1','U2');

GRANTEE          GRANTED_ROLE        ADM DEF
------------------------------ ------------------------------ --- ---
U2          CONNECT         NO  YES
U1          CONNECT         YES YES

session B:> revoke connect from u1;

Revoke succeeded.

session B:> select * from dba_role_privs where GRANTEE in ('U1','U2');

GRANTEE          GRANTED_ROLE        ADM DEF
------------------------------ ------------------------------ --- ---
U2          CONNECT         NO  YES

session B:>


恢复U1的connect权限 再测试对象权限

session B:> select * from dba_role_privs where GRANTEE in ('U1','U2');

GRANTEE          GRANTED_ROLE        ADM DEF
------------------------------ ------------------------------ --- ---
U2          CONNECT         NO  YES
U1          CONNECT         NO  YES

session B:>
session B:> grant select on scott.emp to u1 with admin option;
grant select on scott.emp to u1 with admin option
                                     *
ERROR at line 1:
ORA-00993: missing GRANT keyword


session B:> grant select on scott.emp to u1 with grant option;

Grant succeeded.

session B:> conn u1/u1
Connected.
session B:> grant select on scott.emp to u2;

Grant succeeded.

session B:> conn / as sysdba
Connected.

session B:> COL GRANTEE FOR A20
session B:> COL OWNER FOR A20
session B:> COL TABLE_NAME FOR A20
session B:> COL GRANTOR FOR A20
session B:> COL PRIVILEGE FOR A20
session B:>
session B:> select * from dba_TAB_privs where GRANTEE in ('U1','U2');

GRANTEE          OWNER   TABLE_NAME GRANTOR PRIVILEGE      GRA HIE
------------------------------ ---------- ---------- ---------- -------------------- --- ---
U2          SCOTT   EMP      U1  SELECT       NO  NO
U1          SCOTT   EMP      SCOTT SELECT       YES NO

session B:> revoke select on scott.emp from u1;

Revoke succeeded.

session B:> select * from dba_TAB_privs where GRANTEE in ('U1','U2');

no rows selected

session B:>

U2的也被回收了  回收级联

 

访问不同模式中的表 
   模式schema
 模式是一个逻辑的概念 是一组对象的集合
 一个用户创建了,那么该用户的schema名等于用户名,并作为该用户缺省schema。
 这也就是我们看到schema名都为数据库用户名的原因
 模式是可以切换的 这样可以实现以A用户的身份去访问B用户的模式
 
 
SQL> conn / as sysdba

SQL> drop user u2 cascade;

User dropped.

SQL> drop user u1 cascade;

User dropped.

SQL> create user u1 identified by u1;

User created.

SQL> grant connect,resource,select any table to u1;

Grant succeeded.

SQL> create user u2 identified by u2;

User created.

SQL> grant connect,resource,select any table to u2;

Grant succeeded.

SQL> create table u1.tt(ename varchar2(10));

Table created.

SQL> insert into u1.tt values('U1');

1 row created.

SQL> create table u2.tt(ename varchar2(10));

Table created.

SQL> insert into u2.tt values('U2');

1 row created.

SQL> conn u1/u1
Connected.
SQL> select * from tt;

ENAME
----------
U1

SQL> alter session set current_schema=u2;

Session altered.

SQL> select * from tt;

ENAME
----------
U2

SQL> show user
USER is "U1"
SQL>
了解这个概念即可 因为我们基本不会改用户的模式,而是通过在对象前使用schema前缀 例如scott.emp来实现模式转换的.
 

 

请使用浏览器的分享功能分享到微信等