2009-01-15 75 views
2

我想通過使用客戶端Javascript中的OPENROWSET的SQL Server訪問大的Oracle數據庫,並沒有太多的運氣。以下是詳細信息:使用OPENROWSET通過SQL Server訪問Oracle數據庫

  • 使用OPENROWSET訪問Oracle數據庫的SQL Server視圖完美工作,所以我知道我有有效的連接字符串參數。但是,新的要求是針對依賴於客戶端選擇的非常動態的Oracle查詢,並且我無法通過SQL Server視圖或存儲過程獲得動態(甚至參數化)的Oracle查詢。
  • 對SQL Server數據庫的客戶端訪問完全適用於動態和參數化查詢。
  • 我不能指望擁有任何Oracle客戶端軟件的客戶端。因此,訪問Oracle數據庫必須通過SQL Server數據庫,使用視圖,存儲過程或使用OPENROWSET的動態查詢。
  • 由於SQL Server數據庫位於共享服務器上,因此我不允許使用全局鏈接的數據庫。

我的想法是定義一個將採取我自己的一個參數化的Oracle查詢的版本,使參數替換,在OPENROWSET包裹查詢,在SQL Server中執行它,返回結果記錄功能。下面是示例代碼:

// db is a global variable containing an ADODB.Connection opened to the SQL Server DB 
// rs is a global variable containing an ADODB.Recordset 
. . . 
ss = "SELECT myfield FROM mytable WHERE {param0} ORDER BY myfield;"; 
OracleQuery(ss,["somefield='" + somevalue + "'"]); 
. . . 
function OracleQuery(sql,params) { 
    var s = sql; 
    var i; 
    for (i = 0; i < params.length; i++) s = s.replace("{param" + i + "}",params[i]); 
    var e = "SELECT * FROM OPENROWSET('MSDAORA','(connect-string-values)';" 
    + "'user';'pass','" + s.split("'").join("''") + "') q"; 
    try { 
    rs.Open("EXEC ('" + e.split("'").join("''") + "')",db); 
    } catch (eobj) { 
    alert("SQL ERROR: " + eobj.description + "\nSQL: " + e); 
    } 
} 

是我得到的SQL錯誤Ad hoc access to OLE DB provider 'MSDAORA' has been denied. You must access this provider through a linked server.這是沒有意義的我。微軟對此錯誤的解釋涉及註冊表設置(DisallowAdhocAccess)。這是在我的電腦上正確設置的,但是這肯定涉及到數據庫服務器而不是客戶端PC,並且我期望這個設置是正確的,因爲上面提到的視圖可以工作。我已經試過

一種替代方法是消除打開語句封閉EXEC:

rs.Open(e,db); 

但這生成相同的錯誤。

我也嘗試將OPENROWSET放入存儲過程中。這從SQL Server Management Studio中執行時完美工作,但在從Javascript調用存儲過程時失敗並顯示相同的錯誤消息。

是我想要做的可能嗎?如果是這樣,你能推薦如何解決我的代碼?或者是一種完全不同的方法嗎?

任何提示或相關信息將受到歡迎。提前致謝。

回答

1

我正在回答這個問題。我找到了答案,我對結果不滿意。已經運行的功能正在我的個人用戶標識下運行,並且我擁有db-owner權限。對於特設的訪問權限,我需要將DisallowAdhocAccess註冊表設置設置爲0,或者爲Web訪問中使用的用戶標識授予db-owner權限。因爲這是一個安全性很高的共享服務器,我不會允許更改註冊表設置,這會比我的數據庫影響更多。我認爲第二種選擇同樣危險。

因此,我顯然一直強迫用戶安裝Oracle Instant Client,以便直接在客戶端JavaScript中打開與Oracle數據庫的ADO連接。

我仍然歡迎任何其他想法。

0

打開客戶端ADO連接到數據庫是一個巨大的安全禁止否。你基本上是給用戶連接證書給你的數據庫,並且讓他們在你的數據庫安全中找到一個漏洞。即使您的受衆是貴公司的內部人員,也可能會遇到未安裝Oracle驅動程序(或舊版本)的問題。爲什麼不直接隱藏JSON調用後的Oracle查詢?通過這種方式,您可以在服務器端對數據庫輸入進行清理,並且您的用戶從不以純文本方式接收數據庫連接憑證。

+0

我同意。如果我可以讓查詢在服務器端工作,我會這樣做。問題在於,由於OPENROWSET語法的限制,我無法讓查詢在服務器上工作。 – 2009-04-10 14:59:47