我尝试创建此过程(作为系统),它采用2个参数, 用户名和密码,并根据它们创建用户:
create or replace procedure procedure_create_client
( user_name IN varchar2 , u_password IN varchar2 ) IS
tmp_query varchar(150);
user_name_upper varchar(30) := UPPER(user_name) ;
BEGIN
tmp_query := 'create user C##' || user_name_upper || ' identified by ' || u_password ;
EXECUTE IMMEDIATE ( tmp_query );
tmp_query := 'grant create session to ' || user_name_upper ;
EXECUTE IMMEDIATE ( tmp_query );
END ;
问题是,当我尝试执行此过程(作为系统)时, 我收到了这个错误:
错误报告:ORA-01031:权限不足ORA-06512:at " SYSTEM.PROCEDURE_CREATE_CLIENT",第9行ORA-06512:第1行 01031. 00000 - "特权不足" *原因:尝试更改当前用户名或密码 没有适当的特权。如果,也会发生此错误 尝试在没有必要操作的情况下安装数据库 系统权限。 在DBMS MAC中配置Trusted Oracle时,可能会发生此错误 如果用户被授予更高标签的必要权限 比当前登录。 *操作:请数据库管理员执行操作或授予 所需的特权。 对于受信任的Oracle用户,尽管获得了此错 更高标签的适当权限,询问数据库 管理员在适当的标签处重新授予权限。
答案 0 :(得分:1)
该错误告诉您打算运行脚本的用户无权更改当前用户的用户名和密码。如果将当前用户的用户名传递给该过程,则问题在于您未被授予更改自己的用户名或密码所需的权限。如果您尝试创建另一个用户,则错误消息似乎有问题,但您仍然存在权限问题。您需要检查您的权限,并根据创建用户所需的权限进行检查。
答案 1 :(得分:1)
考虑为数据库维护以外的任务避免使用SYS(和SYSTEM);也许您宁愿创建自己的用户,让我们称之为MYDBA并授予其DBA角色。
我在下面的示例中做了类似的事情:我创建了一个新用户SCOTT,并且只授予它创建其他用户的权限。 GRANT CREATE SESSION有额外的WITH ADMIN OPTION,否则SCOTT将无法通过程序向其创建的用户授予CREATE SESSION。
SQL> show user
USER is "SYS"
SQL> create user scott identified by tiger quota unlimited on users;
User created.
SQL> grant create session to scott with admin option;
Grant succeeded.
SQL> grant create procedure to scott;
Grant succeeded.
SQL> grant create user to scott;
Grant succeeded.
SQL>
现在,作为新创建的SCOTT用户连接,创建一个过程(复制/粘贴代码,在第10行添加“C ##”)并执行它以创建另一个用户,MIKE:
SQL> connect scott/tiger@xe
Connected.
SQL>
SQL> create or replace procedure procedure_create_client
2 (user_name IN varchar2 , u_password IN varchar2 )
3 IS
4 tmp_query varchar(150);
5 user_name_upper varchar(30) := UPPER(user_name) ;
6 BEGIN
7 tmp_query := 'create user C##' || user_name_upper || ' identified by ' || u_password;
8 EXECUTE IMMEDIATE ( tmp_query );
9
10 tmp_query := 'grant create session to C##' || user_name_upper ;
11 EXECUTE IMMEDIATE ( tmp_query );
12 END;
13 /
Procedure created.
SQL>
SQL> exec procedure_create_client('mike', 'lion');
PL/SQL procedure successfully completed.
SQL>
精细;似乎创建了C ##。我们联系:
SQL> connect c##mike/lion@xe
Connected.
SQL>
看起来没事,不是吗?虽然,可怜的C ## mike没有任何特权,但创建会话,但这就是你为它计划的。
答案 2 :(得分:1)
很可能缺少的权限是因为您通过ROLE授予它。在PL / SQL块中,您只具有直接应用的权限。您必须使用grant create user to...
。授予角色(例如grant DBA to...
在此过程中无效。