在C ++中保持SYSDBA连接打开

时间:2015-04-17 14:34:08

标签: c++ sql oracle oracle11g sysdba

问题:我尝试连接为“SYSDBA”,然后在我的C ++应用程序中创建用户。在运行create命令之前,与SYSDBA的连接似乎已关闭。

我正在尝试运行以下两个命令:

  1. CONNECT sys/<syspassword>@<datasource> AS SYSDBA
  2. CREATE USER "<username>" PROFILE "DEFAULT" IDENTIFIED BY "<userpassword>" ACCOUNT UNLOCK
  3. 如果我在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命令?

3 个答案:

答案 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);