你的位置:首页 > 数据库

[数据库]用户与权限管理


用户和权限是Oracle数据库系统最基本的安全管理机制。

用户通过SQL*Plus或者应用程序登录Oracle时,必须提供一个胀号,即用户名和口令。
登录后还必须有一定的权限才能完成相应的操作。
用户具有什么样的权限,才能完成什么样的操作。

如果用户希望访问数据库,首先应该由数据库管理员为其分配一个账号,然后再为它指定一定的权限,这样用户才能完成相应的操作。
数据库管理员还可以通过PROFILE对用户使用口令及系统资源的情况进行控制

用户管理

用户是一个数据库对象,是一系列数据库对象和权限的统称

用户所有的操作默认在自己的模式下进行,模式是一个用户所拥有的数据库对象的集合,每个用户都有自己的模式,用户与模式之间是一一对应的,模式的名字与用户名相同。
例如, SCOTT 用户的模式为SCOTT,
在这个模式中包含了用户SCOTT拥有的所有数据库对象,包括表、视图、索引、存储程序等。
用户的数据库对象和数据分布在表空间中,每个用户都有默认的表空间。

默认的表空间在创建用户时指定,如果不指定,那么SYSTEM表空间将被指定为该用户的默认表空间。

数据库中有哪些用户

在Oracle数据库中有三类用户,一类是sysdba ,一类是sysoper ,第三类是普通用户

其中
前两类用户称之为特权用户,它们拥有对所有数据库对象的一切权限,包括数据库本身

sys 用户同时具有sysdba和sysoper两种权限,它在创建数据库时自动产生,不需要手工创建。
特权用户的口令一方面存放在数据库中,另一方面存储在口令文件中。

如果为一个普通用户指定了sysdba或sysoper权限,那么这个用户也将成为特权用户。
特权用户的信息可以从动态性能视图v$pwfile_users 中获得
一个用户只要具有这两种权限,就可以以“ as sysdba ”或者“ as sysoper”的方式登录数据库服务器。
例如:

sqlplus scott/tiger as sysdba

如果用户以“ as sysdba” 方式登录数据库服务器,那么他将成为sys 用户。

如果以“ as sysoper”的方式登录,那么他将成为PUBLIC用户。
这两种权限的范围大小是不一样的,例如,如果一个用户以“ as sysdba”方式登录,那么他可以无条件地访问任何用户的数据,例如:

sqlplus scott/tiger as sysdba

select * from userl.tl;

如果一个用户以“as sysoper”方式登录,那么他是不能访问其他用户的数据的。

在后面的内容中,将对这两种权限进行详细的比较。
普通用户一般由sys用户创建,这类用户的权限比较小,一般只限于访问自己模式中的数据库对象。

普通用户如果希望对数据库进行其他的访问,就需要具有相应的权限。

如何创建用户

数据库系统在运行的过程中,往往要根据实际需求创建用户,然后为用户指定适当的权限。
创建用户的操作一般只能由sys 用户完成,如果普通用户也要创建用户,必须具有一个系统权限,即CREATE USER
创建用户的命令是CREATE USER ,创建用户所包含的内容包括为用户指定用户名、口令、默认表空间、存储空间配额等。
其中用户名是代表用户账号的标识符,它的命名规则是:
·必须以字母开始
·长度为l ~ 30 个字符
·从第二个字符开始,可以包括大小写字母、数字、一、$和#等字符。
.大写和小写是相同的
用来创建用户的CREATE USER命令的完整语拉格式为:

CREATE USER 用户名 IDENTIFIED BY "口令"
DEFAULT TABLESPACE 表空间
TEMPORARY TABLESPACE 临时表空间
QUOTA 空间配额大小 ON 表空间
PASSWORD EXPIRE
ACCOUNT LOCK | UNLOCK

其中DEFAULT TABLESPACE用来为用户指定默认表空间,如果不指定,那么SYSTEM表空间将被指定为这个用户的默认表空间。
如果不特别指定,用户创建的表、索引等数据库对象就位于默认表空间中。
为了提高数据库的性能,同时为了方便管理数据, Oracle建议为用户指定一个默认表空间。
TEMPORARY TABLESPACE用于为用户指定临时表空间。

在一个数据库中可以创建多个临时表空间,为每个用户可以指定不同的临时表空间。
还可以把多个临时表空间组织为一个表空间组,把这个表空间组作为整个数据库或者某个用户的默认临时表空间。
QUOTA子句用于为用户在表空间上指定空间配额。

尽管为用户指定了默认表空间,但是用户在这个表空间上还不能创建数据库对象,因为它在这个表空间上没有可支配的存储空间。
空间配额以字节、KB 、MB等为单位,还可以指定为UNLIMITED ,即无限制的空间配额

如果希望用户在所有表空间上都具有无限制的空间配额,只要为其指定UNLIMITED TABLESPACES系统权限即可。
PASSWORD EXPIRE用于指定用户的口令过期,用户在第一次登录数据库服务器时必须修改自己的口令。
在创建用户账号时,用户的初始口令是由管理员指定的。

如果以口令过期的方式强迫用户修改自己的口令,这样将使用户的账号更加安全。
ACCOUNT子句用于指定用户账号的状态,如果为UNLOCK ,这个用户就能够登录数据库服务器,这是默认设置。
如果为LOCK ,则为锁定状态。
例如,下面的CREATE语句用于创建用户user1,并为其指定相关属性:

CREATE USER user1 IDENTIFIED BY "123"
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA 100M ON users
PASSWORD EXPIRE
ACCOUNT LOCK;

如何在创建用户时没有指定QUOTA大小可以在后面添加:

例如:

alter user user1 quota 10M on users;  
alter user user1 quota unlimited on users;
grant unlimited tablespace to user1;

用户被创建之后,还没有任何权限,甚至不能登录数据库,只有当sys用户为它指定了一定的权限后,它才能对数据库进行访问。
用户的相关信息可以从数据字典视图dba_users 中获得

例如,下面的SELECT语句用于查询当前数据库中所有用户的名称、口令、默认表空间和账号状态等信息:

SELECT username, password, account_status, default_tablespace FROM dba_users WHERE username='USER1';

在列出的用户中,包括特权用户、数据库预创建的用户和刚刚手工创建的用户。

用户的口令都是经过加密的,在较早版本的数据库中,可以显示加密的口令,在现在的版本中不显示口令。
如果不特别指定,用户的默认表空间是SYSTEM表空间。

如何修改用户的信息

为了防止不法之徒盗取用户的口令,用户应该经常改变自己的口令。

用户的口令不应该是类似1234 、abed这样简单的字符串,更不要指定为自己生日和姓名,也不要指定为一个英文单词,因为这样的口令很容易被破译。
一个好的口令应该包括大小写字母、数字、_、&、%、$等各种符号在内的混合字符串
统计表明,一个口令中包含的成分越复杂,就越难破译。
修改用户口令的操作一般由用户自己完成, sys用户可以无条件修改任何一个用户的口令。
普通用户只能修改自己的口令,如果要修改其他用户的口令,必须具有ALTER ANY USER这个系统权限。
修改用户口令的命令是ALTER USER 。

修改用户口令的ALTER USER命令格式为:

ALTER USER 用户名 IDENTIFIED BY "新口令";

例如,将刚才创建的用户user1的口令改为“ book ”,对应的ALTER USER语句为:

ALTER USER user1 IDENTIFIED BY "book";

除了SQL命令ALTER USER 以外, SQL*Plus也提供了一个PASSWORD命令,可以用来修改用户的口令
利用SQL*Plus 的这条命令, sys用户可以修改其他用户的口令,普通用户可以修改自己的口令,在授权的情况下也可以修改其他用户的口令。
一个用户在修改自己的口令时,必须知道自己以前的口令
这条命令只有一个参数,就是用户名,如果默认了这个参数,就修改自己的口令。
以下是用户scott修改自己的口令的情况:

PASSWORD scott

Al,TER USER命令除了修改用户口令外.还可以修改用户的默认表空间、存储空间配额、账号状态等信息。
例如, 下面的语句用于锁定用户scott:

ALTER USER scott ACCOUNT LOCK;

下面的语句用于修改用户user1默认表空间、临时表空间,并将该用户在表空间users上的空间配额修改为无限制:

ALTER USER userl
DEFAULT TABLESPACE tsl
TEMPORARY TABLESPACE tsl
QUOTA UNLIMITED ON tsl;

如何删除用户

一个用户不再访问数据库系统时,应该将这个用户及时地从数据库中删除,否则可能会有安全隐患。
一个更好的做法是先将这个用户锁定,过一段时间如果确定这个用户不再需要,再将其删除。
删除用户的操作一般由sys用户完成,也可以由具有DROP USER权限的用户来完成。

一个用户被删除后,这个用户本身的信息,以反它所拥有的数据库对象的信息都将从数据字典中被删除。
删除用户的命令是DROP USER 。

这条命令的语法格式为:

DROP USER 用户名;

例如,要删除用户USER2,可以执行下面的DROP USER语句:

DROP USER user2;

需要注意的是,如果在一个用户的模式中已经包含一些数据库对象,那么这个用户是不能被直接删除的,在删除用户时系统将显示类似以下的信息:

ORA-01922: 必须指定 CASCADE 以删除 'USER1'

出现错误信息的原因是在用户USER1的模式中包含某些数据库对象,所以不能直接删除。

如果要强制删除用户,可以在DROP USER命令中使用CASCADE选项,这样用户以及所拥有的数据库对象将一起被删除。
例如,删除用户scott可以执行下面的语句:

DROP USER user1 CASCADE;