用户和权限是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;
用户的权限管理
Oracle数据库对用户的权限有着严密的规定,如果没有权限,用户将无法完成任何操作,甚至不能登录数据库。
例如,刚刚创建的用户user1在试图登录数据库时,将看到以下错误信息:
ORA-01045: user USER1 lacks CREATE SESSION privilege; logon denied
也就是说,用户若要登录数据库,必须具有CREATE SESSION权限。
用户权限有两类,即系统权限和对象权限。
系统权限主要是指对数据库对象的创建、删除、修改的权限,对数据库进行创建、备份等权限,而对象权限主要是指对数据库对象中的数据的访问权限。
系统权限一般由sys用户指定,也可以由具有特权的其他用户授予。
对象权限一般由数据库对象的所有者授予用户,也可以由sys用户指定,或者由具有该对象权限的其他用户授予。
系统权限的管理
系统权限是与数据库安全有关的最重要的权限,这类权限一般是针对数据库管理员的。
系统权限的管理主要包括权限的分配、回收和查询等操作。
Oracle 11g提供了200余种系统权限,下表 列出了与用户有关的最重要的几种系统权限。
对于表、视图、会话、用户、触发器这些数据库对象,有关的系统权限包括创建、删除和修改它们的权限,相关的命令分别是CREATE 、DROP和ALTER 。
表、视图、触发器、存储程序等对象是与用户有关的,在默认情况下对这些对象的操作都是在当前用户自己的模式下进行的。
如果要在其他用户的模式下操作这些类型的对象,需要具有对应的ANY权限。
例如,要能够在其他用户的模式下创建表,当前用户必须具有CREATE ANY TABLE系统权限,如果希望能够在其他用户的模式下删除表,必须具有DROP ANY TABLE 系统权限等。
系统权限一般有三种授予者,一种是sys用户,即数据库管理员,这是最主要的一种授予者,大部分的系统权限管理工作都由sys用户完成。
第二种是具有特权的普通用户,普通用户一旦具有了sysdba或者sysoper特权,也可以管理系统权限。
第三种是被授予了某种系统权限的用户,系统允许它把所拥有的系统权限再授予其他用户。
为用户授予权限的GRANT命令的语法格式为:
GRANT 权限列表 TO 用户列表 WITH ADMIN OPTION;
GRANT命令执行后,所有指定用户都将获得指定的权限。
如果希望把一个权限授予所有用户,可以用PUBLIC代替所有的用户名。
选项“ WITH ADMIN OPTION”的功能是使得权限的获得者可以再将权限授予其他用户。
例如,刚刚创建用户userl 时,这个用户没有任何权限。
如果把CREATE SESSION权限授予这个用户,那么这个用户就可以登录数据库了。
如果再把CREATE TABLE权限授予这个用户,那么他就可以在自己的模式中创建表了。
授予这两个权限的语句为:
GRANT CREATE SESSION, CREATE TABLE TO user1;
用户在登录数据库系统后应该可以创建表了,但是当这个用户在自己的模式中创建表时,
将遇到以下的错误:
ORA-01950: 对表空间 ‘USERS‘ 无权限
出错的原因是当前用户在他的默认表空间中没有空间配额,即没有可以使用的存储空间,所以无法创建表。
这时需要为该用户指定空间配额,或者为这个用户指定UNLIMITED TABLESPACE系统权限。
所以为了使一个用户可以操作数据库,至少应该把上述三个权限授予这个新用户。
例如, 下列的授权语句使得所有用户都可以使用无限制的磁盘空间:
GRANT UNLIMITED TABLESPACE TO PUBLIC;
如果将ALTER USER的系统权限授予某用户,那么它就可以修改其他用户的信息。
现在考察下列权限操作的语句序列 :
CONN / AS SYSDBA
GRANT ALTER USER TO user1;
CONN user1/123
ALTER USER scott IDENTIFIED BY new_tiger;
如果上述语句都执行成功,那么用户scott的口令将被修改为“new_tiger”。
首先以特权用户sys登录,并将系统权限ALTER USER授予用户userl。
然后以用户userl 登录,这个用户就可以修改其他用户的信息了。
回收系统权限的命令是REVOKE ,这条命令一般由SYS 用户执行。
普通用户如果要回收其他用户的权限,则他必须具有“GRANT ANY PRIVILEGE”这个系统权限。
如果一个用户在接受某个系统权限时是以“ WITH ADMIN OPTION ”方式接受的,他随后又将这个系统权限授予了其他用户,那么他也可以将这个系统权限从其他用户回收。
REVOKE的语法格式为:
REVOKE 系统权限列表 FROM 用户列表;
如果要从所有用户回收某个系统权限,可以用PUBLIC代替所有的用户名。
这里的系统权限也是有PUBLIC授予的。
例如,要将刚才授予用户user1的系统权限CREATE SESSION和CREATE TABLE 回收,可以执行下面的REVOKE语句:
REVOKE CREATE SESSION, CREATE TABLE FROM user1;
这样,用户USER1就不能登录数据库,更不能创建表了。
需要注意的是系统权限可以转授,但是回收时不能间接回收。
假设有三个用户,第一个用户将某个系统权限以“WITH ADMIN OPTION”的方式授予第二个用户,第二个用户又将这个权限授予第三个用户,那么当第一个用户从第二个用户回收这个权限时,并不能同时从第三个用户回收这个权限,第三个用户这时仍然具有这个权限。
现在考虑下列权限操作的语句序列:
CONN AS sysdba
GRANT CREATE SESSION,CREATE TABLE TO user1 WITH ADMIN OPTION;
CREATE USER user2 IDENTIFIED BY "1234";
CONN user1/1234
GRANT CREATE SESSION,CREATE TABLE TO user2;
CONN sys/1234 AS sysdba
REVOKE CREATE SESSION,CREATE TABLE FROM user1;
CONN user2/1234
SELECT * FROM user_sys_privs