Pregunta

Estoy tratando de acceder a una gran base de datos Oracle a través de SQL Server usando OPENROWSET en Javascript del lado del cliente, y no tengo mucha suerte. Aquí están los detalles:

  • Una vista de SQL Server que accede a la base de datos de Oracle utilizando OPENROWSET funciona perfectamente, por lo que sé que tengo parámetros de cadena de conexión válidos. Sin embargo, el nuevo requisito es para consultas Oracle extremadamente dinámicas que dependen de las selecciones del lado del cliente, y no he podido obtener consultas Oracle dinámicas (ni siquiera parametrizadas) para trabajar desde vistas de SQL Server o procedimientos almacenados.
  • El acceso del lado del cliente a la base de datos de SQL Server funciona perfectamente con consultas dinámicas y parametrizadas.
  • No puedo contar con que los clientes tengan ningún software de cliente Oracle. Por lo tanto, el acceso a la base de datos de Oracle debe realizarse a través de la base de datos de SQL Server, utilizando vistas, procedimientos almacenados o consultas dinámicas utilizando OPENROWSET.
  • Debido a que la base de datos de SQL Server está en un servidor compartido, no se me permite usar bases de datos vinculadas globalmente.

Mi idea era definir una función que tomara mi propia versión de una consulta Oracle parametrizada, realizara las sustituciones de parámetros, envolviera la consulta en un OPENROWSET y la ejecutara en SQL Server, devolviendo el conjunto de registros resultante. Aquí hay un código de muestra:

// 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);
  }
}

El error de SQL que obtengo es Se ha denegado el acceso ad hoc al proveedor OLE DB 'MSDAORA'. Debe acceder a este proveedor a través de un servidor vinculado. que no tiene sentido para mí. La explicación de Microsoft para este error se relaciona con una configuración de registro ( DisallowAdhocAccess ). Esto está configurado correctamente en mi PC, pero seguramente se relaciona con el servidor DB y no con la PC cliente, y esperaría que la configuración allí sea correcta ya que la vista mencionada anteriormente funciona.

Una alternativa que he intentado es eliminar el EXEC adjunto en la declaración Open:

rs.Open(e,db);

pero esto genera el mismo error.

También intenté poner OPENROWSET en un procedimiento almacenado. Esto funciona perfectamente cuando se ejecuta desde SQL Server Management Studio, pero falla con el mismo mensaje de error cuando se llama al procedimiento almacenado desde Javascript.

¿Es posible lo que intento hacer? Si es así, ¿puede recomendarme cómo arreglar mi código? ¿O es necesario un enfoque completamente diferente?

Cualquier sugerencia o información relacionada será bienvenida. Gracias de antemano.

¿Fue útil?

Solución

Estoy respondiendo esto yo mismo. Encontré la respuesta y no estoy contento con los resultados. Las funciones que han funcionado se ejecutan con mi ID de usuario personal y tengo privilegios de propietario de db. Para el acceso ad hoc al trabajo, necesito establecer la configuración del registro DisallowAdhocAccess en 0, o otorgar privilegios de propietario de db al ID de usuario utilizado en el acceso web. Debido a que este es un servidor compartido con alta seguridad, no se me permitirá cambiar la configuración del registro, lo que afectaría mucho más que mi base de datos. Y considero que la segunda opción es igualmente peligrosa.

Como resultado, aparentemente estoy atrapado en obligar a los usuarios a tener instalado Oracle Instant Client para poder abrir una conexión ADO a la base de datos Oracle directamente en Javascript del lado del cliente.

Todavía agradeceré cualquier pensamiento alternativo sobre esto.

Otros consejos

Abrir conexiones ADO del lado del cliente a una base de datos es un gran no-no de seguridad. Básicamente, le está dando al usuario las credenciales de conexión a su base de datos y los desafía a encontrar un hueco en la seguridad de su base de datos. Incluso si su audiencia es interna en su empresa, puede tener problemas si no tiene instalados los controladores Oracle (o una versión anterior). ¿Por qué no solo ocultar la consulta de Oracle detrás de una llamada JSON? De esta manera, puede desinfectar la entrada de su base de datos en el lado del servidor, y su usuario nunca recibió las credenciales de conexión de la base de datos en texto sin formato.

intente recomendar un servidor vinculado en su cuadro sqlserver http://msdn.microsoft.com/en-us/library/ms188279. aspx que se utilizará para obtener los datos de Oracle

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top