在 Oracle 数据库中,为了便于管理用户所创建的数据库对象(比如数据表、索引、视图等),引入了模式的概念,这样某个用户所创建的数据库对象就都属于该用户模式。
Oracle
用户(user
)就是访问 oracle
数据库的人。通过对用户的各种安全参数进行控制,以维护数据库的安全性,这些概念包括模式(schema
)、权限、角色、存储设置、空间限额、存取资源限制、数据库审计等。当用户登录 Oracle
时需要进行身份认证,以便确认该用户能够进行的操作。
认证
是指对需要使用数据、资源或应用程序的用户进行身份确认。通过认证后,可以为用户后面的数据库操作提供一种可靠的连接关系。Oracle
提供了多种身份认证方式:操作系统身份认证,Oracle 数据库身份认证,管理员身份认证。
操作系统身份认证
:主要对登录操作系统的用户的合法身份进行认证。如:sqlplus / as sysdbaOracle 数据库身份认证
:使用存储在数据库中的信息对试图连接数据库的用户进行身份认证。在用户连接数据库时,必须提供正确的用户名和密码,才能登录到 Oracle 数据库。数据库管理员(DBA)认证
:DBA 拥有最高的管理权限,可以执行一些特殊的操作,比如关闭或启动数据库。表空间
是信息存储的最大逻辑单位、当用户连接到数据库时,若未指出数据的目标存储表空间时,则数据存储在用户的默认表空间中。用户的默认表空间可以在创建用户时指定,也可以使用 aler user
命令指定。如果创建用户时不指定默认表空间,则普通用户的默认空间为 users
,sys 用户的默认表空间为 system,可以通过 dba_users
查看(all_users
的信息要比 dba_users
少)。
临时表空间用来管理数据库排序操作以及用于存储临时表
、中间排序
结果等临时对象。当 ORACLE
需要用到排序时,并且 PGA 中 sort_area_size
大小不足时,将会把数据放入临时表空间里进行排序。如果创建用户时,不指定默认的临时表空间,则默认临时表空间为 temp。
用户资源文件用来对用户的资源存取进行限制,防止非正常连接数据库。包括:cpu 使用时间限制、内存逻辑读个数限制、每个用户同时可以连接的会话数限制、一个会话的空间和时间限制、一个会话的持续时间限制、每次会话的专用 SGA 空间限制。
创建资源文件命令如下:
create profile profile_name limit 参数 ...;
资源文件的参数如下:
connect_time:指定一个会话能保持连接到数据库的总时间
cpu_per_call:限制事务内每个调用使用CPU的时间。
cpu_per_sessin:限制每个会话内使用CPU的时间。
sessions_per_time:限制用户可以打开并发的最大会话数。
idle_time:限制用户的最大空闲时间。
logical_reads_per_session:限制数据块读取的总数目。
logical_reads_per_call:限制每个会话调用总的逻辑读取数。
private_sga:指定一个在SGA的共享池组件中分配的空间限额(仅适用于共享服务器)。
composite_limit:对资源设置使用一个总的限制。Oracle考虑用四个参数来计算加权的composite_limit。分别为:cpu_per_session, logical_reads_per_sessions, connect_time, private_sga。可以使用 alter resource cost来设置.。
密码类:
failed_login_attempts:指用户被锁之前可以尝试的最大登录数。
password_life_time:指定使用特定密码的时间限制,如果超出此时间间隔,那么密码将过期。
password_grace_time:设置一个时间段,在此时间段内将发出一个密码过期警告。
password_lock_time:设置用户被锁定的天数,过了此天数,用户将自行解锁。
password_reuse_time:指定重新使用密码要经过多少天。
password_reuse_max:指定重新使用某个特定密码前,要经过多少次修改。
passwrod_verify_function:此参数允许指定Oracle提供的密码验证函数来建立自动密码验证。
为用户指定资源文件:alter user user_name profile rofile_name;
配额大小指的是用户指定使用表空间的的大小,默认情况下用户没有配额限制。在创建或修改用户时,可以由参数 quota
指定。若用户在向表空间存储数据时,超出了此限额,则会产生错误。错误信息如:ORA-01536:space quota exceeded for tablespace tablespacename…
。
通过查询字典 dba_ts_quotas
查看表空间限额信息:
SQL> select tablespace_name, username, bytes/1024/1024 size_MB, max_bytes from dba_ts_quotas;
Oracle 和用户管理相关的数据字典主要有三个:DBA_USERS、USER_USERS、ALL_USERS:
DBA_USERS
:该数据字典用于查询 Oracle 的所有用户信息ALL_USERS
:该数据字典用来查询所有用户的信息,但是能够查询的信息比 DBA_USERS
要少得多USER_USERS
:该数据字典用来查询当前用户的信息用户、模式、模式对象区别:
用户
:这里的用户并不是指数据库的操作人员,而是数据库中定义的一个名称,更准确地说它是账户,只是习惯上称其为用户。也可以说用户是用来连接数据库和访问数据库对象的。模式
:在oracle中,为了便于管理用户所创建的数据库对象,引入了模式概念。模式是一个数据库对象的集合。模式为一个数据库用户所拥有,并且具有与该用户相同的名称模式对象
:由用户创建的逻辑结构,用以存储或引用数据,其实就是指数据库对象用户与模式区别:
模式与模式对象:
模式
是一个数据库对象的集合。模式为一个数据库用户所有,并且具有与该用户相同的名称,比如SYSTEM模式
、 SCOTT模式
等。在一个模式内部不可以直接访问其他模式的数据库对象,即使在具有访问权限的情况下,也需要指定模式名称才可以访问其他模式的数据库对象。Oracle 提供的 SCOTT 模式的目的,就是为了给用户提供一些实例表和数据来展示 Oracle 数据库的一些特性,通过连接到 SCOTT 用户模式,查询数据字典视图 USER_TABLES
可以获得该模式所包含的数据表,共计 4 个。
另外,用户也可以在 SYSTEM 模式下查询 SCOTT 模式所拥有的数据表,但要求使用 dba_tables数据表。
sys和system用户的区别:
system
:用户具有DBA权限,但是没有SYSDBA
权限,用户只能用normal
身份登陆。system是数据库内置的一个普通管理员,手工创建的任何用户在被授予dba角色后都跟这个用户差不多。sys
:用户具有SYSDBA
或者SYSOPER
权限,登陆也只能用这两个身份,不能用normal
。SYS用户具有DBA权限,并具有SYS模式。只能通过SYSDBA登录数据库,是Oracle数据库中权限最高的帐号normal 、sysdba、 sysoper 区别:
normal
:是普通用户,登录后任然是登录名(show user命令)sysdba
:拥有最高的系统权限,sysdba登陆后是 sys (show user命令)sysoper
:主要用来启动、关闭数据库,sysoper 登陆后用户是 public(show user命令)SYSOPER
权限,即数据库操作员权限,权限包括:
SYSDBA
权限,即数据库管理员权限,权限包括:
Oracle数据库中任何对象都属于一个特定用户, 用户的创建、删除、授权管理相关操作需要具备dba(数据库管理员)权限。
创建用户的语法如下:
CREATE USER user_name
IDENTIFIED BY password
DEFAULT TABLESPACE tablespace_name
TEMPORARY TABLESPACE tablespace_name
PROFILE profile_name QUOTA integer|UNLIMITED ON tablespace;
说明:
IDENTIFIED BY password
:用户口令DEFAULT TABLESPACE tablespace
:默认表空间。如果不指定,默认空间为 usersTEMPORARY TABLESPACE tablespace
:临时表空间。如果不指定,默认为 tempPROFILE profile|DEFAULT
:用户资源文件;QUOTA integer[K|M]|UNLIMITED ON tablespace
:用户在表空间上的空间使用限额查询用户的默认表空间
SQL> select username, default_tablespace, temporary_tablespace from dba_users where username = 'WGX';
查询用户 wgx 的资源文件名
select username,profile from dba_users where username='WGX';
修改用户的语法如下
该命令各部分参数的含义与 create user 完全相同
Alter User user_name
Identified by password
Default Tablespace tablespace_name
Temporary Tablespace tablespace_name
Profile profile_name
Quota integer/unlimited on tablespace;
修改相关sql
修改用户 wgx 的密码
SQL> alter user wgx identified by "WGX123456";
注:密码用双引号括起来
修改用户 wgx 的默认表空间
SQL> alter user wgx default tablespace ts003;
修改用户 wgx 的默认临时表空间
SQL> alter user wgx temporary tablespace temp03;
修改用户 wgx 的资源文件
SQL> alter user wgx profile wgx_new_profile;
查看用户 wgx 的信息
SQL> select username,default_tablespace,temporary_tablespace,profile
from dba_users where username ='WGX';
为用户 wgx 授予权限
SQL> grant connect,resource to wgx;
Grant succeeded.
强制用户 wgx 修改密码
SQL> Alter user wgx password expire;
User altered.
当用户 wgx 登录时强制要求修改密码
SQL> conn wgx/WGX123456
ERROR:
ORA-28001: the password has expired
为用户加锁
SQL> alter user wgx account lock;
User altered.
以 wgx 用户登录时显示用户被锁定
SQL> conn wgx
Enter password:
ERROR:
ORA-28000: the account is locked
Warning: You are no longer connected to ORACLE.
为用户解锁
SQL> alter user wgx account unlock;
User altered.
查询用户会话信息
SQL> select username, sid, serial#, machine from v$session
where username = 'WGX';
删除用户会话信息
命令格式:
Alter system kill session 'sid, serial#';
SQL> alter system kill session '34,73';
System altered.
SQL> select username, sid, serial#,status, machine from gv$session where username ='WGX';
删除用户的语法
drop user user_name [descade];
说明:如果要删除的用户包含对象,需要使用 descade
参数连同包含的对象一并删除
限制具备超级管理(sysdba)权限的用户远程登录。
设置初始化参数 remote_login_passwordfile=none
,禁止 sysdba
用户远程登录
查看参数
SQL> show parameter remote_login_passwordfile
SQL> alter system set remote_login_passwordfile=none scope=spfile sid='*';
System altered.
--重启数据库,查看初始化参数 remote_login_passwordfile 的取值
SQL> show parameter remote_login_passwordfile
在 sqlnet.ora
中设置 SQLNET.AUTHENTICATION_SERVICES=NONE
禁止 sysdba
角色的自动登录
[grid@rac2 ~]$ cd $ORACLE_HOME/network/admin
[grid@rac2 admin]$ vi sqlnet.ora
# sqlnet.ora.rac2 Network Configuration File: /u01/app/11.2.0/grid/network/admin/sqlnet.ora.rac2
# Generated by Oracle configuration tools.
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
ADR_BASE = /u01/app/grid
SQLNET.AUTHENTICATION_SERVICES=NONE
根据业务需要,为用户配置所需的最小权限。
--为用户赋予最小权限
grant 权限 to user_name;
--收回用户的多余权限
revoke 权限 from user_name;
启用数据字典保护,只有 sysdba
用户才能访问数据字典表。设置初始化参数 O7_DICTIONARY_ACCESSIBILITY
为 false。
SQL> show parameter o7
权限
是用户对一项功能的执行权力。每个 Oracle
用户都拥有一些由其创建的表、视图和其他资源。Oracle 系统提供三种权限:对象级(Object
),系统级(System
),角色级(Role
)。
这些权限可以授予给用户、特殊用户 public
或 角色,如果授予一个权限给特殊用户 Public(用户 public 是 Oracle 预定义的,每个用户享有这个用户享有的权限),则意味作将该权限授予了该数据库的所有用户。
Oracle
角色(role
)是一组权限(privilege
)。可以给角色授予指定的权限,然后将角色赋给相应的用户。对管理权限而言,角色是一个工具,权限能够被授予给一个角色,角色也能被授予给另一个角色或用户。用户可以通过角色继承权限,除了管理权限外角色服务没有其它目的。
在 Oracle
中,根据系统管理方式不同,将权限分为系统权限与实体权限两类。
系统权限
:是指被授权用户是否可以连接到数据库上,在数据库中可以进行哪些系统操作。实体权限
:是指用户对具体的模式实体(schema
)所拥有的权限。系统权限分类:
DBA
:拥有全部特权,是系统最高权限,只有 DBA
才可以创建数据库结构。RESOURCE
:拥有 Resource
权限的用户可以创建实体,不可以创建数据库结构。CONNECT
:拥有 Connect
权限的用户只可以登录 Oracle
,不可以创建实体,不可以创建数据库结构。对于普通用户:可以授予 connect、resource 权限。
对于DBA 用户:授予 connect、resource、dba 权限。
系统权限授权:系统权限授权,系统权限只能由 DBA 用户授出,命令如下:
grant connect, resource, dba to 用户名1 [,用户名2]...;
查看系统权限:
使用DBA_SYS_PRIVS 查看系统权限
select * from dba_sys_privs where grantee='CONNECT';
系统权限传递:
授予权限时使用 WITH ADMIN OPTION选项,则得到的权限可以传递,即用户可以把自己的系统再授予其他用户。
grant connect, resource, dba to white with admin option;
系统权限回收:
系统权限无级联,即 A 授予 B 权限,B 授予 C 权限,如果 A 收回 B 的权限,C 的权限不受影响
Revoke connect, resource from 用户名1;
实体权限分类:select、update、insert、alter、index、delete、all、execute
DBA
用户可以操作全体用户的任意基表,无需授权。
使用 sys 账户为 white 用户和 black 用户创建表,并输入数据:
SQL> show user
USER is "SYS"
SQL> create table white.t1(x int,name varchar2(20));
*
SQL> insert into white.t1 values(1,'white:t1');
SQL> create table black.t22(x int,name varchar2(20));
SQL> insert into black.t22 values(1,'black:t22');
授权相关
为 white 用户授予实体权限
SQL> grant select on scott.emp to white;
实体权限传递授权:授权时使用 with grant option
参数可实现实体权限的传递授权。
SQL> grant select on scott.dept to white with grant option;
实体权限的回收:收回white 用户针对 scott.emp 对象的查询权限
如果收回某个用户的对象权限,那么对于这个用户使用 WITH GRANT OPTION
授予权限的用户来说,同样还会收回这些用户的相同权限,也就是说回收授权是级联的
SQL> revoke select on scott.emp from white;
将对象权限授予全体用户
将对象 white.t1 的查询权限授予所有用户
SQL> grant select on white.t1 to public;
Grant succeeded.
ORACLE
的数据字典分为:USER,ALL 和 DBA
USER_*
:有关用户所拥有的对象信息,即用户自己创建的对象信息。ALL_*
:有关用户可以访问的对象的信息,即用户自己创建的对象的信息加上其他用户创建的对象但该用户有权访问的信息。DBA_*
:整个数据库中对象的信息。与用户权限相关的数据字典表有:
DBA_SYS_PRIVS
USER_SYS_PRIVS
ROLE_SYS_PRIVS
DBA_TAB_PRIVS
ALL_TAB_PRIVS
USER_TAB_PRIVS
ROLE_TAB_PRIVS
SESSION_PRIVS
SESSION_ROLES
DBA_ROLES
DBA_ROLE_PRIVS
角色(role
)是一组权限的集合,将角色赋给一个用户,这个用户就拥有了这个角色中的所有权限。
预定义角色是在数据库安装后,系统自动创建的一些常用的角色。查询角色所包含的权限可以使用以下语句:
SQL> select * from role_sys_privs where role='RESOURCE';
CONNECT,RESOURCE,DBA
Oracle
建议用户自己设计数据库管理和安全的权限规划,而不要简单的使用这些预定角色。DELETE_CATALOG_ROLE,EXECUTE_CATALOG_ROLE,SELECT_CATALOG_ROLE
EXP_FULL_DATABASE,IMP_FULL_DATABASE
AQ_USER_ROLE,AQ_ADMINISTRATOR_ROLE
SNMPAGENT
RECOVERY_CATALOG_OWNER
创建角色
create role role_name;
创建带有口令的角色
create role class_manager identified by Wgx123456;
SQL> create role teacher;
SQL> create role student;
为角色授权
SQL> grant create any table, create procedure to teacher;
SQL> grant SELECT ANY TABLE to student;
授予角色给用户
SQL> grant teacher to white;
SQL> grant student to black;
查看用户 while 和 black 包含的角色:
SQL> select * from dba_role_privs where grantee='WHITE';
SQL> select * from dba_role_privs where grantee='BLACK';
查看角色所包含的权限
SQL> select * from role_sys_privs where ROLE='TEACHER';
SQL> select * from role_sys_privs where ROLE='STUDENT';
为角色添加口令
SQL> alter role teacher identified by Tea123456;
删除角色的口令
SQL> alter role teacher not identified;
假设 user1 用户有 b1、b2、b3 三个角色,那么如果 b1 未生效,则 b1 所包含的权限对于用户 user1 来讲是不拥有的,只有角色生效了,角色内的权限才作用于用户。最大可生效角色数由参数 MAX_ENABLED_ROLES
设定:
SQL> show parameter MAX_ENABLED_ROLES
用户登录后,oracle 将所有直接赋给用户的权限和用户默认角色中的权限赋给用户。
SQL> select * from SESSION_ROLES;
SQL> create user boss identified by Boss123456;
SQL> create role manager;
SQL> grant connect,resource,dba to manager;
SQL> grant manager,teacher,student to boss;
使boss 用户的角色生效:
--设置所有角色失效
SQL> set role none;
SQL> select * from session_roles;
no rows selected
使 teacher 生效
SQL> set role teacher;
--使 connect,student 生效
SQL> set role student,connect;
--使除了 student 外的该用户的所有其它角色生效
SQL> set role all except student;
修改用户,设置其默认角色
SQL> alter user boss default role teacher;
删除角色
角色删除后,原来拥用该角色的用户就不再拥有该角色了,相应的权限也就没有了。
SQL> drop role student;
Role dropped.