2015-04-17 83 views
2

问题:我试图以“SYSDBA”连接,然后在我的C++应用程序中创建一个用户。在运行create命令之前,与SYSDBA的连接似乎关闭。保持SYSDBA连接在C++中打开

我试图运行下面的两个命令:

  1. CONNECT sys/<syspassword>@<datasource> AS SYSDBA
  2. 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命令?

+0

如果更改命令的东西无害像双选1发生了什么; ? – kevinsky

+0

我正在执行SQL命令的方式之前已经完美工作了几十次。但是,现在我必须以SYSDBA方式连接,出现问题。 select语句正常工作,因为您不需要SYSDBA权限。谢谢。 –

回答

1

多小时的研究后,我已经找到一种方法来解决我原来的问题:

我试图连接为“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); 
1

我相信纯粹的ODBC连接不支持Oracle连接字符串的“AS SYSDBA”选项。

解决方案是让它们连接到具有所需特定权限的用户(在您的示例中创建任何用户),并且“as sysdba”问题会自行处理。

+0

虽然这不是我寻找的答案(看看我的解决方案),但我不想浪费声誉。你确实给了一个可能的解决方案,谢谢。 –

1

您可以使用一个伪用户,该用户拥有授予其dba权限并从您的脚本连接到该用户的伪用户。由于新用户也将具有管理员权限,因此您可以创建其他用户或您希望完成的任何其他任务。

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

现在使用脚本连接到“测试”并执行操作。