11.4 PROFILE的管理
PROFILE是一种数据库对象,它的功能是对用户使用口令的情况进行控制,或者对用户消耗系统资源的情况进行控制。在默认情况下,在数据库中对用户使用口令或者消耗资源是没有什么限制的,或者限制很小。
在一个数据库中,可能因为一个用户无意中执行了包含死循环的PL/SQL程序,或者一个带有恶意的用户对一个数百GB的大表进行全表检索,这些行为虽然不能破坏数据,但是会使数据库系统的性能急剧降低。数据库管理员如果及时发现了这种情况,可以强制终止用户会话,然后将带有恶意的用户锁定。例如,下面的三条语句分别用户查询用户的会话信息、强制终止用户会话、锁定用户账号(其中144和7分别为用户会话的sid和serial#):
SQL>SELECT username, sid, serial#FROM v$session WHERE username='SCOTT';
SQL>ALTER SYSTEM KILL SESSION'144,7';
SQL>ALTER USER scott ACCOUNT LOCK;
如果在数据库中创建了PROFILE,通过PROFILE可以采取主动防御的措施,对用户消耗系统资源的情况进行控制,这样就可以避免很多严重后果的产生。
11.4.1 PROFILE的创建与删除
为了能够使用PROFILE,首先需要以system用户的身份执行脚本pupbld.sql。这个脚本位于Oracle安装目录下的sqlplus/admin子目录中。例如:
SQL>@$ORACLE_HOME/sqlplus/admin/pupbld.sql
其中$ORACLE_HOME是对环境变量ORACLE_HOME的引用,它代表Oracle的安装目录。在Windows系统中,应该以下面的方式执行这个脚本:
SQL>@%ORACLE_HOME%\sqlplus\admin\pupbld.sql
在数据库中需要创建PROFILE这种数据库对象,在PROFILE中指定对用户所施加的各种限制,并将这个PROFILE指定给用户,这样用户的口令以及对资源的消耗就会受到限制。PROFILE被创建,可以指定给多个用户。
创建PROFILE的操作一般由SYS用户完成,如果普通用户希望创建PROFILE,需要具有CREATE PROFILE系统权限。创建PROFILE的命令格式为:
CREATE PROFILE profile名称LIMIT
口令限制
资源限制
在创建用户时,可以为其指定PROFILE。对于一个已经存在的用户,也可以为其指定PROFILE。例如:
SQL>CREATE USER user2 identified by"1234"
PROFILE p1;
SQL>ALTER USER scott
PROFILE p1;
为每个用户只能指定一个PROFILE。从数据字典视图dba_users中可以获得为每个用户指定的PROFILE。例如:
SQL>SELECT profile FROM dba_users
WHERE username='SCOTT';
在一个PROFILE中所包含的各种限制可以从数据字典视图dba_profiles中获得。例如,下面的命令用户查询P1对用户使用口令及使用资源进行的限制:
SQL>SELECT resource_name, limit
FROM dba_profiles
WHERE PROFILE='P1';
上述语句的执行结果类似如下:
CPU_PER_CALL 10
LOGICAL_READS_PER_CALL 50
SESSIONS_PER_USER DEFAULT
CPU_PER_SESSION DEFAULT
LOGICAL_READS_PER_SESSION DEFAULT
……
从上述命令的执行结果可以看出,除了明确设置的限制外,PROFILE中所包含的大部分限制都采用了默认值。
删除PROFILE的命令是DROP PROFILE。如果一个PROFILE已经被指定给了某个用户,那么在删除PROFILE需要指定CASCADE关键字。例如:
SQL>DROP PROFILE p1 CASCADE;