2015-04-17 150 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; 

現在使用腳本連接到「測試」並執行操作。