2

問題:「SYSDBA」として接続し、C++ アプリケーションでユーザーを作成しようとしています。create コマンドを実行する前に、SYSDBA への接続が閉じているようです。

次の2つのコマンドを実行しようとしています:

  1. CONNECT sys/<syspassword>@<datasource> AS SYSDBA
  2. CREATE USER "<username>" PROFILE "DEFAULT" IDENTIFIED BY "<userpassword>" ACCOUNT UNLOCK

Oracle SQL Developer で 2 つのコマンドを強調表示して実行すると、すべてが正常に機能し、ユーザーが作成されます。接続は自動的に閉じられ、次のようなメッセージが表示されます。

接続済み

ユーザー「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 で一度に 1 つのコマンドを実行しようとすると、同じメッセージが表示されます。これにより、接続が早期に閉じられていると思います。CREATE USERコマンドを実行するのに十分な時間、接続を開いたままにしておく方法はありますか?

4

3 に答える 3

1

何時間もの調査の結果、元の問題を解決する方法を見つけました。

「SYSDBA」として接続し、C++ アプリケーションでユーザーを作成しようとしています。create コマンドを実行する前に、SYSDBA への接続が閉じているようです。

2 つのコマンドを個別に実行する代わりに、パイプを使用してコマンド ラインで 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);
于 2015-04-21T13:33:33.180 に答える
1

dba 権限が付与された疑似ユーザーを使用して、スクリプトからそのユーザーに接続できます。新しいユーザーには管理者権限も付与されるため、他のユーザーを作成したり、達成したいその他のタスクを作成したりできます。

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

スクリプトを使用して「test」に接続し、操作を実行します。

于 2015-04-21T01:20:45.417 に答える
1

純粋な ODBC 接続は、Oracle 接続文字列の「AS SYSDBA」オプションをサポートしていないと思います。

解決策は、必要な特定の特権を持つユーザーに接続することです (例では CREATE ANY USER )。「sysdba として」の問題は自動的に処理されます。

于 2015-04-20T19:48:42.090 に答える