2009-01-15 81 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