Pergunta

Estou tentando acessar um grande banco de dados Oracle através do SQL Server usando OPENROWSET em JavaScript do lado cliente, e não tendo muita sorte. Aqui estão as indicações:

  • A opinião de um SQL Server que acessa o banco de dados Oracle usando OPENROWSET funciona perfeitamente, então eu sei que eu tenho parâmetros seqüência de conexão válida. No entanto, a nova exigência é para consultas da Oracle extremamente dinâmicos que dependem de seleções do lado do cliente, e eu não tenho sido capaz de obter dinâmica (ou mesmo parametrizado) Oracle consulta ao trabalho a partir de vistas do SQL Server ou procedimentos armazenados.
  • Acesso do lado do cliente para o banco de dados SQL Server funciona perfeitamente com consultas dinâmicas e parametrizados.
  • Não posso contar com clientes que tenham qualquer software cliente Oracle. Portanto, o acesso ao banco de dados Oracle tem que ser através do banco de dados SQL Server, usando visualizações, procedimentos armazenados ou consultas dinâmicas usando OPENROWSET.
  • Uma vez que o banco de dados SQL Server é em um servidor compartilhado, eu não estou autorizado a usar bancos de dados globalmente ligados.

A minha idéia era definir uma função que levaria a minha própria versão de uma consulta do Oracle parametrizada, faça as substituições de parâmetro, envolva a consulta em um OPENROWSET, e executá-lo no SQL Server, retornando o conjunto de registros resultante. Aqui está o código de exemplo:

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

O erro SQL que eu estou recebendo é Ad hoc access to OLE DB provider 'MSDAORA' has been denied. You must access this provider through a linked server. que não faz sentido para mim. A explicação Microsoft para este erro está relacionado a uma configuração de registro (DisallowAdhocAccess). Isso é definido corretamente em meu PC, mas certamente isso se relaciona com o servidor DB e não o PC cliente, e eu esperaria que a configuração não está correta desde o ponto de vista mencionado acima obras.

Uma alternativa que eu tentei é eliminar o EXEC encerrando na instrução Open:

rs.Open(e,db);

mas isso gera o mesmo erro.

Eu também tentei colocar o OPENROWSET em um procedimento armazenado. Isso funciona perfeitamente quando executado a partir de SQL Server Management Studio, mas não com a mesma mensagem de erro quando o procedimento armazenado é chamado a partir de Javascript.

É o que eu estou tentando fazer possível? Se assim for, você pode recomendar como corrigir o meu código? Ou é uma abordagem completamente diferente necessário?

Qualquer sugestões ou informações relacionadas será bem-vinda. Agradecemos antecipadamente.

Foi útil?

Solução

Eu estou respondendo isso mesmo. Eu encontrei a resposta, e eu não estou feliz com os resultados. As funções que têm trabalhado estão sendo executados sob o meu ID de usuário pessoal, e eu tenho privilégios db-proprietário. Para o ad hoc acesso ao trabalho, eu preciso defina a configuração de registro DisallowAdhocAccess a 0, ou dar privilégios db-proprietário para a ID de usuário usado no acesso à web. Porque este é um servidor compartilhado com forte esquema de segurança, não será permitido alterar a configuração do registro, o que afetaria muito mais do que o meu banco de dados. E eu considero a segunda opção a ser igualmente perigoso.

Como resultado, eu sou aparentemente preso com forçar os usuários a ter o cliente Oracle Instant instalado para que eu possa abrir uma conexão ADO ao banco de dados Oracle diretamente no JavaScript do lado cliente.

Eu ainda vai acolher quaisquer pensamentos alternativos sobre isso.

Outras dicas

conexões Abertura do lado do cliente ADO para um banco de dados é uma enorme segurança não-não. Você está dando essencialmente ao usuário as credenciais de conexão ao seu banco de dados e desafiando-os a encontrar um buraco na sua segurança de banco de dados. Mesmo se sua audiência é interno para sua empresa você pode ter problemas com eles não ter os drivers Oracle instalado (ou uma versão mais antiga). Por que não apenas esconder a consulta do Oracle para trás uma chamada JSON? Desta forma, você pode higienizar sua entrada de banco de dados no lado do servidor, e seu usuário nunca recebeu as credenciais de conexão de banco de dados em texto simples.

tentar recomendo um servidor ligado em sua caixa de sqlserver http://msdn.microsoft.com/en-us/library/ms188279. aspx para ser usado para obter os dados do oracle

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top