Domanda

Sto tentando di accedere a un grande database Oracle tramite SQL Server utilizzando OPENROWSET in Javascript sul lato client e non ho molta fortuna. Ecco i dettagli:

  • Una vista di SQL Server che accede al database Oracle tramite OPENROWSET funziona perfettamente, quindi so di avere parametri di stringa di connessione validi. Tuttavia, il nuovo requisito è per le query Oracle estremamente dinamiche che dipendono dalle selezioni sul lato client e non sono stato in grado di ottenere query Oracle dinamiche (o addirittura parametrizzate) che funzionino dalle viste di SQL Server o dalle procedure memorizzate.
  • L'accesso lato client al database di SQL Server funziona perfettamente con query dinamiche e con parametri.
  • Non posso contare su client con software client Oracle. Pertanto, l'accesso al database Oracle deve avvenire tramite il database SQL Server, utilizzando visualizzazioni, stored procedure o query dinamiche utilizzando OPENROWSET.
  • Poiché il database SQL Server si trova su un server condiviso, non sono autorizzato a utilizzare database collegati a livello globale.

La mia idea era quella di definire una funzione che prendesse la mia versione di una query Oracle con parametri, fare le sostituzioni dei parametri, avvolgere la query in un OPENROWSET ed eseguirla in SQL Server, restituendo il recordset risultante. Ecco il codice di esempio:

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

L'errore SQL che sto ricevendo è È stato negato l'accesso ad hoc al provider OLE DB 'MSDAORA'. Devi accedere a questo provider tramite un server collegato. che non ha senso per me. La spiegazione di Microsoft per questo errore riguarda un'impostazione del registro ( DisallowAdhocAccess ). Questo è impostato correttamente sul mio PC, ma sicuramente si riferisce al server DB e non al PC client, e mi aspetto che l'impostazione sia corretta poiché la vista sopra menzionata funziona.

Un'alternativa che ho provato è quella di eliminare l'EXEC allegato nell'istruzione Open:

rs.Open(e,db);

ma questo genera lo stesso errore.

Ho anche provato a inserire OPENROWSET in una procedura memorizzata. Funziona perfettamente se eseguito da SQL Server Management Studio, ma non riesce con lo stesso messaggio di errore quando la procedura memorizzata viene chiamata da Javascript.

È quello che sto cercando di fare? In tal caso, puoi consigliarmi come correggere il mio codice? O è necessario un approccio completamente diverso?

Eventuali suggerimenti o informazioni correlate saranno i benvenuti. Grazie in anticipo.

È stato utile?

Soluzione

Sto rispondendo a me stesso. Ho trovato la risposta e non sono contento dei risultati. Le funzioni che hanno funzionato vengono eseguite con il mio ID utente personale e ho i privilegi di proprietario del database. Affinché l'accesso ad hoc funzioni, devo impostare l'impostazione del registro DisallowAdhocAccess su 0 o assegnare i privilegi del proprietario db all'ID utente utilizzato nell'accesso Web. Poiché si tratta di un server condiviso con una sicurezza elevata, non mi sarà permesso di modificare le impostazioni del registro, il che influirebbe molto più del mio database. E considero la seconda opzione altrettanto pericolosa.

Di conseguenza, sono apparentemente bloccato nel forzare gli utenti a installare Oracle Instant Client in modo da poter aprire una connessione ADO al database Oracle direttamente nel Javascript lato client.

Accetterò comunque qualsiasi pensiero alternativo al riguardo.

Altri suggerimenti

L'apertura di connessioni ADO lato client a un database è un no-no di sicurezza enorme. Stai essenzialmente dando all'utente le credenziali di connessione al tuo database e sfidandoli a trovare un buco nella sicurezza del tuo database. Anche se il tuo pubblico è interno alla tua azienda, potresti riscontrare problemi in cui non hanno installato i driver Oracle (o una versione precedente). Perché non nascondere semplicemente la query Oracle dietro una chiamata JSON? In questo modo è possibile disinfettare l'input del database sul lato server e l'utente non ha mai ricevuto le credenziali di connessione al database in testo semplice.

prova a raccomandare un server collegato nella tua casella sqlserver http://msdn.microsoft.com/en-us/library/ms188279. aspx da utilizzare per ottenere i dati dell'oracolo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top