我正在用C++編寫CGI程序。它應該在2.2版的Apache HTTP Server上運行,並且需要連接到Oracle數據庫10g。無法使用帶有httpd 2.2的C++ CGI連接到Oracle數據庫10g
我試圖運行這個沒有httpd的CGI程序,它可以成功連接到Oracle數據庫,但是一旦我通過httpd服務器運行它,它會在error_log
中寫下以下消息。
錯誤,而試圖檢索錯誤文本ORA-12546
我怎樣才能解決這個問題?
我正在用C++編寫CGI程序。它應該在2.2版的Apache HTTP Server上運行,並且需要連接到Oracle數據庫10g。無法使用帶有httpd 2.2的C++ CGI連接到Oracle數據庫10g
我試圖運行這個沒有httpd的CGI程序,它可以成功連接到Oracle數據庫,但是一旦我通過httpd服務器運行它,它會在error_log
中寫下以下消息。
錯誤,而試圖檢索錯誤文本ORA-12546
我怎樣才能解決這個問題?
這通常意味着您遇到了ORA-12546錯誤,但您的客戶端庫沒有安裝實際的錯誤消息。這不是問題,您可以搜索錯誤號here。在你的情況下,它是「TNS:權限被拒絕」。
您的CGI用戶是否有權限訪問tnsnames.ora?
只是一個猜測,但這種類型的事情的一個常見原因是沒有爲您的CGI程序設置ORACLE_HOME環境。 Apache通常在啓動時啓動,因此會跳過所有/ etc/profile類型的內容。
您將需要確保設置了ORACLE_HOME
,並且根據您的系統設置,您可能還需要更新LD_LIBRARY_PATH
以包含$ORACLE_HOME/lib
。您可能需要您的程序來設置環境,或者在您的apache配置中使用SetEnv
指令。打賭,看看這是否是這個問題只是編寫一個測試CGI,它會轉儲所有的環境變量。
現在,如果CGI在mod_perl
下運行,它有點棘手,因爲mod_perl對於環境安全往往是非常肛門的。認爲我們最終使用Perl * Something * Require指令在perl中設置它。對不起,很模糊,幾年前...
你在運行什麼操作系統?如果是Linux,你有SELinux嗎? (如果是這樣,日誌中的任何可疑內容?)當您以web服務器的帳戶登錄時,是否可以使用sqlplus登錄? – Mat
謝謝Sathya,這是SELinux阻止http服務。我已經根據日誌修復了它 – user966085