【问题标题】:How to create an create user in Oracle using Execute Immediate?如何使用立即执行在 Oracle 中创建创建用户?
【发布时间】:2021-01-01 11:29:27
【问题描述】:

我的数据库是 XE 18。我的用户有创建用户,我可以在 SQL Plus 中创建一个用户,使用这个:

ALTER SESSION SET "_ORACLE_SCRIPT" = true;
CREATE USER auxiliar IDENTIFIED BY auxiliar2020 ;

然后我创建一个包,其中包含一个应该动态创建用户的功能,上面的行是:

EXECUTE IMMEDIATE 'alter session set "_ORACLE_SCRIPT"=true';
vSql := 'CREATE USER :1 IDENTIFIED BY ":2" ' ;
EXECUTE IMMEDIATE vSql USING vNome_Usuario,vSenha_Usuario;

我收到此错误:

错误的关系 -
ORA-65096: nome de atribuição ou de usuário comum inválido
ORA-06512: em "TOKEN.PRC_CRIA_USUARIO",第 3 行
ORA-06512: 第 3 行
65096. 00000 - “无效的普通用户或角色名称”
*原因:尝试使用对普通用户或角色无效的名称创建普通用户或角色。除了用户名和角色名的常规规则外,普通用户名和角色名只能由 ASCII 字符组成,并且必须包含 common_user_prefix 参数中指定的前缀。
*操作:指定一个有效的普通用户或角色名称。

【问题讨论】:

  • 显然您在容器数据库中执行了代码,使用了无效的用户名。确保您在正确的数据库中执行代码(应用程序代码应始终位于可插入数据库中,而不是容器中),并且您遵循创建用户的数据库的规则。默认情况下,在容器数据库中创建的用户(即普通用户)的名称必须以“C##”前缀开头。
  • “创建用户”不仅仅适用于立即执行,如果我把它放在 sql 上加上我可以在没有 C## 的情况下创建用户:alter session set "_ORACLE_SCRIPT"=true; / CREATE USER usuariostackoverflow IDENTIFIED BY auxiliar2020 ; /

标签: oracle plsql ddl oracle18c execute-immediate


【解决方案1】:

在这种情况下你不能使用绑定变量,

你可以试试吗,

DECLARE
  in_user     VARCHAR2(30) := 'some_user';
  in_password VARCHAR2(9)  := 'changeMe';
BEGIN
  EXECUTE IMMEDIATE 'CREATE USER '||in_user||' IDENTIFIED BY '||in_password;
  EXECUTE IMMEDIATE 'GRANT CREATE SESSION TO '||in_user;
END;
/

【讨论】:

  • 我没有比 AskTom 更好的解释了,这里有一个链接,它准确地告诉我们何时何地可以使用 bind variables asktom.oracle.com/pls/asktom/…
  • 我创建了一个没有绑定的 proc 来测试创建或替换 NONEDITIONABLE PROCEDURE PRC_CRIA_USUARIO is BEGIN EXECUTE IMMEDIATE 'CREATE USER JOAOZINHO IDENTIFIED BY "ASDEWWEFFDS" ';结尾;如果我在 pl/sql 块中立即执行它可以工作,但是当我将执行立即放在我的 proc 上时,不工作。当我调用此过程时,我收到此错误: Erro a partir da linha : 25 no comando - BEGIN token.PRC_CRIA_USUARIO();结尾;错误相关 - ORA-01031: privilégios insuficientes ORA-06512: em "TOKEN.PRC_CRIA_USUARIO", line 3 ORA-06512: em 01031. 00000 - "insufficientprivilege"
  • 我有授权,我在 pl/SQL 块中使用 EXECUTE IMMEDIATE 创建这个用户
  • 这是一个典型的问题,你会在 SO 上找到很多答案。您应该使用syssystem 来执行任何类型的管理操作。但是,如果您尝试通过登录另一个普通用户来创建用户,您可能会通过角色获得授权,但要在 PLSQL 中执行类似“创建用户...”之类的操作,您需要将 grant create user ... 直接发送给用户您已登录 ....
猜你喜欢
  • 2018-01-30
  • 2018-02-27
  • 2020-12-16
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 1970-01-01
相关资源
最近更新 更多