So richten Sie Pass-Through-Abfragen ein
Eine Pass-Through-Abfrage schickt ihr SQL unverändert an die Datenbank hinter dem Dienst – für Verbünde, Gruppierungen über mehrere Tabellen, Änderungen vieler Zeilen oder Prozeduraufrufe, die sich nicht als OData-Anfrage ausdrücken lassen. Über denselben Weg laufen Abfragen über verknüpfte Tabellen, die Access als eigene Anweisung schickt (Verbünde, Unterabfragen).
Lösungsübersicht
Der Treiber reicht eine Anweisung an die Adresse für eigene Anweisungen weiter. Diese Adresse
nennt entweder der Dienst in seinem Schemadokument – dann ist auf dem Arbeitsplatz nichts
einzustellen – oder die Verbindung mit PASSTHROUGH. Ob die Anweisung laufen darf, entscheidet der
Dienst; der Treiber prüft sie nicht.
Umsetzung
Klären Sie mit dem Betreiber, welche Anweisungen der Dienst annimmt. Das legt der Dienst fest, nicht der Treiber. Der Datendienst Wkl.Data.Gateway kennt zwei Arten:
Art Was läuft Voraussetzung im Dienst Geprüfte Anweisungen SELECTmit Verbund, Unterabfrage,UNION, Gruppierung;INSERT,UPDATE,DELETE; Aufruf einer Prozedur. Der Dienst prüft jedes genannte Objekt gegen die Rechte des Aufrufersab Werk eingeschaltet ( AllowCheckedStatements); jeder Aufrufer, dessen Regel den Alias nennt. Eine nur lesende Regel erlaubt nur lesende AnweisungenUngeprüfte Anweisungen beliebiges SQL einschließlich Schemaänderungen, mit den Rechten der Anmeldung, unter der es läuft AllowPassThrough: trueam Alias und eine nicht nur lesende Regel; beim Dienstschlüssel oder unter der Anmeldung des Alias zusätzlich das RechtsqlAbfragen über verknüpfte Tabellen, die Access selbst erzeugt, sind geprüfte Anweisungen; sie brauchen in der Regel keine Freischaltung. Einzelheiten stehen in „Aliasse, Katalog und die zentrale Regel“ (Dokumentation des Datendienstes).
- Legen Sie in Access eine Pass-Through-Abfrage an: Wählen Sie Erstellen > Abfrageentwurf aus, schließen Sie den Dialog für Tabellen, wählen Sie im Menüband Pass-Through aus, und geben Sie das SQL ein.
Setzen Sie die Verbindung der Abfrage: Geben Sie im Eigenschaftenblatt unter ODBC-Verbindung dieselbe Zeichenfolge ein wie bei den verknüpften Tabellen derselben Datei, etwa
ODBC;DRIVER={Wkl OData};URL=https://daten.example.com/odata/v4/fachdaten/dbo/;AUTH=WINDOWSLiefert die Anweisung kein Ergebnis (
UPDATE,EXECohne Rückgabe), setzen Sie Liefert Datensätze auf Nein.
Führen Sie die Abfrage aus. Access übernimmt Felder und Typen aus der Beschreibung, die der Dienst liefert.
Per VBA:
Dim qd As DAO.QueryDef
Set qd = CurrentDb.CreateQueryDef("qryUmsatzJeKunde")
qd.Connect = "ODBC;DRIVER={Wkl OData};URL=https://daten.example.com/odata/v4/fachdaten/dbo/;AUTH=WINDOWS"
qd.SQL = "SELECT k.Name, SUM(u.Betrag) AS Summe FROM dbo.Umsatz u JOIN dbo.Kunde k ON k.Id = u.Kunde GROUP BY k.Name"
qd.ReturnsRecords = True
Ergebnis: Die Abfrage liefert dieselben Zeilen wie dieselbe Anweisung unmittelbar in der Datenbank.
Hinweise
- Eine Adresse für alle Verbindungen derselben Datei. Access teilt eine offene Verbindung mit jeder Abfrage, deren Verbindungszeichenfolge denselben
DATABASE-Wert trägt – auch wenn sie sich inPASSTHROUGHunterscheidet. Wurde zuerst eine Tabelle ohne die Adresse verknüpft, erreicht die Pass-Through-Abfrage den Treiber über deren Verbindung und wird abgewiesen. Nennen SiePASSTHROUGHdeshalb in jeder Verbindung der Datei oder in keiner (dann gilt die Adresse des Dienstes). - Die Zeilenzahl einer Änderung zeigt Access nicht. Nach einer Pass-Through-Abfrage meldet
RecordsAffectedin Access 0; Access fragt den Treiber gar nicht danach. Unmittelbar über ODBC meldet der Treiber die richtige Zahl. - Gebundene Werte (
?aus einer Anwendung) gehen als Parameter an die Datenbank, nie als Text. Ein Binärwert reist dabei base64-kodiert; eine Anweisung, die einen Binärwert vergleichen muss, schreibt ihn besser selbst hin. - Keine Folgeseiten. Eine durchgereichte Anweisung wird ganz gelesen; die Zeilenobergrenze des Dienstes begrenzt sie. Der Treiber liest die Antwort zeilenweise, während sie ankommt. Der Datendienst Wkl.Data.Gateway schickt ein Ergebnis ab 500 Zeilen gestreamt; bricht ein solcher Strom mittendrin ab, erhält die Anwendung
08S01statt eines gekürzten Ergebnisses. - Ohne Adresse für eigene Anweisungen weist der Treiber nicht übersetzbare Anweisungen mit
42000ab; siehe „ODBC-Aufruf fehlgeschlagen“ bei Summen oder Verbünden.