Question

J'essaie d'accéder à une grande base de données Oracle via SQL Server à l'aide d'OPENROWSET en Javascript côté client, sans trop de chance. Voici les détails:

  • Une vue SQL Server qui accède à la base de données Oracle à l'aide d'OPENROWSET fonctionne parfaitement. Je sais donc que j'ai des paramètres de chaîne de connexion valides. Cependant, la nouvelle exigence concerne les requêtes Oracle extrêmement dynamiques qui dépendent des sélections côté client. Je ne suis pas parvenu à faire en sorte que les requêtes Oracle dynamiques (ou même paramétrées) fonctionnent à partir de vues SQL Server ou de procédures stockées.
  • L’accès côté client à la base de données SQL Server fonctionne parfaitement avec les requêtes dynamiques et paramétrées.
  • Je ne peux pas compter sur les clients possédant un logiciel client Oracle. Par conséquent, l'accès à la base de données Oracle doit s'effectuer par le biais de la base de données SQL Server, à l'aide de vues, de procédures stockées ou de requêtes dynamiques à l'aide de OPENROWSET.
  • La base de données SQL Server se trouvant sur un serveur partagé, je ne suis pas autorisée à utiliser des bases de données liées globalement.

Mon idée était de définir une fonction qui prendrait ma propre version d'une requête Oracle paramétrée, effectuerait les substitutions de paramètres, encapsulerait la requête dans un OPENROWSET et l'exécuterait dans SQL Server, en renvoyant le jeu d'enregistrements résultant. Voici un exemple de code:

// 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'erreur SQL que je reçois est . L'accès ad hoc au fournisseur OLE DB 'MSDAORA' a été refusé. Vous devez accéder à ce fournisseur via un serveur lié. , ce qui n'a aucun sens pour moi. L'explication de cette erreur par Microsoft concerne un paramètre de registre ( DisallowAdhocAccess ). Ceci est correctement défini sur mon PC, mais cela concerne sûrement le serveur de base de données et non le PC client, et je m'attendrais à ce que le réglage y soit correct puisque la vue susmentionnée fonctionne.

Une solution que j'ai déjà essayée consiste à éliminer le EXEC englobant dans l'instruction Open:

rs.Open(e,db);

mais cela génère la même erreur.

J'ai également essayé de mettre l'OPENROWSET dans une procédure stockée. Cela fonctionne parfaitement lorsqu'il est exécuté à partir de SQL Server Management Studio, mais échoue avec le même message d'erreur lorsque la procédure stockée est appelée à partir de Javascript.

Est-ce que ce que j'essaie de faire est possible? Si oui, pouvez-vous recommander comment réparer mon code? Ou faut-il une approche complètement différente?

Toute suggestion ou information connexe sera la bienvenue. Merci d'avance.

Était-ce utile?

La solution

Je réponds moi-même. J'ai trouvé la réponse et je ne suis pas content des résultats. Les fonctions qui ont fonctionné sont exécutées sous mon identifiant d'utilisateur personnel et j'ai les privilèges du propriétaire de la base de données. Pour que l'accès ad hoc fonctionne, je dois définir le paramètre de registre DisallowAdhocAccess sur 0 ou attribuer des privilèges de propriétaire de la base de données à l'ID utilisateur utilisé dans l'accès Web. S'agissant d'un serveur partagé doté d'une sécurité renforcée, je ne serai pas autorisé à modifier le paramètre de registre, ce qui affecterait beaucoup plus que ma base de données. Et je considère que la deuxième option est tout aussi dangereuse.

En conséquence, je suis apparemment obligé de forcer les utilisateurs à installer Oracle Instant Client afin de pouvoir ouvrir une connexion ADO à la base de données Oracle directement en Javascript côté client.

Je me ferai un plaisir de vous faire part de vos idées.

Autres conseils

L’ouverture de connexions ADO côté client à une base de données est une énorme sécurité non-non. Vous donnez essentiellement à l'utilisateur les informations de connexion à votre base de données et vous les défiez de trouver un trou dans la sécurité de votre base de données. Même si votre public est interne à votre entreprise, vous pouvez rencontrer des problèmes si les pilotes Oracle ne sont pas installés (ou une version plus ancienne). Pourquoi ne pas simplement masquer la requête Oracle derrière un appel JSON? De cette façon, vous pouvez nettoyer votre entrée de base de données côté serveur et votre utilisateur n'a jamais reçu les informations d'identification de connexion à la base de données en texte brut.

essayez de recommander un serveur lié dans votre boîte sqlserver http://msdn.microsoft.com/en-us/library/ms188279. aspx à utiliser pour obtenir les données Oracle

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top