在 C++ 中保持 SYSDBA 连接打开
Keeping SYSDBA connection open in C++
问题: 我正在尝试以“SYSDBA”身份连接,然后在我的 C++ 应用程序中创建一个用户。与 SYSDBA 的连接似乎在 运行 执行创建命令之前关闭。
我正在尝试 运行 以下两个命令:
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
命令?
我认为纯 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);
问题: 我正在尝试以“SYSDBA”身份连接,然后在我的 C++ 应用程序中创建一个用户。与 SYSDBA 的连接似乎在 运行 执行创建命令之前关闭。
我正在尝试 运行 以下两个命令:
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
命令?
我认为纯 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);