Я пытаюсь получить доступ к большой базе данных Oracle через SQL Server, используя OPENROWSET в клиентском Javascript, но без особой удачи. Вот подробности:
- Представление SQL Server, которое обращается к базе данных Oracle с помощью OPENROWSET, работает отлично, поэтому я знаю, что у меня есть допустимые параметры строки подключения. Однако новое требование относится к чрезвычайно динамическим запросам Oracle, которые зависят от выбора на стороне клиента, и я не смог получить динамические (или даже параметризованные) запросы Oracle для работы из представлений SQL Server или хранимых процедур.
- Клиентский доступ к базе данных 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.
, которая не имеет смысла для меня. Объяснение Microsoft для этой ошибки относится к параметру реестра (DisallowAdhocAccess
). Это правильно установлено на моем ПК, но, безусловно, это относится к серверу БД, а не к клиентскому ПК, и я ожидаю, что настройки там правильные, так как работает вышеупомянутый вид.
Одна альтернатива, которую я попробовал, - исключить вложение EXEC в операторе Open:
rs.Open(e,db);
но это вызывает ту же ошибку.
Я также попытался поместить OPENROWSET в хранимую процедуру. Это прекрасно работает при выполнении из SQL Server Management Studio, но не с тем же сообщением об ошибке, когда хранимая процедура вызывается из Javascript.
Возможно ли то, что я пытаюсь сделать? Если да, можете ли вы порекомендовать, как исправить мой код? Или нужен совершенно другой подход?
Будут приветствоваться любые подсказки или связанная с ними информация. Заранее спасибо.