Вопрос

Я пытаюсь получить доступ к большой базе данных 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. что не имеет для меня никакого смысла.Объяснение этой ошибки Корпорацией Майкрософт связано с настройкой реестра (DisallowAdhocAccess).Это правильно настроено на моем компьютере, но, безусловно, это относится к серверу базы данных, а не к клиентскому компьютеру, и я бы ожидал, что настройка там правильная, поскольку работает представление, упомянутое выше.

Одна из альтернатив, которую я попробовал, - это исключить заключающий EXEC в инструкции Open:

rs.Open(e,db);

но это порождает ту же ошибку.

Я также попытался поместить OPENROWSET в хранимую процедуру.Это отлично работает при выполнении из SQL Server Management Studio, но завершается с тем же сообщением об ошибке, когда хранимая процедура вызывается из Javascript.

Возможно ли то, что я пытаюсь сделать?Если да, можете ли вы порекомендовать, как исправить мой код?Или необходим совершенно другой подход?

Любые подсказки или сопутствующая информация будут приветствоваться.Заранее благодарю.

Это было полезно?

Решение

Я сам отвечаю на этот вопрос.Я нашел ответ, и я не доволен результатами.Функции, которые сработали, выполняются под моим личным идентификатором пользователя, и у меня есть права владельца базы данных.Для ad hoc доступ к работе, мне нужно либо установить DisallowAdhocAccess установите в реестре значение 0 или предоставьте права владельца базы данных идентификатору пользователя, используемому при веб-доступе.Поскольку это общий сервер с высокой степенью безопасности, мне не разрешат изменять настройки реестра, что повлияет не только на мою базу данных.И я считаю, что второй вариант не менее опасен.

В результате я, по-видимому, застрял с принуждением пользователей устанавливать Oracle Instant Client, чтобы я мог открыть ADO-соединение с базой данных Oracle напрямую в клиентском Javascript.

Я по-прежнему буду приветствовать любые альтернативные мысли по этому поводу.

Другие советы

Открытие клиентских подключений ADO к базе данных - это огромная проблема безопасности.По сути, вы предоставляете пользователю учетные данные для подключения к вашей базе данных и даете ему смелость найти брешь в безопасности вашей базы данных.Даже если ваша аудитория является внутренней по отношению к вашей компании, вы можете столкнуться с проблемами, связанными с тем, что у них не установлены драйверы oracle (или более старая версия).Почему бы просто не скрыть запрос Oracle за вызовом JSON?Таким образом, вы можете очистить входные данные вашей базы данных на стороне сервера, и ваш пользователь никогда не получит учетные данные для подключения к базе данных в виде обычного текста.

попробуйте порекомендовать связанный сервер в вашем поле sqlserver http://msdn.microsoft.com/en-us/library/ms188279.aspx будет использоваться для получения данных oracle

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top