今天台湾同事说执行一个脚本时出错,脚本出错的2个命令是:
GRANT ADMINISTER RESOURCE MANAGER TO DM_ADMIN;
GRANT EXECUTE ON SYS.SYS_GROUP TO DM_ADMIN;
先处理第一个:
1.报错信息:
ERROR at line 1:
ORA-00990: missing or invalid privilege
解决:
先执行:select * from dba_sys_privs where privilege like 'ADMINISTER%';结果如下:
GRANTEE PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
DBA ADMINISTER DATABASE TRIGGER YES
DBA ADMINISTER RESOURCE MANAGER YES
看来是DBA角色拥有这个权限。于是用sys用户登陆到数据库(工具是TOAD),然后到选择用户的role,sys用户拥有许多的role,于是选dba,看右边窗口的scripts,第一行就是以下内容:
BEGIN
SYS.DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SYSTEM_PRIVILEGE
(GRANTEE_NAME => 'DBA',
PRIVILEGE_NAME => 'ADMINISTER_RESOURCE_MANAGER',
ADMIN_OPTION => TRUE);
END;
/
我把用户名更改一下就可以了。
接着处理第二个,第二个问题先到google上搜了一圈,发现还是要到metalink上找答案。
答案是这样的:
| Bookmark | Go to End |
| Subject: | Grant Execute on SYS.SYS_GROUP Fails with ORA-4042 | |||
| Doc ID: | Note:161011.1 | Type: | PROBLEM | |
| Last Revision Date: | 23-JUN-2002 | Status: | PUBLISHED | |
- fact: Oracle Server - Enterprise Edition
- symptom: Grant Execute on SYS.SYS_GROUP Errors
- symptom: ORA-04042: procedure, function, package, or package body does not exist
- cause: Bug 1190886 Can't grant execute on SYS.SYS_GROUP to other user by sys. The bug states that it is not a bug in RDBMS: SYS_GROUP is a resource manager consumer group. GRANT and REVOKE do not operate on objects of this type (i.e. consumer groups) and aren't meant to.
. 猛一看没看懂,只能静下心来看,这些鬼东西估计也跟第一个错误一样,调个包的过程,然后传点参数而已。这段文字中,说道:call in dbms_resource_manager_privs,那应该就是这个包,再看最后:GRANT_SWITCH_CONSUMER_GROUP in the
same package,就是说要掉这个包的存储过程。
于是到sys用户(同样用toad工具),登陆后选sys用户的的proc这个选项,看到了dbms_resource_manager_privs这个包,同样点右边窗口的script,看到了 PROCEDURE grant_switch_consumer_group(grantee_name IN VARCHAR2, consumer_group IN VARCHAR2,grant_option IN BOOLEAN);这个存储过程的定义。也就是说,我可以执行这个存储过程。快ok了。
剩下的就是传参数了,第一个是找权限授予者,没问题,大写写用户名就ok,后面一个是consumer_group,看到这个参数还真想了一下,感觉应该是sys_group,再看文章,其中有一句:SYS_GROUP is a resource manager consumer group.就知道自己的估计是对的。最后一个参数自然是写true。
执行,都ok了。
[@more@]