Frage

Ich versuche, eine große Oracle-Datenbank durch SQL Server zuzugreifen OPENROWSET in clientseitige Javascript verwenden, und nicht viel Glück haben. Hier sind die Angaben:

  • Eine SQL Server-Ansicht, die die Oracle-Datenbank unter Verwendung von OPENROWSET greift perfekt funktioniert, so dass ich weiß, dass ich gültige Verbindungszeichenfolge Parameter. Allerdings ist die neue Anforderung für extrem dynamische Oracle-Abfragen, die auf clientseitige Auswahl abhängen, und ich habe nicht zu arbeiten, von SQL Server-Ansichten oder gespeicherte Prozeduren in der Lage dynamisch (oder auch parametrisierte) Oracle-Abfragen zu erhalten.
  • Client-Seite Zugriff auf die SQL Server-Datenbank arbeitet perfekt mit dynamischen und parametrisierte Abfragen.
  • Ich kann nicht auf Kunden zählen alle Oracle-Client-Software mit. Daher wird der Zugriff auf die Oracle-Datenbank verfügt über die SQL Server-Datenbank sein, unter Verwendung von Views, Stored Procedures oder dynamische Abfragen OPENROWSET verwenden.
  • Da die SQL Server-Datenbank auf einem gemeinsamen Server ist, ich bin global verknüpften Datenbanken nicht verwenden darf.

Meine Idee war es, eine Funktion zu definieren, meine eigene Version von einer parametrierbaren Oracle Abfrage nehmen würde, die Parameter Ersetzungen machen, wickeln Sie die Abfrage in einer OPENROWSET, und führen Sie es in SQL Server, das resultierende Recordset zurück. Hier ist Beispielcode:

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

Die SQL-Fehler, die ich erhalte ist Ad hoc access to OLE DB provider 'MSDAORA' has been denied. You must access this provider through a linked server., die für mich keinen Sinn macht. Die Microsoft Erklärung für diesen Fehler bezieht sich auf eine Registrierungseinstellung (DisallowAdhocAccess). Dies ist richtig eingestellt, auf meinem PC, aber sicher bezieht sich dies auf die DB-Server und nicht den Client-PC, und ich würde erwarten, dass die Einstellung es richtig ist, da die Ansicht oben genannten Werke.

Eine Alternative, die ich versucht habe, ist die umschließende EXEC in der Open-Anweisung zu beseitigen:

rs.Open(e,db);

aber dies erzeugt den gleichen Fehler.

Ich habe auch versucht die OPENROWSET in einer gespeicherten Prozedur setzen. Dies funktioniert perfekt, wenn in SQL Server Management Studio ausgeführt wird, aber nicht mit der gleichen Fehlermeldung, wenn die gespeicherte Prozedur von Javascript aufgerufen wird.

Ist das, was ich versuche möglich zu tun? Wenn ja, können Sie empfehlen, wie mein Code zu beheben? Oder ist ein völlig anderer Ansatz notwendig?

Für Hinweise oder Informationen zu unseren willkommen. Vielen Dank im Voraus.

War es hilfreich?

Lösung

Ich beantworte diese selbst. Ich fand die Antwort, und ich bin nicht zufrieden mit den Ergebnissen. Die Funktionen, die gearbeitet haben, werden unter meinem persönlichen Benutzer-ID laufen, und ich habe db-Eigentümer Privilegien. Für die ad hoc Zugang zu Arbeit, muß ich entweder die DisallowAdhocAccess Registrierungseinstellung auf 0 gesetzt, oder db-Eigentümer Privilegien für den Benutzer-ID in dem Web-Zugriff verwendet geben. Da dies ein Shared Server mit strengen Sicherheitsvorkehrungen ist, werde ich nicht erlaubt, die Registrierungseinstellung zu ändern, die viel mehr als meine Datenbank auswirken würde. Und ich halte die zweite Option ebenso gefährlich sein.

Als Ergebnis bin ich offenbar fest mit Benutzern zwingen den Oracle Instant-Client installiert haben, so kann ich eine ADO-Verbindung zur Datenbank Oracle öffnet direkt in der clientseitige Javascript.

Ich werde immer noch willkommen keine Alternativen Gedanken zu diesem Thema.

Andere Tipps

Öffnen clientseitige ADO-Verbindungen zu einer Datenbank ist eine große Sicherheit No-No. Sie geben im Wesentlichen des Benutzer die Verbindung Zugangsdaten zu Ihrer Datenbank und wagen sie ein Loch in der Datenbank-Sicherheit zu finden. Selbst wenn Ihr Publikum zu Ihrem Unternehmen intern ist, können Sie Probleme mit ihnen nicht dem Oracle-Treiber mit installiert (oder einer älteren Version). Warum verstecken nicht nur die Oracle-Abfrage hinter einem JSON Anruf? Auf diese Weise können Sie Ihre Datenbank-Eingang auf der Server-Seite, und Ihre Benutzer nie erhalten die Datenbankverbindungsinformationen im Klartext sanieren.

versuchen, einen verknüpfte Server in Ihrem Sqlserver Feld recommand http://msdn.microsoft.com/en-us/library/ms188279. aspx verwendet werden, um die oracle-Daten zu erhalten

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top