Как создать пользователя в Oracle с помощью Execute Immediate?

Моя база данных - 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: em строка 3
65096. 00000 - недопустимое имя обычного пользователя или роли
* Причина: Была сделана попытка создать обычного пользователя или роль с именем, недопустимым для обычных пользователей или ролей. Помимо обычных правил для имен пользователей и ролей, общие имена пользователей и ролей должны состоять только из символов ASCII и должны содержать префикс, указанный в параметре common_user_prefix.
* Действие: укажите допустимое общее имя пользователя или роли.


person Arlen Andrade    schedule 14.09.2020    source источник
comment
По-видимому, вы выполнили свой код в базе данных контейнера, используя недопустимое имя пользователя. Убедитесь, что вы выполняете свой код в правильной БД (код приложения всегда должен находиться в подключаемой БД, а не в контейнере), и что вы соблюдаете правила для базы данных, в которой вы создаете пользователя. Пользователи, созданные в БД контейнера (то есть обычные пользователи), по умолчанию должны иметь имена, начинающиеся с префикса C ##.   -  person pmdba    schedule 14.09.2020
comment
«Создать пользователя» не работает только с немедленным выполнением, если я помещу его в sql, плюс я могу создать пользователя без C ##: alter session set _ORACLE_SCRIPT = true; / СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ usuariostackoverflow, ОПРЕДЕЛЕННЫЙ auxiliar2020; /   -  person Arlen Andrade    schedule 14.09.2020


Ответы (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;
/
person Sujitmohanty30    schedule 14.09.2020
comment
Я не мог бы объяснить лучше, чем AskTom, вот ссылка, которая точно сообщает, когда и где мы можем использовать bind variables asktom.oracle.com/pls/asktom/ - person Sujitmohanty30; 14.09.2020
comment
Я создал процедуру без привязок, чтобы протестировать создание или замену НЕредактируемой процедуры PRC_CRIA_USUARIO iS BEGIN EXECUTE IMMEDIATE 'CREATE USER JOAOZINHO IDENTIFIED BY ASDEWWEFFDS'; КОНЕЦ; Если я выполняю немедленно в блоке pl / sql, это работает, но когда я немедленно выполняю выполнение в моем процессе, это не работает. Когда я вызываю эту процедуру, я получаю следующую ошибку: Erro a partir da linha: 25 no comando - BEGIN token.PRC_CRIA_USUARIO (); КОНЕЦ; Relatório de erros - ORA-01031: privilégios insuficientes ORA-06512: em TOKEN.PRC_CRIA_USUARIO, строка 3 ORA-06512: em 01031. 00000 - недостаточные привилегии - person Arlen Andrade; 14.09.2020
comment
И у меня есть гранты, я создаю этого пользователя, используя EXECUTE IMMEDIATE в блоке pl / SQL - person Arlen Andrade; 14.09.2020
comment
Это типичная проблема, на которую вы найдете много ответов на SO. Вы должны использовать sys или system для выполнения любых административных операций. Однако, если вы пытаетесь создать пользователя, войдя в систему под другим обычным пользователем, у вас могут быть права доступа через роль, но для выполнения чего-то вроде `create user ...` в PLSQL вам необходимо иметь grant create user ... непосредственно для пользователя, которым вы являетесь. вошли в .... - person Sujitmohanty30; 14.09.2020
comment
См. Эту dba.stackexchange.com/questions/158079/ - person Sujitmohanty30; 14.09.2020