Доступ к БД Oracle через SQL Server с помощью OPENROWSET - PullRequest
2 голосов
/ 15 января 2009

Я пытаюсь получить доступ к большой базе данных 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.

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

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

Ответы [ 3 ]

1 голос
/ 16 января 2009

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

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

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

0 голосов
/ 07 июня 2010

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

0 голосов
/ 09 апреля 2009

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

...