Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用OPENROWSET通过SQL Server访问Oracle数据库_Javascript_Sql Server_Oracle_Openrowset - Fatal编程技术网

Javascript 使用OPENROWSET通过SQL Server访问Oracle数据库

Javascript 使用OPENROWSET通过SQL Server访问Oracle数据库,javascript,sql-server,oracle,openrowset,Javascript,Sql Server,Oracle,Openrowset,我正在尝试使用客户端Javascript中的OPENROWSET通过SQL Server访问大型Oracle数据库,但运气不太好。详情如下: 使用OPENROWSET访问Oracle数据库的SQL Server视图工作得非常好,因此我知道我有有效的连接字符串参数。然而,新的需求是针对依赖于客户端选择的非常动态的Oracle查询,我还无法从SQL Server视图或存储过程中获得动态(甚至参数化)Oracle查询 客户端对SQL Server数据库的访问与动态和参数化查询完美结合 我不能指望客户

我正在尝试使用客户端Javascript中的OPENROWSET通过SQL Server访问大型Oracle数据库,但运气不太好。详情如下:

  • 使用OPENROWSET访问Oracle数据库的SQL Server视图工作得非常好,因此我知道我有有效的连接字符串参数。然而,新的需求是针对依赖于客户端选择的非常动态的Oracle查询,我还无法从SQL Server视图或存储过程中获得动态(甚至参数化)Oracle查询
  • 客户端对SQL Server数据库的访问与动态和参数化查询完美结合
  • 我不能指望客户拥有任何Oracle客户机软件。因此,必须通过SQL Server数据库,使用视图、存储过程或使用OPENROWSET的动态查询来访问Oracle数据库
  • 因为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);
  }
}
但这会产生同样的错误

我还尝试将OPENROWSET放入存储过程中。当从SQLServerManagementStudio中执行时,此操作非常有效,但当从Javascript调用存储过程时,会出现相同的错误消息

我想做的事可能吗?如果是的话,你能推荐如何修复我的代码吗?还是有必要采取完全不同的方法


欢迎提供任何提示或相关信息。提前谢谢。

我自己来回答这个问题。我找到了答案,但我对结果不满意。已经运行的函数正在我的个人用户id下运行,我拥有db所有者权限。要使临时访问正常工作,我需要将
disallowdhocaccess
注册表设置设置为0,或者为web访问中使用的用户id授予db所有者权限。因为这是一个安全性很强的共享服务器,所以不允许我更改注册表设置,这将影响到比数据库更大的内容。我认为第二种选择同样危险。

因此,我显然一直在强迫用户安装Oracle Instant Client,这样我就可以在客户端Javascript中直接打开到Oracle数据库的ADO连接


我仍然欢迎对此有任何其他想法。

打开数据库的客户端ADO连接是一个巨大的安全问题。实际上,您是在向用户提供数据库的连接凭据,并让他们发现数据库安全漏洞。即使您的客户是您公司的内部人员,如果他们没有安装oracle驱动程序(或旧版本),您也可能会遇到问题。为什么不将Oracle查询隐藏在JSON调用后面?通过这种方式,您可以在服务器端清理数据库输入,并且您的用户从未收到纯文本形式的数据库连接凭据

尝试建议在sqlserver框中使用链接服务器来获取oracle数据

我同意。如果我能让查询在服务器端工作,我会这样做。问题是,由于OPENROWSET语法的限制,我根本无法让查询在服务器上工作。
rs.Open(e,db);