Сохранение соединения SYSDBA открытым в переполнении стека

Проблема: Я пытаюсь подключиться как «SYSDBA», а затем создать пользователя в моем приложении C ++. Соединение с SYSDBA закрывается перед выполнением команды create.

Я пытаюсь запустить следующие две команды:

  1. CONNECT sys/<syspassword>@<datasource> AS SYSDBA
  2. CREATE USER "<username>" PROFILE "DEFAULT" IDENTIFIED BY "<userpassword>" ACCOUNT UNLOCK

Если я выделю и выполню две команды в Oracle SQL Developer, все будет отлично, и пользователь будет создан. Соединение закрывается автоматически, и я получаю сообщение вроде:

Связано

Пользователь «KYLE» создан.

Соединение, созданное командой сценария CONNECT, разорвано

Когда я запускаю команды из своего приложения C ++, кажется, что соединение закрывается до запуска команды # 2.

Это код, который я использую для вызова команд:

strcpy(szProcName,"CONNECT sys/");
strcat(szProcName,Sys_Password);
strcat(szProcName,"@");
strcat(szProcName,info.szServerName);
strcat(szProcName," AS SYSDBA");
rc=SQLPrepare(sqlc.g_hstmt,(SQLCHAR*)szProcName,(SQLINTEGER)strlen(szProcName));
rc = SQLExecute(sqlc.g_hstmt);

strcpy(szProcName,"CREATE USER \"");
strcat(szProcName,userName);
strcat(szProcName,"\" PROFILE \"DEFAULT\" IDENTIFIED BY \"");
strcat(szProcName,Password);
strcat(szProcName,"\" ACCOUNT UNLOCK;");
rc=SQLPrepare(sqlc.g_hstmt,(SQLCHAR*)szProcName,(SQLINTEGER)strlen(szProcName));
rc = SQLExecute(sqlc.g_hstmt);

Когда команды запускаются в C ++, я получаю ошибку SQL:

Ошибка SQL: ORA-01031: «недостаточно прав»

Кроме того, если я пытаюсь запустить одну команду за раз в Oracle SQL Developer, я получаю то же сообщение. Это заставляет меня думать, что моя связь закрывается рано. Есть ли способ держать мое соединение открытым достаточно долго, чтобы запустить CREATE USER команда?

2

Решение

Чистые ODBC-соединения, я считаю, не поддерживают опцию «AS SYSDBA» для строк соединения Oracle.

Решение состоит в том, чтобы они подключались к пользователю, у которого есть конкретные привилегии, которые вам нужны (CREATE ANY USER в вашем примере), и проблема «as sysdba» решает сама себя.

1

Другие решения

Вы можете использовать псевдо-пользователя, которому предоставлены привилегии dba, и подключиться к этому пользователю из вашего скрипта. Поскольку новый пользователь также будет иметь права администратора, вы сможете создавать других пользователей или любые другие задачи, которые вы хотите выполнить.

create user test identified by password ;
grant dba to test with admin option;

Теперь подключитесь к «тесту» с помощью вашего скрипта и выполните ваши действия.

1

После многих часов исследований я нашел способ решить мою первоначальную проблему:

Я пытаюсь подключиться как «SYSDBA», а затем создать пользователя в моем приложении C ++. Соединение с SYSDBA закрывается перед выполнением команды create.

Вместо того, чтобы запускать две команды по отдельности, я использую канал для выполнения команд sqlplus в командной строке.

  • @echo CREATE USER "<username>" PROFILE "DEFAULT" IDENTIFIED BY "<userpassword>" ACCOUNT UNLOCK; | CONNECT sys/<syspassword>@<datasource> AS SYSDBA

Команда вызывается с кодом C ++ следующим образом:

strcpy(szProcName,"@echo CREATE USER \"");
strcat(szProcName,userName);
strcat(szProcName,"\" PROFILE \"DEFAULT\" IDENTIFIED BY \"");
strcat(szProcName,Password);
strcat(szProcName,"\" ACCOUNT UNLOCK; | sqlplus sys/");
strcat(szProcName,Sys_Password);
strcat(szProcName,"@");
strcat(szProcName,info.szServerName);
strcat(szProcName," AS SYSDBA");

system(szProcName);
1
По вопросам рекламы [email protected]