Udostępnij za pośrednictwem


CREATE VIEW (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w Microsoft FabricMagazyn w Microsoft FabricBaza danych SQL w Microsoft Fabric

Tworzy tabelę wirtualną, której zawartość (kolumny i wiersze) są definiowane przez zapytanie. Użyj tej instrukcji, aby utworzyć widok danych w co najmniej jednej tabeli w bazie danych. Na przykład widok może być używany do następujących celów:

  • Aby skupić się, uprościć i dostosować postrzeganie bazy danych przez każdego użytkownika.

  • Mechanizm zabezpieczeń umożliwiający użytkownikom dostęp do danych za pośrednictwem widoku bez udzielania użytkownikom uprawnień do bezpośredniego uzyskiwania dostępu do bazowych tabel bazowych.

  • Aby zapewnić interfejs zgodny z poprzednimi wersjami w celu emulowania tabeli, której schemat uległ zmianie.

Transact-SQL konwencje składni

Składnia

Składnia dla programu SQL Server i usługi Azure SQL Database.

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 ]
}

Składnia dla usług Azure Synapse Analytics i 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>  

Składnia dla usługi Microsoft Fabric Data Warehouse i punktu końcowego analizy SQL.

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>  

Argumenty (w programowaniu)

LUB ALTER

Dotyczy: Azure SQL Database i SQL Server (począwszy od programu SQL Server 2016 (13.x) SP1).

Warunkowo zmienia widok tylko wtedy, gdy już istnieje.

schema_name
To nazwa schematu, do którego należy widok.

view_name
To nazwa widoku. Nazwy widoków muszą być zgodne z regułami dotyczącymi identyfikatorów. Określanie nazwy właściciela widoku jest opcjonalne.

kolumna
To nazwa, która ma być używana dla kolumny w widoku. Nazwa kolumny jest wymagana tylko wtedy, gdy kolumna pochodzi z wyrażenia arytmetycznego, funkcji lub stałej; jeśli co najmniej dwie kolumny mogą mieć taką samą nazwę, zazwyczaj ze względu na sprzężenia; lub gdy kolumna w widoku jest określona nazwa inna niż kolumna, z której pochodzi. Nazwy kolumn można również przypisać w instrukcji SELECT .

Jeśli kolumna nie jest określona, kolumny widoku uzyskują takie same nazwy jak kolumny w instrukcji SELECT .

Uwaga

W kolumnach widoku uprawnienia do nazwy kolumny mają zastosowanie w CREATE VIEW obrębie instrukcji lub ALTER VIEW niezależnie od źródła danych bazowych. Jeśli na przykład uprawnienia są przyznawane w SalesOrderID kolumnie w instrukcji CREATE VIEW, ALTER VIEW instrukcja może nazwać SalesOrderID kolumnę inną nazwą kolumny, taką jak OrderRef, i nadal mieć uprawnienia skojarzone z widokiem przy użyciu polecenia SalesOrderID.

GDY

Określa akcje, które ma wykonać widok.

select_statement

Instrukcja SELECT definiująca widok. Instrukcja może używać więcej niż jednej tabeli i innych widoków. Odpowiednie uprawnienia są wymagane do wybrania z obiektów, do których odwołuje się SELECT klauzula widoku, który został utworzony.

Widok nie musi być podzbiorem wierszy i kolumn jednej konkretnej tabeli. Można utworzyć widok, który używa więcej niż jednej tabeli lub innych widoków z klauzulą SELECT dowolnej złożoności.

W definicji SELECT widoku indeksowanego instrukcja musi być pojedynczą instrukcją tabeli lub wielotabela JOIN z opcjonalną agregacją.

Klauzule SELECT w definicji widoku nie mogą zawierać następujących klauzul:

  • KlauzulaORDER BY, chyba że istnieje również TOP klauzula na liście select instrukcji SELECT

    Ważne

    Klauzula ORDER BY jest używana tylko do określania wierszy zwracanych przez klauzulę TOP or OFFSET w definicji widoku. Klauzula ORDER BY nie gwarantuje uporządkowanych wyników, gdy widok zostanie zapytany, chyba że ORDER BY zostanie również określony w samym zapytaniu.

  • Słowo kluczowe INTO

  • Klauzula OPTION

  • Odwołanie do tabeli tymczasowej lub zmiennej tabeli.

Ponieważ select_statement używa SELECT instrukcji , ważne jest użycie wskazówek sprzężenia i wskazówek tabeli, jak określono w klauzuli FROM . Aby uzyskać więcej informacji, zobacz FROM (Transact-SQL) i SELECT (Transact-SQL).

Funkcje i wiele SELECT instrukcji rozdzielonych lub UNIONUNION ALL mogą być używane w select_statement.

OPCJA ZAZNACZ

Wymusza wykonanie wszystkich instrukcji modyfikacji danych względem widoku w celu spełnienia kryteriów określonych w select_statement. Po zmodyfikowaniu wiersza za pomocą widoku upewnij się, WITH CHECK OPTION że dane pozostają widoczne w widoku po zatwierdzeniu modyfikacji.

Uwaga

Dotyczy CHECK OPTION tylko aktualizacji wprowadzonych za pośrednictwem widoku. Nie ma możliwości zastosowania do żadnych aktualizacji wykonywanych bezpośrednio w tabelach bazowych widoku.

SZYFROWANIE

Dotyczy: SQL Server 2008 (10.0.x) i nowszych oraz usługi Azure SQL Database.

Szyfruje wpisy w pliku sys.syscomments , które zawierają tekst instrukcji CREATE VIEW . Użycie WITH ENCRYPTION uniemożliwia publikowanie widoku w ramach replikacji programu SQL Server.

POWIĄZANIE SCHEMATU

Wiąże widok ze schematem tabeli lub tabel bazowych. Po SCHEMABINDING określeniu tabeli podstawowej lub tabel nie można modyfikować w sposób, który będzie miał wpływ na definicję widoku. Definicja widoku musi najpierw zostać zmodyfikowana lub porzucona, aby usunąć zależności od tabeli, która ma zostać zmodyfikowana. Jeśli używasz SCHEMABINDINGmetody , select_statement musi zawierać nazwy dwuczęściowe (schemat).obiekt) tabel, widoków lub funkcji zdefiniowanych przez użytkownika, do których odwołuje się odwołanie. Wszystkie obiekty, do których odwołuje się odwołanie, muszą znajdować się w tej samej bazie danych.

Widoki lub tabele, które uczestniczą w widoku utworzonym za pomocą klauzuli SCHEMABINDING, nie mogą zostać usunięte, chyba że ten widok zostanie porzucony lub zmieniony, aby nie miał już powiązania schematu. W przeciwnym razie aparat bazy danych zgłasza błąd. Ponadto wykonywanie instrukcji w tabelach uczestniczących w widokach mających powiązanie schematu kończy się niepowodzeniem ALTER TABLE , gdy te instrukcje wpływają na definicję widoku.

VIEW_METADATA

Określa, że wystąpienie programu SQL Server powróci do biblioteki DB-Library, ODBC i OLE DB interfejsów API metadanych dotyczących widoku, zamiast tabeli podstawowej lub tabel, podczas żądania przeglądania metadanych w trybie przeglądania dla zapytania odwołującego się do widoku. Metadane trybu przeglądania to dodatkowe metadane, które wystąpienie programu SQL Server powraca do tych interfejsów API po stronie klienta. Te metadane umożliwiają interfejsom API po stronie klienta implementowanie aktualizowalnych kursorów po stronie klienta. Metadane trybu przeglądania zawierają informacje o tabeli podstawowej, do których należą kolumny w zestawie wyników.

W przypadku widoków utworzonych za pomocą VIEW_METADATAfunkcji metadane trybu przeglądania zwracają nazwę widoku, a nie nazwy tabel podstawowych podczas opisywania kolumn z widoku w zestawie wyników.

Gdy widok jest tworzony przy użyciu polecenia WITH VIEW_METADATA, wszystkie jego kolumny, z wyjątkiem kolumny sygnatury czasowej , można aktualizować, jeśli widok ma INSTEAD OF INSERT lub INSTEAD OF UPDATE wyzwalacze. Aby uzyskać więcej informacji na temat aktualizowalnych widoków, zobacz Uwagi.

Uwagi

Widok można utworzyć tylko w bieżącej bazie danych. Musi CREATE VIEW być pierwszą instrukcją w partii zapytań. Widok może mieć maksymalnie 1024 kolumny.

Podczas wykonywania zapytań za pośrednictwem widoku aparat bazy danych sprawdza, czy wszystkie obiekty bazy danych, do których odwołuje się dowolne miejsce w instrukcji, i że są prawidłowe w kontekście instrukcji , a instrukcje modyfikacji danych nie naruszają żadnych reguł integralności danych. Sprawdzanie, które kończy się niepowodzeniem, zwraca komunikat o błędzie. Pomyślne sprawdzenie przekłada akcję na akcję względem bazowej tabeli lub tabel.

Jeśli widok zależy od tabeli lub widoku, który został porzucony, aparat bazy danych generuje komunikat o błędzie, gdy ktoś spróbuje użyć widoku. Jeśli zostanie utworzona nowa tabela lub widok, a struktura tabeli nie zmieni się z poprzedniej tabeli bazowej, aby zastąpić tę porzuconą, widok ponownie stanie się bezużyteczny. Jeśli nowa tabela lub struktura widoku ulegnie zmianie, widok musi zostać usunięty i ponownie utworzony.

Jeśli widok nie zostanie utworzony za pomocą SCHEMABINDING klauzuli , uruchom sp_refreshview , gdy zmiany zostaną wprowadzone do obiektów będących podstawą widoku, który ma wpływ na definicję widoku. W przeciwnym razie widok może wygenerować nieoczekiwane wyniki po wysłaniu zapytania.

Po utworzeniu widoku informacje o widoku są przechowywane w następujących widokach wykazu: sys.views, sys.columns i sys.sql_expression_dependencies. Tekst instrukcji CREATE VIEW jest przechowywany w widoku katalogu sys.sql_modules .

Zapytanie korzystające z indeksu w widoku zdefiniowanym za pomocą wyrażeń liczbowych lub zmiennoprzecinkowych może mieć wynik inny niż podobne zapytanie, które nie używa indeksu w widoku. Ta różnica może być spowodowana przez zaokrąglanie błędów podczas operacji INSERT, DELETElub UPDATE akcji w tabelach bazowych.

Aparat bazy danych zapisuje ustawienia SET QUOTED_IDENTIFIER i SET ANSI_NULLS po utworzeniu widoku. Te oryginalne ustawienia są używane do analizowania widoku, gdy widok jest używany. W związku z tym wszystkie ustawienia SET QUOTED_IDENTIFIER sesji klienta i SET ANSI_NULLS nie mają wpływu na definicję widoku, gdy jest uzyskiwany dostęp do widoku.

W usłudze Azure Synapse Analytics widoki nie obsługują powiązania schematu. W związku z tym, jeśli zmiany zostaną wprowadzone w obiektach bazowych, należy usunąć i ponownie utworzyć widok, aby odświeżyć bazowe metadane. Aby uzyskać więcej informacji, zobacz Widoki języka T-SQL z dedykowaną pulą SQL i bezserwerową pulą SQL w usłudze Azure Synapse Analytics.

W usłudze Azure Synapse Analytics możliwe do zaktualizowania widoki wyzwalacze DML (typu AFTER lub INSTEAD OF) i widoki partycjonowane nie są obsługiwane. Aby uzyskać więcej informacji, zobacz Widoki języka T-SQL z dedykowaną pulą SQL i bezserwerową pulą SQL w usłudze Azure Synapse Analytics.

W usłudze Azure Synapse Analytics widoki partycjonowane nie są obsługiwane. Aby uzyskać więcej informacji, zobacz Widoki języka T-SQL z dedykowaną pulą SQL i bezserwerową pulą SQL w usłudze Azure Synapse Analytics.

W usłudze Fabric SQL Database można tworzyć widoki, ale nie są one dublowane w usłudze Fabric OneLake. Aby uzyskać więcej informacji, zobacz Ograniczenia dublowania bazy danych SQL w sieci szkieletowej.

Widoki z możliwością aktualizowania

Dane bazowej tabeli bazowej można modyfikować za pomocą widoku, o ile spełnione są następujące warunki:

  • Wszelkie modyfikacje, w tym UPDATEinstrukcje , INSERTi DELETE , muszą odwoływać się do kolumn tylko z jednej tabeli podstawowej.

  • Kolumny modyfikowane w widoku muszą bezpośrednio odwoływać się do danych bazowych w kolumnach tabeli. Kolumny nie mogą być pochodne w żaden inny sposób, na przykład za pomocą następujących elementów:

    • Funkcja agregacji: AVG, COUNTSUMMINMAXGROUPINGSTDEVSTDEVP, , VAR, i .VARP

    • Obliczenia. Nie można obliczyć kolumny z wyrażenia używającego innych kolumn. Kolumny, które są tworzone przy użyciu operatorów zestawu UNION, UNION ALL, CROSSJOIN, Z WYJĄTKIEM i INTERSECT są również nie do zaktualizowania.

  • Modyfikowane kolumny nie mają wpływu na GROUP BYklauzule , HAVINGlub DISTINCT .

  • Top nie jest używany nigdzie w select_statement widoku wraz z klauzulą WITH CHECK OPTION .

Poprzednie ograniczenia dotyczą wszystkich podzapytaniów w klauzuli FROM widoku, tak jak mają zastosowanie do samego widoku. Ogólnie rzecz biorąc, aparat bazy danych musi mieć możliwość jednoznacznego śledzenia modyfikacji z definicji widoku do jednej tabeli podstawowej. Aby uzyskać więcej informacji, zobacz Modyfikowanie danych za pośrednictwem widoku.

Jeśli poprzednie ograniczenia uniemożliwiają bezpośrednie modyfikowanie danych za pośrednictwem widoku, rozważ następujące opcje:

  • ZAMIAST WYZWALACZY

    INSTEAD OF wyzwalacze można tworzyć w widoku, aby widok był aktualizowalny. Wyzwalacz INSTEAD OF jest wykonywany zamiast instrukcji modyfikacji danych, na której zdefiniowano wyzwalacz. Ten wyzwalacz umożliwia użytkownikowi określenie zestawu akcji, które muszą zostać wykonane w celu przetworzenia instrukcji modyfikacji danych. W związku z tym, jeśli INSTEAD OF wyzwalacz istnieje dla widoku określonej instrukcji modyfikacji danych (INSERT, UPDATE, lub DELETE), odpowiedni widok jest aktualizowalny za pomocą tej instrukcji. Aby uzyskać więcej informacji na temat INSTEAD OF wyzwalaczy, zobacz Wyzwalacze DML.

  • Widoki podzielone na partycje

    Jeśli widok jest widokiem podzielonym na partycje, widok można aktualizować, z zastrzeżeniem pewnych ograniczeń. Gdy jest to konieczne, aparat bazy danych rozróżnia widoki partycjonowane lokalnie jako widoki, w których wszystkie uczestniczące tabele i widok znajdują się w tym samym wystąpieniu programu SQL Server, oraz rozproszone widoki partycjonowane co widoki, w których co najmniej jedna z tabel w widoku znajduje się na innym lub zdalnym serwerze.

Widoki partycjonowane

Widok podzielony na partycje jest widokiem zdefiniowanym przez UNION ALL tabele składowe ustrukturyzowane w taki sam sposób, ale przechowywany oddzielnie jako wiele tabel w tym samym wystąpieniu programu SQL Server lub w grupie autonomicznych wystąpień serwerów programu SQL Server, nazywanych serwerami federacyjnych baz danych.

Uwaga

Preferowaną metodą partycjonowania danych lokalnych na jeden serwer jest partycjonowanie tabel. Aby uzyskać więcej informacji, zobacz Partycjonowane tabele i indeksy.

Podczas projektowania schematu partycjonowania musi być jasne, jakie dane należą do każdej partycji. Na przykład dane tabeli Customers są dystrybuowane w trzech tabelach składowych w trzech lokalizacjach serwera: Customers_33 na , na Server1, Customers_66 i Server2Customers_99 na Server3.

Widok podzielony na Server1 partycje jest zdefiniowany w następujący sposób:

--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;  

Ogólnie rzecz biorąc, widok jest postrzegany jako widok partycjonowany, jeśli ma następującą postać:

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

Warunki tworzenia partycjonowanych widoków

  1. Wybór list

    • Na liście kolumn definicji widoku wybierz wszystkie kolumny w tabelach składowych.

    • Upewnij się, że kolumny w tej samej pozycji porządkowej każdego z nich select list są tego samego typu, w tym sortowania. Nie wystarczy, aby kolumny byłyby niejawnie konwertowane, podobnie jak w przypadku .UNION

      Ponadto co najmniej jedna kolumna (na przykład <col>) musi być wyświetlana we wszystkich listach wyboru w tej samej pozycji porządkowej. Zdefiniuj <col> w sposób, w jaki tabele T1, ..., Tn składowe mają odpowiednio zdefiniowane ograniczenia C1, ..., Cn CHECK dla <col>elementu .

      C1 Ograniczenie zdefiniowane w tabeli T1 musi mieć następującą postać:

      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 >  
      
    • Ograniczenia muszą być w taki sposób, aby każda określona wartość <col> mogła spełnić co najwyżej jedno z ograniczeń C1, ..., Cn , tak aby ograniczenia tworzyły zestaw rozłącznych lub nieprzełączających się interwałów. Kolumna <col> , w której zdefiniowano rozłączne ograniczenia, jest nazywana kolumną partycjonowania. Kolumna partycjonowania może mieć różne nazwy w tabelach bazowych. Ograniczenia muszą być w stanie włączonym i zaufanym, aby spełniały wymienione wcześniej warunki kolumny partycjonowania. Jeśli ograniczenia są wyłączone, ponownie włącz sprawdzanie ograniczeń przy użyciu CHECK CONSTRAINT *constraint_name* opcji ALTER TABLEi użyj WITH CHECK opcji , aby je zweryfikować.

      W poniższych przykładach przedstawiono prawidłowe zestawy ograniczeń:

      { [col < 10], [col between 11 and 20] , [col > 20] }  
      { [col between 11 and 20], [col between 21 and 30], [col between 31 and 100] }  
      
    • Tej samej kolumny nie można używać wiele razy na liście wyboru.

  2. Kolumna partycjonowania

    • Kolumna partycjonowania jest częścią KLUCZA PODSTAWOWEgo tabeli.

    • Nie może to być kolumna obliczana, tożsamość, domyślna ani sygnatura czasowa .

    • Jeśli w tabeli składowej istnieje więcej niż jedno ograniczenie, aparat bazy danych ignoruje wszystkie ograniczenia i nie uwzględnia ich podczas określania, czy widok jest widokiem podzielonym na partycje. Aby spełnić warunki widoku partycjonowanego, upewnij się, że w kolumnie partycjonowania istnieje tylko jedno ograniczenie partycjonowania.

    • Brak ograniczeń dotyczących aktualizowania kolumny partycjonowania.

  3. Tabele składowe lub tabele bazowe T1, ..., Tn

    • Tabele mogą być tabelami lokalnymi lub tabelami z innych komputerów z uruchomionym programem SQL Server, do których odwołuje się czteroczęściowa nazwa lub nazwa openDATASOURCE lub OPENROWSET. Składnia OPENDATASOURCE i OPENROWSET może określać nazwę tabeli, ale nie zapytanie przekazywane. Aby uzyskać więcej informacji, zobacz OPENDATASOURCE (Transact-SQL) i OPENROWSET (Transact-SQL).

      Jeśli co najmniej jedna tabela składowa jest zdalna, widok jest nazywany widokiem podzielonym na partycje i mają zastosowanie dodatkowe warunki. Zostały one opisane w dalszej części tej sekcji.

    • Ta sama tabela nie może pojawić się dwa razy w zestawie tabel połączonych z instrukcją UNION ALL .

    • Tabele składowe nie mogą zawierać indeksów utworzonych dla obliczonych kolumn w tabeli.

    • Tabele składowe mają wszystkie ograniczenia KLUCZA PODSTAWOWEgo dla tej samej liczby kolumn.

    • Wszystkie tabele składowe w widoku mają to samo ustawienie dopełniania ANSI. Można to ustawić przy użyciu opcji opcji użytkownika w sp_configure lub instrukcji SET.

Warunki modyfikowania danych w widokach partycjonowanych

Następujące ograniczenia dotyczą instrukcji modyfikujących dane w widokach partycjonowanych:

  • Instrukcja INSERT dostarcza wartości dla wszystkich kolumn w widoku, nawet jeśli tabele składowych bazowych mają DEFAULT ograniczenie dla tych kolumn lub jeśli zezwalają na NULL wartości. W przypadku tych kolumn tabeli składowej, które mają DEFAULT definicje, instrukcje nie mogą jawnie używać słowa kluczowego DEFAULT.

  • Wartość wstawiona do kolumny partycjonowania spełnia co najmniej jedno z podstawowych ograniczeń; w przeciwnym razie akcja wstawiania kończy się niepowodzeniem z naruszeniem ograniczenia.

  • UPDATE instrukcje nie mogą określać DEFAULT słowa kluczowego jako wartości w klauzuli SET , nawet jeśli kolumna ma wartość zdefiniowaną DEFAULT w odpowiedniej tabeli składowej.

  • Kolumny w widoku, które są kolumną tożsamości w co najmniej jednej tabeli składowej, nie mogą być modyfikowane przy użyciu instrukcji INSERT lub UPDATE .

  • Jeśli jedna z tabel składowych zawiera kolumnę znacznika czasu , nie można modyfikować danych przy użyciu instrukcji INSERT lub UPDATE .

  • Jeśli jedna z tabel składowych zawiera wyzwalacz lub ograniczenie, ON UPDATE CASCADE/SET NULL/SET DEFAULTON DELETE CASCADE/SET NULL/SET DEFAULT nie można zmodyfikować widoku.

  • INSERT, UPDATEi DELETE akcje względem widoku partycjonowanego są niedozwolone, jeśli istnieje samosprzężenia z tym samym widokiem lub z dowolną tabelą składową w instrukcji .

  • Zbiorcze importowanie danych do widoku partycjonowanego nie jest obsługiwane przez bcp instrukcje BULK INSERT i .INSERT ... SELECT * FROM OPENROWSET(BULK...) Można jednak wstawić wiele wierszy do widoku partycjonowanego przy użyciu instrukcji INSERT .

    Uwaga

    Aby zaktualizować widok partycjonowany, użytkownik musi mieć INSERTuprawnienia , UPDATEi DELETE w tabelach składowych.

Dodatkowe warunki dla rozproszonych widoków partycjonowanych

W przypadku widoków podzielonych na partycje rozproszone (gdy co najmniej jedna tabela składowa jest zdalna), obowiązują następujące dodatkowe warunki:

  • Transakcja rozproszona jest uruchamiana w celu zagwarantowania niepodzielności we wszystkich węzłach, na które ma wpływ aktualizacja.

  • XACT_ABORT SET Ustaw opcję na ON wartość dla INSERTinstrukcji , UPDATElubDELETE, aby działały.

  • Wszystkie kolumny w tabelach zdalnych typu smallmoney , do których odwołuje się widok partycjonowany, są mapowane jako pieniądze. W związku z tym odpowiednie kolumny (w tej samej pozycji porządkowej na liście wyboru) w tabelach lokalnych muszą być również typu pieniądze.

  • W obszarze zgodność bazy danych poziom 110 i wyższy wszystkie kolumny w tabelach zdalnych typu smalldatetime , które są przywoływane w widoku partycjonowanym, są mapowane jako smalldatetime. Odpowiednie kolumny (w tej samej pozycji porządkowej na liście wyboru) w tabelach lokalnych muszą być małedatetime. Jest to zmiana zachowania z wcześniejszych wersji programu SQL Server, w których wszystkie kolumny w tabelach zdalnych typu smalldatetime , które są przywoływane w widoku partycjonowanym, są mapowane jako data/godzina , a odpowiadające im kolumny w tabelach lokalnych muszą być typu data/godzina. Aby uzyskać więcej informacji, zobacz ALTER DATABASE Compatibility Level (Transact-SQL).

  • Żaden połączony serwer w widoku podzielonym na partycje nie może być serwerem połączonym sprzężonym. Jest to serwer połączony, który wskazuje to samo wystąpienie programu SQL Server.

Ustawienie SET ROWCOUNT opcji jest ignorowane dla INSERTakcji , iUPDATEDELETE, które obejmują aktualizowalne widoki partycjonowane i tabele zdalne.

Gdy tabele składowe i zdefiniowana definicja widoku partycjonowanego są tworzone, optymalizator zapytań programu SQL Server tworzy inteligentne plany korzystające z zapytań w celu wydajnego uzyskiwania dostępu do danych z tabel składowych. W przypadku CHECK definicji ograniczeń procesor zapytań mapuje rozkład wartości kluczy w tabelach składowych. Gdy użytkownik wystawia zapytanie, procesor zapytań porównuje mapę z wartościami określonymi w WHERE klauzuli i tworzy plan wykonywania z minimalną ilością transferu danych między serwerami członkowskim. W związku z tym, jeśli niektóre tabele członkowskie znajdują się na serwerach zdalnych, wystąpienie programu SQL Server rozwiązuje rozproszone zapytania, tak aby ilość rozproszonych danych, które mają być przesyłane, jest minimalna.

Zagadnienia dotyczące replikacji

Aby utworzyć widoki partycjonowane w tabelach składowych, które są zaangażowane w replikację, należy wziąć pod uwagę następujące kwestie:

  • Jeśli tabele bazowe są zaangażowane w replikację scalania lub replikację transakcyjną z aktualizowaniem subskrypcji, upewnij się, że unikatowa kolumnaidentyfikatora jest również uwzględniona na liście wyboru.

    Wszystkie INSERT akcje w widoku podzielonym na partycje muszą podać NEWID() wartość dla kolumny uniqueidentifier . Wszystkie akcje UPDATE względem kolumny uniqueidentifier muszą być dostarczane NEWID() jako wartość, ponieważ nie można użyć słowa kluczowego DEFAULT.

  • Replikacja aktualizacji wykonanych przy użyciu widoku jest taka sama jak w przypadku replikacji tabel w dwóch różnych bazach danych: tabele są obsługiwane przez różnych agentów replikacji, a kolejność aktualizacji nie jest gwarantowana.

Uprawnienia

Wymaga uprawnienia CREATE VIEW w bazie danych i uprawnienia ALTER w schemacie, w którym jest tworzony widok.

Przykłady

W poniższych przykładach użyto AdventureWorks2022 bazy danych lub AdventureWorksDW2022 .

Odp. Tworzenie widoku za pomocą polecenia CREATE VIEW

Poniższy przykład tworzy widok przy użyciu instrukcji SELECT . Prosty widok jest przydatny w przypadku częstego wykonywania zapytań dotyczących kombinacji kolumn. Dane z tego widoku pochodzą z HumanResources.Employee tabel i Person.Person bazy danych AdventureWorks2022. Dane zawierają informacje o nazwie i dacie zatrudnienia pracowników cyklu Adventure Works Cycles. Widok można utworzyć dla osoby odpowiedzialnej za śledzenie rocznic pracy, ale bez udzielania tej osobie dostępu do wszystkich danych w tych tabelach.

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. Używanie funkcji WITH ENCRYPTION

W poniższym przykładzie użyto WITH ENCRYPTION opcji i przedstawiono obliczone kolumny, kolumny o zmienionej nazwie i wiele kolumn.

Dotyczy: SQL Server 2008 (10.0.x) i nowsze oraz SQL Database.

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. UŻYJ OPCJI WYBORU Z OPCJĄ WYBORU

W poniższym przykładzie przedstawiono widok o nazwie dbo.SeattleOnly , który odwołuje się do pięciu tabel i umożliwia modyfikacje danych, które mają zastosowanie tylko do pracowników mieszkających w Seattle.

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. Używanie wbudowanych funkcji w widoku

W poniższym przykładzie przedstawiono definicję widoku, która zawiera wbudowaną funkcję. W przypadku korzystania z funkcji należy określić nazwę kolumny pochodnej.

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. Używanie danych partycjonowanych

W poniższym przykładzie użyto tabel o nazwach SUPPLY1, , SUPPLY2SUPPLY3i SUPPLY4. Te tabele odpowiadają tabelom dostawców z czterech biur znajdujących się w różnych regionach.

--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  

Przykłady: Azure Synapse Analytics and Analytics Platform System (PDW)

F. Tworzenie widoku przez łączenie dwóch tabel

Poniższy przykład tworzy widok przy użyciu SELECT instrukcji z elementem OUTER JOIN. Wyniki zapytania sprzężenia wypełniają widok.

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