Architektur verteilter Abfragen

Microsoft SQL Server unterstützt zwei Methoden, um auf heterogene OLE DB-Datenquellen in Transact-SQL-Anweisungen zu verweisen:

  • Verbindungsservernamen

    Mithilfe der gespeicherten Systemprozeduren sp_addlinkedserver und sp_addlinkedsrvlogin kann einer OLE DB-Datenquelle ein Servername zugewiesen werden. Auf Objekte in diesen Verbindungsservern kann in Transact-SQL-Anweisungen mithilfe von aus vier Teilen bestehenden Namen verwiesen werden. Wenn z. B. der Verbindungsservername DeptSQLSrvr für eine andere Instanz von SQL Server definiert wird, verweist die folgende Anweisung auf eine Tabelle auf diesem Server:

    SELECT JobTitle, HireDate 
       FROM DeptSQLSrvr.AdventureWorks2008R2.HumanResources.Employee;
    

    Der Verbindungsservername kann auch in einer OPENQUERY-Anweisung angegeben werden, um ein Rowset aus einer OLE DB-Datenquelle zu öffnen. In Transact-SQL-Anweisungen kann dann auf dieses Rowset wie auf eine Tabelle verwiesen werden.

  • Ad-hoc-Konnektornamen

    Für seltene Verweise auf eine Datenquelle wird die OPENROWSET- oder OPENDATASOURCE-Funktion zusammen mit den Informationen angegeben, die zum Herstellen einer Verbindung mit dem Verbindungsserver erforderlich sind. In Transact-SQL-Anweisungen kann dann auf dieses Rowset wie auf eine Tabelle verwiesen werden.

    SELECT *
    FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
            'c:\MSOffice\Access\Samples\Northwind.mdb';'Admin';'';
            Employees);
    

SQL Server verwendet OLE DB für die Kommunikation zwischen dem relationalen Modul und dem Speichermodul. Das relationale Modul zerlegt jede Transact-SQL-Anweisung in eine Reihe von Vorgängen für einfache OLE DB-Rowsets, die durch das Speichermodul aus den Basistabellen geöffnet werden. Dies bedeutet, dass das relationale Modul einfache OLE DB-Rowsets auch für jede OLE DB-Datenquelle öffnen kann.

Relationales Modul, OLE DB-Ebene, Speichermodul

Das relationale Modul verwendet die OLE DB-API (Application Programming Interface), um die Rowsets auf Verbindungsservern zu öffnen, die Zeilen abzurufen und Transaktionen zu verwalten.

Auf dem Server, auf dem SQL Server ausgeführt wird, muss für jede OLE DB-Datenquelle, auf die als Verbindungsserver zugegriffen wird, ein OLE DB-Anbieter vorhanden sein. Der Reihe von Transact-SQL-Vorgängen, die für eine bestimmte OLE DB-Datenquelle angewendet werden können, wird durch die Funktionalität des OLE DB-Anbieters bestimmt. Weitere Informationen finden Sie unter OLE DB-Anbieter-Referenz für verteilte Abfragen.

Mitglieder der festen Serverrolle sysadmin können mithilfe der DisallowAdhocAccess-Eigenschaft in SQL Server die Ad-hoc-Konnektornamen für einen OLE DB-Anbieter in jeder Instanz von SQL Server aktivieren oder deaktivieren. Bei aktiviertem Ad-hoc-Zugriff kann ein beliebiger Benutzer, der bei der Instanz angemeldet ist, SQL-Anweisungen mit Ad-hoc-Konnektornamen ausführen, die auf eine beliebige Datenquelle im Netzwerk verweisen, und mithilfe dieses OLE DB-Anbieters auf diese Datenquellen zugreifen. Mitglieder der sysadmin-Rolle können zum Steuern des Zugriffs auf Datenquellen den Ad-hoc-Zugriff auf diesen OLE DB-Anbieter deaktivieren. Auf diese Weise können Benutzer lediglich auf diejenigen Datenquellen zugreifen, auf die mit den von den Administratoren definierten Verbindungsservernamen verwiesen wird. Standardmäßig ist der Ad-hoc-Zugriff für SQL Server-OLE DB-Anbieter aktiviert und für alle anderen OLE DB-Anbieter deaktiviert.

Mithilfe von verteilten Abfragen kann Benutzern der Zugriff auf andere Datenquellen gewährt werden (z. B. auf Dateien, nicht relationale Datenquellen, wie Active Directory, usw.). Dies geschieht innerhalb des Sicherheitskontexts des Microsoft Windows-Kontos, unter dem der SQL Server-Dienst ausgeführt wird. Bei Windows-Anmeldungen nimmt SQL Server die Identität der Anmeldung ordnungsgemäß an; dies ist jedoch bei SQL Server-Anmeldungen nicht möglich. Auf diese Weise ist es einem Benutzer, der verteilte Abfragen ausführt, potenziell möglich, auf eine andere Datenquelle zuzugreifen, für die er selbst keine Berechtigungen hat, wohl aber das Konto, unter dem der SQL Server-Dienst ausgeführt wird. Verwenden Sie sp_addlinkedsrvlogin, um spezifische Anmeldungen mit Zugriffsrechten auf die entsprechenden Verbindungsserver zu definieren. Diese Steuerung ist nicht für Ad-hoc-Namen verfügbar. Sie sollten daher sehr sorgfältig beim Aktivieren eines OLE DB-Anbieters für den Ad-hoc-Zugriff sein.

Wenn möglich, verlagert SQL Server relationale Vorgänge wie Joins, Einschränkungen, Projektionen, Sortierungen und Gruppierungen auf die OLE DB-Datenquelle. SQL Server liest die Basistabellen nicht standardmäßig in SQL Server ein, um die relationalen Vorgänge selbst durchzuführen. SQL Server fragt den OLE DB-Anbieter ab, um zu ermitteln, welche Ebene der SQL-Grammatik er unterstützt, und sendet auf der Grundlage dieser Informationen so viele relationale Vorgänge wie möglich an den Anbieter. Weitere Informationen finden Sie unter Anforderungen an SQL-Dialekte für OLE DB-Anbieter.

SQL Server gibt einen Mechanismus an, mit dem ein OLE DB-Anbieter Statistiken zur Verteilung von Schlüsselwerten innerhalb der OLE DB-Datenquelle zurückgibt. So kann der SQL Server-Abfrageoptimierer das Datenmuster in der Datenquelle im Hinblick auf die Anforderungen jeder SQL-Anweisung besser analysieren, wodurch der Abfrageoptimierer besser in der Lage ist, optimale Ausführungspläne zu generieren. Weitere Informationen finden Sie unter Anforderungen an die Verteilungsstatistik für OLE DB-Anbieter.