【问题标题】:oracle, trying to create a procedure which create a useroracle,试图创建一个创建用户的过程
【发布时间】:2017-12-31 10:20:59
【问题描述】:

我尝试创建这个程序(作为一个系统),它需要 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:在 “SYSTEM.PROCEDURE_CREATE_CLIENT”,第 9 行 ORA-06512:第 1 行 01031. 00000 - “权限不足” *原因:试图更改当前用户名或密码 没有适当的特权。如果出现此错误,也会发生 试图在没有必要操作的情况下安装数据库 系统权限。 在 DBMS MAC 中配置 Trusted Oracle 时,可能会出现此错误 如果用户被授予更高标签的必要特权 比当前登录。 *Action:请求数据库管理员执行操作或授予 所需的权限。 对于受信任的 Oracle 用户,尽管授予了此错误 更高标签的适当特权,询问数据库 管理员重新授予相应标签的权限。

【问题讨论】:

    标签: oracle


    【解决方案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 除了 CREATE SESSION 之外没有任何特权,但这就是你的计划。

    【讨论】:

    • 非常感谢您的回复。编译程序正常工作,没有任何问题。但我有一个小问题:当我尝试执行它时,我收到了错误消息:
    • ORA-06550:第 1 行,第 7 列:PLS-00103:在预期以下情况之一时遇到符号“PROCEDURE”:( begin case declare exit for goto if loop mod null pragma raise return select update while with
    • 你应该准确地发布你运行的内容,就像我一样。盲目猜测:您是否忘记在 PROCEDURE 和 CREATE_CLIENT 之间添加下划线?
    • 看我尝试运行这个:执行过程 procedure_create_client('test', 'test123');
    • 删除第一个 PROCEDURE 字
    【解决方案2】:

    该错误告诉您,您打算运行脚本的用户无权更改当前用户的用户名和密码。如果当前用户的用户名被传递给该过程,那么问题是您没有被授予必要的权限来更改您自己的用户名或密码。如果您尝试创建另一个用户,则错误消息似乎有问题,但您仍然有权限问题。您需要检查您的权限,并根据创建用户所需的权限检查它们。

    【讨论】:

    • 解决方案是什么?如果我想授予用户“创建用户”的权限?
    • @user9152856 您的用户需要具有创建用户系统权限。
    【解决方案3】:

    缺少的权限很可能是因为您是通过 ROLE 授予的。在 PL/SQL 块中,您只有直接应用的权限。您必须使用grant create user to...。授予角色(例如 grant DBA to... 在过程中无效。

    【讨论】:

      猜你喜欢
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多