问题:我尝试连接为“SYSDBA”,然后在我的C ++应用程序中创建用户。在运行create命令之前,与SYSDBA的连接似乎已关闭。
我正在尝试运行以下两个命令:
CONNECT sys/<syspassword>@<datasource> AS SYSDBA
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
命令?
答案 0 :(得分:1)
我认为,纯粹的ODBC连接不支持&#34; AS SYSDBA&#34; Oracle连接字符串的选项。
解决方案是让他们连接到具有您需要的特定权限的用户(在您的示例中创建任何用户),以及&#34; as sysdba&#34;问题照顾好自己。
答案 1 :(得分:1)
您可以使用具有dba权限的伪用户,并从脚本连接到该用户。由于新用户还具有管理员权限,因此您可以创建其他用户或您希望完成的任何其他任务。
create user test identified by password ;
grant dba to test with admin option;
现在连接到&#34;测试&#34;使用您的脚本并执行您的操作。
答案 2 :(得分:1)
经过数小时的研究,我找到了解决原问题的方法:
我正在尝试连接#34; SYSDBA&#34;然后在我的C ++应用程序中创建一个用户。在运行create命令之前,与SYSDBA的连接似乎已关闭。
我没有单独运行这两个命令,而是使用管道在命令行中执行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);