Oracle在启用用户的角色时,最多允许启用148个。



其实这个限制比较奇怪,因为148与2的幂相差较大,不知道Oracle出于什么原因确定的这个值:

SQL> CREATE USER U_ROLE IDENTIFIED BY U_PASSWORD;

用户已创建。

SQL> GRANT CREATE ROLE TO U_ROLE;

授权成功。

SQL> GRANT CREATE SESSION TO U_ROLE;

授权成功。

SQL> CONN U_ROLE/U_PASSWORD

已连接。

SQL> BEGIN

 2  FOR I IN 1..148 LOOP

 3  EXECUTE IMMEDIATE 'CREATE ROLE R_' || I;

 4  END LOOP;

 5  END;

 6  /

PL/SQL过程已成功完成。

SQL> SELECT * FROM SESSION_ROLES;

未选定行

SQL> CONN U_ROLE/U_PASSWORD

已连接。

SQL> SELECT COUNT(*) FROM SESSION_ROLES;

 COUNT(*)

----------

      148

SQL> CREATE ROLE R_149;

角色已创建。

SQL>CONNU_ROLE/U_PASSWORD

ERROR:

ORA-28031: maximum of 148 enabled roles exceeded


警告:您不再连接到ORACLE。

由于角色的启用是在会话登陆时确定,因此创建完148个角色后,从SESSION_ROLES中查询不到记录。而创建了第149个角色,当再次登陆的时候,Oracle报错。

SQL> CONN / AS SYSDBA

已连接。

SQL> DROP ROLE R_149;

角色已删除。

SQL> CONN U_ROLE/U_PASSWORD

已连接。

SQL> CREATE ROLE R_149;

角色已创建。

SQL> SET ROLE ALL;

SET ROLE ALL

*

第1行出现错误:

ORA-28031:超出启用角色的最大数148

需要注意,授权角色总数限制包括直接授权的角色和授权给角色的角色的数量:

SQL> DROP ROLE R_149;

角色已删除。

SQL> DROP ROLE R_148;

角色已删除。

SQL> CONN / AS SYSDBA

已连接。

SQL> CREATE ROLE R_148;

角色已创建。

SQL> GRANT R_148 TO U_ROLE;

授权成功。

SQL> CONN U_ROLE/U_PASSWORD

已连接。

SQL> CONN / AS SYSDBA

已连接。

SQL> CREATE ROLE R_149;

角色已创建。

SQL> GRANT R_149 TO R_148;

授权成功。

SQL>CONNU_ROLE/U_PASSWORD

ERROR:

ORA-28031: maximum of 148 enabled roles exceeded


警告:您不再连接到ORACLE。


oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html