保持SYSDBA连接在C++中打开
问题:我试图以“SYSDBA”连接,然后在我的C++应用程序中创建一个用户。在运行create命令之前,与SYSDBA的连接似乎关闭。保持SYSDBA连接在C++中打开
我试图运行下面的两个命令:
CONNECT sys/<syspassword>@<datasource> AS SYSDBA
CREATE USER "<username>" PROFILE "DEFAULT" IDENTIFIED BY "<userpassword>" ACCOUNT UNLOCK
如果我想强调并运行在Oracle SQL Developer中的两个命令,一切工作正常,并且用户被建造。连接被自动关闭,我收到一条消息,如:
Connected
user "KYLE" created.
Connection created by CONNECT script command disconnected
当我从我的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 Error: ORA-01031: "insufficient privileges"
另外,如果我尝试运行一个一次在Oracle SQL Developer中执行命令,我会得到相同的消息。这导致我认为我的连接提前关闭。有没有办法让我的连接打开足够长的时间来运行CREATE USER
命令?
多小时的研究后,我已经找到一种方法来解决我原来的问题:
我试图连接为“SYSDBA”,然后在我的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);
我相信纯粹的ODBC连接不支持Oracle连接字符串的“AS SYSDBA”选项。
解决方案是让它们连接到具有所需特定权限的用户(在您的示例中创建任何用户),并且“as sysdba”问题会自行处理。
虽然这不是我寻找的答案(看看我的解决方案),但我不想浪费声誉。你确实给了一个可能的解决方案,谢谢。 –
您可以使用一个伪用户,该用户拥有授予其dba权限并从您的脚本连接到该用户的伪用户。由于新用户也将具有管理员权限,因此您可以创建其他用户或您希望完成的任何其他任务。
create user test identified by password ;
grant dba to test with admin option;
现在使用脚本连接到“测试”并执行操作。
如果更改命令的东西无害像双选1发生了什么; ? – kevinsky
我正在执行SQL命令的方式之前已经完美工作了几十次。但是,现在我必须以SYSDBA方式连接,出现问题。 select语句正常工作,因为您不需要SYSDBA权限。谢谢。 –