Freigeben über


CREATE VIEW (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-Analyseendpunkt in Microsoft FabricWarehouse in Microsoft FabricSQL-Datenbank in Microsoft Fabric

Erstellt eine virtuelle Tabelle, deren Inhalt (Spalten und Zeilen) durch eine Abfrage definiert wird. Verwenden Sie diese Anweisung, um in einer oder mehreren Tabellen in der Datenbank eine Sicht der Daten zu erstellen. Eine Sicht kann z. B. für folgende Zwecke verwendet werden:

  • Um die Darstellung einer Datenbank für jeden einzelnen Benutzer einzuschränken, zu vereinfachen und anzupassen.

  • Als Sicherheitsmechanismus, indem Benutzern der Zugriff auf Daten über die Sicht ermöglicht wird, ohne diesen Benutzern jedoch die Berechtigungen für den direkten Zugriff auf die zugrunde liegenden Basistabellen zu gewähren.

  • Um eine abwärtskompatible Schnittstelle zum Emulieren einer Tabelle bereitzustellen, deren Schema geändert wurde.

Transact-SQL-Syntaxkonventionen

Syntax

Syntax für SQL Server und Azure SQL-Datenbank

CREATE [ OR ALTER ] VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ]
[ WITH <view_attribute> [ ,...n ] ]
AS select_statement
[ WITH CHECK OPTION ]
[ ; ]  

<view_attribute> ::=
{  
    [ ENCRYPTION ]  
    [ SCHEMABINDING ]  
    [ VIEW_METADATA ]
}

Syntax für Azure Synapse Analytics und Parallel Data Warehouse.

CREATE VIEW [ schema_name . ] view_name [  ( column_name [ ,...n ] ) ]   
AS <select_statement>   
[;]  

<select_statement> ::=  
    [ WITH <common_table_expression> [ ,...n ] ]  
    SELECT <select_criteria>  

Syntax für Microsoft Fabric Data Warehouse- und SQL-Analyseendpunkt.

CREATE [ OR ALTER ] VIEW [ schema_name . ] view_name [  ( column_name [ ,...n ] ) ]   
[ WITH <view_attribute> [ ,...n ] ] AS <select_statement>   
[;]

<view_attribute> ::=
{  
    [ SCHEMABINDING ]  
}

<select_statement> ::=  
    [ WITH <common_table_expression> [ ,...n ] ]  
    SELECT <select_criteria>  

Argumente

ODER ALTER

Gilt für: Azure SQL-Datenbank und SQL Server (ab SQL Server 2016 (13.x) SP1).

Ändert die Sicht nur, sofern diese bereits vorhanden ist.

schema_name
Ist der Name des Schemas, zu dem die Sicht gehört.

view_name
Der Name der Sicht. Sichtnamen müssen den Regeln für Bezeichner entsprechen. Das Angeben des Sichtbesitzernamens ist optional.

Spalte
Der Name, den eine Spalte in einer Sicht erhalten soll. Ein Spaltenname ist nur erforderlich, wenn eine Spalte von einem arithmetischen Ausdruck, einer Funktion oder einer Konstante abgeleitet wird; wenn zwei oder mehr Spalten andernfalls denselben Namen haben, in der Regel aufgrund einer Verknüpfung; oder wenn eine Spalte in einer Ansicht einen anderen Namen als die spalte angegeben wird, von der sie abgeleitet wird. Spaltennamen können auch in der SELECT Anweisung zugewiesen werden.

Wenn keine Spalte angegeben ist, erhalten die Ansichtsspalten die gleichen Namen wie die Spalten in der SELECT Anweisung.

Hinweis

In den Spalten für die Ansicht gelten die Berechtigungen für einen Spaltennamen unabhängig von der Quelle der zugrunde liegenden Daten für eine oder CREATE VIEW eine ALTER VIEW Anweisung. Wenn z. B. Berechtigungen für die SalesOrderID Spalte in einer CREATE VIEW-Anweisung erteilt werden, kann eine ALTER VIEW Anweisung die SalesOrderID Spalte mit einem anderen Spaltennamen benennen, z OrderRef. B. über die Berechtigungen, die der Ansicht zugeordnet SalesOrderIDsind.

WIE

Gibt die Aktionen an, die die Sicht ausführen soll.

select_statement

Die SELECT Anweisung, die die Ansicht definiert. In der Anweisung dürfen mehrere Tabellen und andere Sichten angegeben werden. Entsprechende Berechtigungen sind erforderlich, um aus den Objekten auszuwählen, auf die in der SELECT Klausel der erstellten Ansicht verwiesen wird.

Eine Ansicht muss keine Teilmenge der Zeilen und Spalten einer bestimmten Tabelle sein. Eine Ansicht kann erstellt werden, die mehrere Tabellen oder andere Ansichten mit einer SELECT Klausel mit einer beliebigen Komplexität verwendet.

In einer indizierten Ansichtsdefinition muss es sich bei der SELECT Anweisung um eine einzelne Tabellenanweisung oder eine multitable JOIN mit optionaler Aggregation handeln.

Die SELECT Klauseln in einer Ansichtsdefinition können nicht enthalten:

  • Eine ORDER BY Klausel, es sei denn, es gibt auch eine TOP Klausel in der Auswahlliste der SELECT Anweisung.

    Wichtig

    Die ORDER BY Klausel wird nur verwendet, um die Zeilen zu bestimmen, die von der TOP Ansichtsdefinition oder OFFSET Klausel zurückgegeben werden. Die ORDER BY Klausel garantiert keine sortierten Ergebnisse, wenn die Ansicht abgefragt wird, es sei denn ORDER BY , sie wird auch in der Abfrage selbst angegeben.

  • Das schlüsselwort INTO

  • Die OPTION Klausel

  • Ein Verweis auf eine temporäre Tabelle oder auf eine Tabellenvariable

Da select_statement die SELECT Anweisung verwendet, ist es gültig, Verknüpfungshinweise und Tabellenhinweise wie in der FROM Klausel angegeben zu verwenden. Weitere Informationen finden Sie unter FROM (Transact-SQL) und SELECT (Transact-SQL).

Funktionen und mehrere SELECT Anweisungen, die durch UNIONUNION ALLselect_statement getrennt oder verwendet werden können.

CHECK-OPTION

Erzwingt, dass alle für die Sicht ausgeführten Datenänderungsanweisungen den Kriterien entsprechen müssen, die innerhalb von select_statement festgelegt wurden. Wenn eine Zeile über eine Ansicht geändert wird, wird sichergestellt, WITH CHECK OPTION dass die Daten nach dem Commit der Änderung durch die Ansicht sichtbar bleiben.

Hinweis

Dies CHECK OPTION gilt nur für Aktualisierungen, die über die Ansicht vorgenommen wurden. Sie gilt nicht für Updates, die direkt für die zugrunde liegenden Tabellen einer Ansicht durchgeführt werden.

VERSCHLÜSSELUNG

Gilt für: SQL Server 2008 (10.0.x) und höher sowie Azure SQL-Datenbank.

Verschlüsselt die Einträge in sys.syscomments , die den Text der CREATE VIEW Anweisung enthalten. Die Verwendung WITH ENCRYPTION verhindert, dass die Ansicht als Teil der SQL Server-Replikation veröffentlicht wird.

SCHEMABINDING

Bindet die Sicht an das Schema der zugrunde liegenden Basistabellen. Wenn SCHEMABINDING angegeben, kann die Basistabelle oder -tabellen nicht auf eine Weise geändert werden, die sich auf die Ansichtsdefinition auswirken würde. Zunächst muss die Sichtdefinition selbst geändert oder gelöscht werden, um Abhängigkeiten in der zu ändernden Tabelle zu entfernen. Bei Verwendung SCHEMABINDINGmuss die select_statement die zweiteiligen Namen (Schema) enthalten.-Objekt) von Tabellen, Ansichten oder benutzerdefinierten Funktionen, auf die verwiesen wird. Alle Objekte, auf die verwiesen wird, müssen in derselben Datenbank vorhanden sein.

Sichten oder Tabellen, die Bestandteil einer mit der SCHEMABINDING-Klausel erstellten Sicht sind, können erst dann gelöscht werden, wenn diese Sicht gelöscht oder geändert wurde, sodass keine Schemabindung mehr vorhanden ist. Andernfalls löst Datenbank-Engine einen Fehler aus. Das Ausführen von ALTER TABLE Anweisungen für Tabellen, die an Ansichten mit Schemabindung teilnehmen, schlagen außerdem fehl, wenn sich diese Anweisungen auf die Ansichtsdefinition auswirken.

VIEW_METADATA

Gibt an, dass die Instanz von SQL Server die Metadateninformationen der Sicht anstelle der Basistabelle(n) an die DB-Library-, ODBC- und OLE DB-APIs zurückgibt, wenn Metadaten des Durchsuchenmodus für eine Abfrage angefordert werden, die auf die Sicht verweist. Bei Metadaten des Durchsuchenmodus handelt es sich um zusätzliche Metadaten, die von der Instanz von SQL Server an diese clientseitigen APIs zurückgegeben werden. Mithilfe dieser Metadaten können die clientbasierten APIs aktualisierbare clientbasierte Cursors implementieren. Metadaten des Durchsuchenmodus enthalten Informationen zu der Basistabelle, zu der die Spalten im Resultset gehören.

Bei Ansichten, die mit VIEW_METADATAerstellt wurden, gibt die Metadaten des Suchmodus den Ansichtsnamen und nicht die Basistabellennamen zurück, wenn sie Spalten aus der Ansicht im Resultset beschreibt.

Wenn eine Ansicht mit der Verwendung WITH VIEW_METADATAerstellt wird, sind alle zugehörigen Spalten, mit Ausnahme einer Zeitstempelspalte , aktualisierbar, wenn die Ansicht über INSTEAD OF INSERT oder INSTEAD OF UPDATE Auslöser verfügt. Weitere Informationen zu aktualisierbaren Sichten finden Sie unter Hinweise.

Bemerkungen

Eine Sicht kann nur in der aktuellen Datenbank erstellt werden. Dies CREATE VIEW muss die erste Anweisung in einem Abfragebatch sein. Für eine Sicht sind maximal 1.024 Spalten zulässig.

Wenn eine Abfrage für eine Sicht durchgeführt wird, überprüft Datenbank-Engine, ob alle Datenbankobjekte, auf die in der Anweisung verwiesen wird, vorhanden sind, ob sie im Kontext der Anweisung gültig sind und ob Datenänderungsanweisungen gegen die Regeln der Datenintegrität verstoßen. Schlägt eine Überprüfung fehl, wird eine Fehlermeldung zurückgegeben. Andernfalls wird die Aktion in eine Aktion für die zugrunde liegende Tabelle bzw. Tabellen übersetzt.

Wenn eine Sicht von einer Tabelle oder Sicht abhängt, die gelöscht wurde, erzeugt Datenbank-Engine eine Fehlermeldung, wenn jemand versucht, die Sicht zu verwenden. Wenn eine neue Tabelle oder Sicht, deren Struktur sich nicht von der vorherigen Basistabelle unterscheidet, erstellt wird, um die gelöschte zu ersetzen, wird die Sicht wieder verwendbar. Wenn sich die Struktur der neuen Tabelle oder Sicht ändert, muss die Sicht gelöscht und neu erstellt werden.

Wenn keine Ansicht mit der SCHEMABINDING Klausel erstellt wird, führen Sie sp_refreshview aus, wenn Änderungen an den Objekten vorgenommen werden, die der Ansicht zugrunde liegen, die sich auf die Definition der Ansicht auswirken. Andernfalls liefert die Abfrage der Sicht möglicherweise unerwartete Ergebnisse.

Beim Erstellen einer Sicht werden die Informationen zu dieser in den folgenden Katalogsichten gespeichert: sys.views, sys.columns und sys.sql_expression_dependencies. Der Text der CREATE VIEW Anweisung wird in der Katalogansicht sys.sql_modules gespeichert.

Eine Abfrage, die einen Index für eine ansicht verwendet, die mit numerischen oder float-Ausdrücken definiert ist, kann ein Ergebnis haben, das sich von einer ähnlichen Abfrage unterscheidet, die den Index nicht in der Ansicht verwendet. Dieser Unterschied kann durch Runden von Fehlern während INSERTDELETE, oder UPDATE Aktionen zu zugrunde liegenden Tabellen verursacht werden.

Das Datenbankmodul speichert die Einstellungen und SET QUOTED_IDENTIFIERSET ANSI_NULLS wann eine Ansicht erstellt wird. Diese Originaleinstellungen werden zum Analysieren der Sicht wiederhergestellt, wenn die Sicht verwendet wird. Daher wirken sich alle Clientsitzungseinstellungen für SET QUOTED_IDENTIFIER und SET ANSI_NULLS nicht auf die Ansichtsdefinition aus, wenn auf die Ansicht zugegriffen wird.

In Azure Synapse Analytics unterstützen Ansichten keine Schemabindung. Daher sollten Sie, wenn Änderungen an den zugrunde liegenden Objekten vorgenommen werden, die Ansicht ablegen und neu erstellen, um die zugrunde liegenden Metadaten zu aktualisieren. Weitere Informationen finden Sie unter T-SQL-Sichten mit dediziertem SQL-Pool und serverlosem SQL-Pool in Azure Synapse Analytics.

In Azure Synapse Analytics werden aktualisierbare Ansichten, DML-Trigger (entweder vom Typ AFTER oder INSTEAD OF) und partitionierte Ansichten nicht unterstützt. Weitere Informationen finden Sie unter T-SQL-Sichten mit dediziertem SQL-Pool und serverlosem SQL-Pool in Azure Synapse Analytics.

In Azure Synapse Analytics werden partitionierte Ansichten nicht unterstützt. Weitere Informationen finden Sie unter T-SQL-Sichten mit dediziertem SQL-Pool und serverlosem SQL-Pool in Azure Synapse Analytics.

In der Fabric SQL-Datenbank können Ansichten erstellt werden, sie werden jedoch nicht in die Fabric OneLake gespiegelt. Weitere Informationen finden Sie unter Einschränkungen der Fabric SQL-Datenbankspiegelung.

Aktualisierbare Ansichten

Sie können die Daten einer zugrunde liegenden Basistabelle über eine Sicht ändern, wenn die folgenden Bedingungen erfüllt sind:

  • Alle Änderungen, einschließlich UPDATE, INSERTund DELETE Anweisungen, müssen nur aus einer Basistabelle auf Spalten verweisen.

  • Die Spalten, die in der Sicht geändert werden, müssen direkt auf die zugrunde liegenden Daten der Tabellenspalten verweisen. Die Spalten können nicht auf andere Art abgeleitet werden, wie etwa über:

    • Eine Aggregatfunktion: AVG, COUNT, , SUM, MINMAX, , GROUPING, STDEVSTDEVP, , und VARVARP.

    • Eine Berechnung. Die Spalte kann mit einem Ausdruck, der andere Spalten verwendet, nicht berechnet werden. Spalten, die mithilfe der Mengenoperatoren UNION, UNION ALL, CROSSJOIN, EXCEPT und INTERSECT erstellt werden, werden berechnet und sind daher auch nicht aktualisierbar.

  • Die zu ändernden Spalten sind von , oder GROUP BYHAVING Klauseln nicht betroffenDISTINCT.

  • TOP wird in der select_statement der Ansicht zusammen mit der WITH CHECK OPTION Klausel nicht verwendet.

Die vorigen Einschränkungen gelten, so wie für die Sicht selbst, für alle Unterabfragen in der FROM-Klausel der Sicht. Im Allgemeinen muss Datenbank-Engine Änderungen von der Sichtdefinition an einer Basistabelle eindeutig nachverfolgen können. Weitere Informationen finden Sie unter Modify Data Through a View (Ändern von Daten über eine Sicht).

Wenn Sie aufgrund der vorigen Einschränkungen die Daten nicht direkt über eine Sicht ändern können, sollten Sie die folgenden Optionen berücksichtigen:

  • ANSTELLE VON Auslösern

    INSTEAD OF Trigger können in einer Ansicht erstellt werden, um eine Ansicht aktualisierbar zu machen. Der INSTEAD OF Trigger wird anstelle der Datenänderungsanweisung ausgeführt, für die der Trigger definiert ist. Mithilfe dieses Triggers kann der Benutzer die Gruppe von Aktionen angeben, die erforderlich sind, um die Datenänderungsanweisung zu verarbeiten. Wenn daher ein INSTEAD OF Trigger für eine Ansicht einer bestimmten Datenänderungsanweisung (INSERT, UPDATEoder DELETE) vorhanden ist, ist die entsprechende Ansicht über diese Anweisung aktualisierbar. Weitere Informationen zu INSTEAD OF Triggern finden Sie unter DML-Trigger.

  • Partitionierte Ansichten

    Wenn es sich bei der Sicht um eine partitionierte Sicht handelt, ist sie mit gewissen Einschränkungen aktualisierbar. Bei Bedarf unterscheidet Datenbank-Engine zwischen lokalen partitionierten Sichten (als Sichten, bei denen sich alle beteiligten Tabellen und die jeweilige Sicht selbst auf derselben SQL Server-Instanz befinden) und verteilten partitionierten Sichten (als Sichten, bei denen sich mindestens eine der Tabellen auf einem anderen Server oder Remoteserver befindet).

Partitionierte Sichten

Eine partitionierte Ansicht ist eine Ansicht, die von einer UNION ALL Von Membertabellen auf die gleiche Weise definiert wird, aber separat als mehrere Tabellen in derselben Instanz von SQL Server oder in einer Gruppe von autonomen Instanzen von SQL Server-Servern gespeichert wird, die als Verbunddatenbankserver bezeichnet werden.

Hinweis

Die bevorzugte Methode zum lokalen Partitionieren von Daten auf einem Server ist die mithilfe partitionierter Tabellen. Weitere Informationen finden Sie unter partitionierte Tabellen und Indizes.

Wenn Sie ein Partitionierungsschema entwerfen, muss klar sein, welche Daten zu jeder Partition gehören. Die Daten der Customers-Tabelle sind beispielsweise auf drei Mitgliedstabellen an drei Serverstandorten verteilt: Customers_33 auf Server1, Customers_66 auf Server2 und Customers_99 auf Server3.

Eine partitionierte Sicht auf Server1 wird wie folgt definiert:

--Partitioned view as defined on Server1  
CREATE VIEW Customers  
AS  
--Select from local member table.  
SELECT *  
FROM CompanyData.dbo.Customers_33  
UNION ALL  
--Select from member table on Server2.  
SELECT *  
FROM Server2.CompanyData.dbo.Customers_66  
UNION ALL  
--Select from member table on Server3.  
SELECT *  
FROM Server3.CompanyData.dbo.Customers_99;  

Im Allgemeinen gilt eine Sicht als partitioniert, wenn sie die folgende Form aufweist:

SELECT <select_list1>  
FROM T1  
UNION ALL  
SELECT <select_list2>  
FROM T2  
UNION ALL  
...  
SELECT <select_listn>  
FROM Tn;  

Bedingungen für das Erstellen von partitionierten Ansichten

  1. Die SELECT-list

    • In der Spaltenliste der Sichtdefinition wählen Sie alle Spalten der Mitgliedstabellen aus.

    • Stellen Sie sicher, dass die Spalten an derselben Ordnungsposition jeder select list denselben Typ aufweisen, einschließlich Sortierungen. Es reicht nicht aus, dass die Spalten implizit konvertierbar sind, wie es im Allgemeinen der UNIONFall ist.

      Demnach muss mindestens eine Spalte (z. B. <col>) in allen SELECT-Listen an derselben Ordnungsposition vorhanden sein. Definieren Sie <col> so, dass die Mitgliedstabellen T1, ..., Tn über CHECK-Einschränkungen C1, ..., Cn verfügen, die entsprechend in <col> definiert sind.

      Die für C1 definierte Einschränkung T1 muss die folgende Form haben:

      C1 ::= < simple_interval > [ OR < simple_interval > OR ...]  
      < simple_interval > :: =   
      < col > { < | > | \<= | >= | = < value >}   
      | < col > BETWEEN < value1 > AND < value2 >  
      | < col > IN ( value_list )  
      | < col > { > | >= } < value1 > AND  
      < col > { < | <= } < value2 >  
      
    • Die Einschränkungen müssen so festgelegt sein, dass jeder angegebene Wert von <col> höchstens eine der Einschränkungen C1, ..., Cn erfüllt, sodass die Einschränkungen eine Gruppe von getrennten oder nicht überlappenden Intervallen bilden. Die <col>-Spalte, für die die getrennten Einschränkungen definiert sind, wird Partitionierungsspalte genannt. Die Partitionierungsspalte kann in den zugrunde liegenden Tabellen unterschiedliche Namen haben. Die Einschränkungen müssen sich im enabled- und trusted-Status befinden, damit sie die zuvor genannten Bedingungen für die Partitionierungsspalte erfüllen. Wenn die Einschränkungen deaktiviert sind, aktivieren Sie die Einschränkungsüberprüfung erneut, indem Sie die CHECK CONSTRAINT *constraint_name* Option verwenden ALTER TABLE, und verwenden Sie die WITH CHECK Option, um sie zu überprüfen.

      Die folgenden Beispiele zeigen gültige Einschränkungsgruppen:

      { [col < 10], [col between 11 and 20] , [col > 20] }  
      { [col between 11 and 20], [col between 21 and 30], [col between 31 and 100] }  
      
    • Die mehrfache Verwendung einer Spalte in der Auswahlliste ist nicht zulässig.

  2. Partitionierungsspalte

    • Die Partitionierungsspalte ist Teil der PRIMARY KEY-Einschränkung der Tabelle.

    • Eine berechnete Spalte, eine Identitätspalte, eine Standardspalte oder eine timestamp-Spalte darf hierfür nicht verwendet werden.

    • Wenn es für eine Spalte einer Mitgliedstabelle mehrere Einschränkungen gibt, ignoriert die Datenbank-Engine alle diese Einschränkungen und berücksichtigt sie nicht, wenn ermittelt wird, ob die Sicht eine partitionierte Sicht ist. Damit die Bedingungen für partitionierte Sichten erfüllt werden, stellen Sie sicher, dass es für die Partitionierungsspalte nur eine Partitionierungseinschränkung gibt.

    • Für Partitionierungsspalten gelten keine Einschränkungen hinsichtlich der Aktualisierbarkeit.

  3. Mitgliedstabellen oder zugrunde liegende Tabellen T1, ..., Tn

    • Bei den Tabellen kann es sich entweder um lokale Tabellen oder um Tabellen von anderen Computern handeln, auf denen SQL Server ausgeführt wird, auf die entweder über einen vierteiligen Namen oder einen OPENDATASOURCE- oder OPENROWSET-basierten Namen verwiesen wird. Die OPENDATASOURCE- und OPENROWSET-Syntax kann zwar einen Tabellennamen angeben, nicht jedoch eine Pass-Through-Abfrage. Weitere Informationen finden Sie unter OPENDATASOURCE (Transact-SQL) und OPENROWSET (Transact-SQL).

      Falls eine oder mehrere Mitgliedstabellen Remotetabellen sind, wird die Sicht verteilte partitionierte Sicht genannt, und es gelten zusätzliche Bedingungen. Diese werden weiter unten in diesem Abschnitt beschrieben.

    • Die gleiche Tabelle kann nicht zweimal in der Gruppe von Tabellen angezeigt werden, die mit der UNION ALL Anweisung kombiniert werden.

    • Die Mitgliedstabellen dürfen nicht über Indizes verfügen, die für berechnete Spalten der Tabelle erstellt werden.

    • Für alle Mitgliedstabellen gilt, dass ihre PRIMARY KEY-Einschränkungen auf gleich vielen Spalten basieren.

    • Alle Mitgliedstabellen einer Sicht weisen dieselbe Einstellung für die ANSI-Auffüllung auf. Dies kann entweder mithilfe der Benutzeroptionenoption in sp_configure oder der SET-Anweisung festgelegt werden.

Bedingungen zum Ändern von Daten in partitionierten Ansichten

Die folgenden Einschränkungen gelten für Anweisungen, die Daten in partitionierten Sichten ändern:

  • Die INSERT Anweisung liefert Werte für alle Spalten in der Ansicht, auch wenn die zugrunde liegenden Membertabellen eine DEFAULT Einschränkung für diese Spalten aufweisen oder wenn sie Werte zulassen NULL . Für die Membertabellenspalten mit DEFAULT Definitionen können die Anweisungen das Schlüsselwort DEFAULTnicht explizit verwenden.

  • Der in die Partitionierungsspalte eingefügte Wert erfüllt mindestens eine der zugrunde liegenden Einschränkungen; andernfalls schlägt die Einfügeaktion mit einer Einschränkungsverletzung fehl.

  • UPDATE Anweisungen können das DEFAULT Schlüsselwort nicht als Wert in der SET Klausel angeben, auch wenn die Spalte einen DEFAULT Wert aufweist, der in der entsprechenden Membertabelle definiert ist.

  • Spalten in der Ansicht, die eine Identitätsspalte in einer oder mehreren Membertabellen sind, können nicht mithilfe einer oder INSERT einer UPDATE Anweisung geändert werden.

  • Wenn eine der Membertabellen eine Zeitstempelspalte enthält, können die Daten nicht mithilfe einer oder INSERT einer UPDATE Anweisung geändert werden.

  • Wenn eine der Membertabellen einen Trigger oder eine ON UPDATE CASCADE/SET NULL/SET DEFAULTON DELETE CASCADE/SET NULL/SET DEFAULT Einschränkung enthält, kann die Ansicht nicht geändert werden.

  • INSERT, UPDATEund DELETE Aktionen für eine partitionierte Ansicht sind nicht zulässig, wenn eine Selbstverknppung mit derselben Ansicht oder mit einer der Membertabellen in der Anweisung vorhanden ist.

  • Das Massenimporten von Daten in eine partitionierte Ansicht wird von oder den bcpBULK INSERT Anweisungen INSERT ... SELECT * FROM OPENROWSET(BULK...) nicht unterstützt. Sie können mit der INSERT-Anweisung jedoch mehrere Zeilen in eine partitionierte Sicht einfügen.

    Hinweis

    Um eine partitionierte Ansicht zu aktualisieren, muss der Benutzer über Berechtigungen für INSERT die Mitgliedstabellen verfügenUPDATEDELETE.

Zusätzliche Bedingungen für verteilte partitionierte Ansichten

Für verteilte partitionierte Sichten (bei denen eine oder mehrere Mitgliedstabellen Remotetabellen sind), gelten zusätzlich die folgenden Bedingungen:

  • Eine verteilte Transaktion wird gestartet, um die Atomität über alle Knoten hinweg zu garantieren, die von dem Update betroffen sind.

  • Legen Sie die XACT_ABORT SET Option für ON die Funktionsweise von INSERTAnweisungen UPDATEoder Anweisungen DELETE fest.

  • Alle Spalten in Remotetabellen des Typs smallmoney, auf die in einer partitionierten Sicht verwiesen wird, werden als money zugeordnet. Daher müssen die entsprechenden Spalten (in der gleichen Ordnungsposition in der Auswahlliste) in den lokalen Tabellen auch den Typ money aufweisen.

  • Unter Datenbankkompatibilitätsgrad 110 und höher werden alle Spalten in Remotetabellen vom Typ smalldatetime, auf die in einer partitionierten Sicht verwiesen wird, als smalldatetime zugeordnet. Entsprechende Spalten in den lokalen Tabellen (in derselben Ordnungsposition in der Auswahlliste) müssen den Typ smalldatetime aufweisen. Dies ist eine Änderung des Verhaltens früherer Versionen von SQL Server, in denen sämtliche Spalten in Remotetabellen vom Typ smalldatetime, auf die in einer partitionierten Sicht verwiesen wird, als datetime zugeordnet werden. Die entsprechenden Spalten in lokalen Tabellen müssen den Typ datetime aufweisen. Weitere Informationen finden Sie unter ALTER DATABASE-Kompatibilitätsgrad (Transact-SQL).

  • Ein an der partitionierten Sicht beteiligter Verbindungsserver kann kein Loopback-Verbindungsserver sein. Dies ist ein Verbindungsserver, der auf dieselbe Instanz von SQL Server verweist.

Die Einstellung der SET ROWCOUNT Option wird für INSERT, UPDATEund DELETE Aktionen, die aktualisierbare partitionierte Ansichten und Remotetabellen umfassen, ignoriert.

Wenn die Mitgliedstabellen und die partitionierte Sichtdefinition vorhanden sind, erstellt der SQL Server-Abfrageoptimierer intelligente Pläne, die Abfragen zum effizienten Zugriff auf Daten in den Mitgliedstabellen verwenden. Mit den CHECK Einschränkungsdefinitionen ordnet der Abfrageprozessor die Verteilung der Schlüsselwerte in den Membertabellen zu. Wenn ein Benutzer eine Abfrage ausgibt, vergleicht der Abfrageprozessor die Zuordnung mit den in der WHERE Klausel angegebenen Werten und erstellt einen Ausführungsplan mit einer minimalen Menge an Datenübertragung zwischen Memberservern. Wenn sich daher einige Membertabellen auf Remoteservern befinden, löst die Sql Server-Instanz verteilte Abfragen auf, sodass die Menge der verteilten Daten, die übertragen werden müssen, minimal ist.

Überlegungen zur Replikation

Die folgenden Überlegungen sind erforderlich, wenn Sie partitionierte Sichten für Mitgliedstabellen erstellen, die an der Replikation beteiligt sind:

  • Wenn die zugrunde liegenden Tabellen an der Merge- oder Transaktionsreplikation mit Updateabonnements beteiligt sind, stellen Sie sicher, dass die Spalte uniqueidentifier ebenfalls in der Auswahlliste enthalten ist.

    Alle INSERT Aktionen in der partitionierten Ansicht müssen einen NEWID() Wert für die UniqueIdentifier-Spalte bereitstellen. Alle UPDATE-Aktionen für die Eindeutigidentifiziererspalte müssen als Wert angegeben NEWID() werden, da das DEFAULT-Schlüsselwort nicht verwendet werden kann.

  • Die Replikation von Updates, die mithilfe der Sicht ausgeführt werden, entspricht der Replikation von Tabellen in zwei verschiedenen Datenbanken: Die Tabellen werden von unterschiedlichen Replikations-Agents bedient, und die Reihenfolge der Updates ist nicht sichergestellt.

Berechtigungen

Erfordert die CREATE VIEW-Berechtigung in der Datenbank und die ALTER-Berechtigung für das Schema, in dem die Sicht erstellt wird.

Beispiele

In den folgenden Beispielen wird die AdventureWorks2022 oder AdventureWorksDW2022-Datenbank verwendet.

Ein. Verwenden von CREATE VIEW zum Erstellen einer Ansicht

Im folgenden Beispiel wird mithilfe einer SELECT Anweisung eine Ansicht erstellt. Eine einfache Sicht ist hilfreich, wenn eine Kombination mehrerer Spalten häufig abgefragt wird. Die Daten dieser Sicht stammen aus den HumanResources.Employee- und Person.Person-Tabellen der AdventureWorks2022-Datenbank. Mit diesen Daten werden Name und Einstellungsdatum der Mitarbeiter von Adventure Works Cycles bereitgestellt. Die Sicht könnte für die Person erstellt werden, die für die Nachverfolgung von Jubiläen verantwortlich ist. Dabei wird dieser Person nicht der Zugriff auf alle Daten dieser Tabellen gewährt.

CREATE VIEW hiredate_view  
AS
SELECT p.FirstName, p.LastName, e.BusinessEntityID, e.HireDate  
FROM HumanResources.Employee AS e   
JOIN Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID ;  
GO  

B. VERWENDEN MIT VERSCHLÜSSELUNG

Das folgende Beispiel verwendet die Option WITH ENCRYPTION und zeigt berechnete, umbenannte und mehrfache Spalten.

Gilt für: SQL Server 2008 (10.0.x) und höher sowie SQL-Datenbank

CREATE VIEW Purchasing.PurchaseOrderReject  
WITH ENCRYPTION  
AS  
SELECT PurchaseOrderID, ReceivedQty, RejectedQty,   
    RejectedQty / ReceivedQty AS RejectRatio, DueDate  
FROM Purchasing.PurchaseOrderDetail  
WHERE RejectedQty / ReceivedQty > 0  
AND DueDate > CONVERT(DATETIME,'20010630',101) ;  
GO  

C. VERWENDEN DER OPTION "MIT ÜBERPRÜFEN"

Im folgenden Beispiel wird die Sicht mit dem Namen dbo.SeattleOnly gezeigt, die auf fünf Tabellen verweist und Datenänderungen nur bei Mitarbeitern zulässt, die in Seattle leben.

CREATE VIEW dbo.SeattleOnly  
AS  
SELECT p.LastName, p.FirstName, e.JobTitle, a.City, sp.StateProvinceCode  
FROM HumanResources.Employee e  
INNER JOIN Person.Person p  
ON p.BusinessEntityID = e.BusinessEntityID  
    INNER JOIN Person.BusinessEntityAddress bea   
    ON bea.BusinessEntityID = e.BusinessEntityID   
    INNER JOIN Person.Address a   
    ON a.AddressID = bea.AddressID  
    INNER JOIN Person.StateProvince sp   
    ON sp.StateProvinceID = a.StateProvinceID  
WHERE a.City = 'Seattle'  
WITH CHECK OPTION ;  
GO  

D: Verwenden von integrierten Funktionen in einer Ansicht

Das folgende Beispiel zeigt die Definition einer Sicht, die eine integrierte Funktion enthält. Wenn Sie Funktionen verwenden, müssen Sie für die abgeleitete Spalte einen Spaltennamen angeben.

CREATE VIEW Sales.SalesPersonPerform  
AS  
SELECT TOP (100) SalesPersonID, SUM(TotalDue) AS TotalSales  
FROM Sales.SalesOrderHeader  
WHERE OrderDate > CONVERT(DATETIME,'20001231',101)  
GROUP BY SalesPersonID;  
GO  

E. Partitionierte Daten verwenden

Das folgende Beispiel verwendet Tabellen mit den Namen SUPPLY1, SUPPLY2, SUPPLY3 und SUPPLY4. Diese Tabellen entsprechen den Lieferantentabellen aus vier Büros, die sich in verschiedenen Regionen befinden.

--Create the tables and insert the values.  
CREATE TABLE dbo.SUPPLY1 (  
supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 1 and 150),  
supplier CHAR(50)  
);  
CREATE TABLE dbo.SUPPLY2 (  
supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 151 and 300),  
supplier CHAR(50)  
);  
CREATE TABLE dbo.SUPPLY3 (  
supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 301 and 450),  
supplier CHAR(50)  
);  
CREATE TABLE dbo.SUPPLY4 (  
supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 451 and 600),  
supplier CHAR(50)  
);  
GO  
--Create the view that combines all supplier tables.  
CREATE VIEW dbo.all_supplier_view  
WITH SCHEMABINDING  
AS  
SELECT supplyID, supplier  
  FROM dbo.SUPPLY1  
UNION ALL  
SELECT supplyID, supplier  
  FROM dbo.SUPPLY2  
UNION ALL  
SELECT supplyID, supplier  
  FROM dbo.SUPPLY3  
UNION ALL  
SELECT supplyID, supplier  
  FROM dbo.SUPPLY4;  
GO
INSERT dbo.all_supplier_view VALUES ('1', 'CaliforniaCorp'), ('5', 'BraziliaLtd')    
, ('231', 'FarEast'), ('280', 'NZ')  
, ('321', 'EuroGroup'), ('442', 'UKArchip')  
, ('475', 'India'), ('521', 'Afrique');  
GO  

Beispiele: Azure Synapse Analytics und Analytics-Plattformsystem (PDW)

F. Erstellen einer Sicht durch Verknüpfen von zwei Tabellen

Im folgenden Beispiel wird eine Sicht mithilfe der Anweisung SELECT mit OUTER JOIN erstellt. Die Ergebnisse der JOIN-Abfrage füllen die Sicht auf.

CREATE VIEW view1  
AS 
SELECT fis.CustomerKey, fis.ProductKey, fis.OrderDateKey, 
  fis.SalesTerritoryKey, dst.SalesTerritoryRegion  
FROM FactInternetSales AS fis   
LEFT OUTER JOIN DimSalesTerritory AS dst   
ON (fis.SalesTerritoryKey=dst.SalesTerritoryKey);