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