----我们假设用户xiaoli在工作中能够对工资表account.paytable(account是表paytable的拥有者)有查询和更新的权限,而这些权限我们不直接授予xiaoli,而是构造一个角色(比如考勤员checkerrole),这个角色恰好适合于xiaoli,再将角色授予xiaoli,但角色在激活时需要口令,该口令不对xiaoli公开。每个用户需要一个缺省的角色,是用户连接到ORACLE时的缺省角色。这个角色只有CONNECT权限,我们假为defaultrole。 
----下面给出具体的操作SQL: 
(1)设定各种角色,及其权限 CREATE ROLE checkerrole IDENTIFIEDBYxm361001; CREATE ROLE defaultrole IDENTIFIEDBYdefaultrole; GRANTSELECT,UPDATEONaccount.paytableTOcheckerrole; GRANTCONNECTTOdefaultrole; (2)创建用户 CREATEUSERxiaoliIDENTIFIEDBYxiaoli; (3)授权 GRANTcheckerroleTOxiaoli; GRANTdefaultroleTOxiaoli; (4)设定用户缺省的角色 ALTERUSERxiaoliDEFAULTROLEdefaultrole; (5)注册过程 CONNECTxiaoli/xiaoli@oracle 此时用户只有其缺省角色的权限。 (6)激活角色 SETROLEcheckerroleIDENTIFIEDBYxm361001; 
----操作成功后,xiaoli拥有checkerrole的权限。 
----这里的角色和口令是固定的,在应用系统中可以由应用管理人员自行设置则更为方便安全。 
----上面给出的是在SQL*PLUS下的操作过程,在实际中还是要与应用系统联系在一起。我们不讨论用户和角色的创建怎样在应用开发语言中的实现过程,在这里给出用户登录时的POWERBUILDER代码,理解了这个例子,前者的实现也不难。 
Transactiongtr_Oracle7 gtr_Oracle7=createTransaction gtr_Oracle7.DBMS="O73" gtr_Oracle7.database="" gtr_Oracle7.UserID=ls_UserID //通过对话框取得的用户标识 gtr_Oracle7.DBPass=ls_Passwd //通过对话框取得的用户口令 gtr_Oracle7.LogID=ls_UserID gtr_Oracle7.LogPass=ls_Passwd gtr_Oracle7.ServerName="@oracle" //在SQL*NET中创建的别名 gtr_Oracle7.DBParm="" ConnectUsinggtr_Oracle7; ifgtr_Orale7.sqlcode=-1then MessageBox("错误","没有注册到数据库系统!") return-1 endif //ls_Role和ls_RolePasswd为从配置文件中 或通过其它途径获得的用户的角色名和口令 ExecuteImmediate"SETROLE"+ls_Role+ "IDENTIFIEDBY"+ls_RolePasswd Usinggtr_Oracle7; Ifgtr_Oracle7.sqlcode<>0then MessageBox("错误","没有激活相应的数据库系统角色!") DisconnectUsinggtr_Oracle7; return-1 Endif Return1//成功注册并激活角色! 
转自 绿盟安全