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

Keeping SYSDBA connection open in C++

问题: 我正在尝试以“SYSDBA”身份连接,然后在我的 C++ 应用程序中创建一个用户。与 SYSDBA 的连接似乎在 运行 执行创建命令之前关闭。

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

  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 命令?

我认为纯 ODBC 连接不支持 Oracle 连接字符串的 "AS SYSDBA" 选项。

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

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

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

现在使用您的脚本连接到 "test" 并执行您的操作。

经过几个小时的研究,我找到了解决我原来问题的方法:

我正在尝试以 "SYSDBA" 身份连接,然后在我的 C++ 应用程序中创建一个用户。与 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);