Udostępnij za pośrednictwem


ALTER TABLE (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Warehouse w usłudze Microsoft Fabric

Modyfikuje definicję tabeli, zmieniając, dodając lub upuszczając kolumny i ograniczenia. ALTER TABLE również ponownie przypisuje i ponownie kompiluje partycje lub wyłącza i włącza ograniczenia i wyzwalacze.

Nuta

Obecnie ALTER TABLE w magazynie sieci szkieletowej jest obsługiwana tylko w przypadku ograniczeń i dodawania kolumn dopuszczanych do wartości null. Zobacz Składnia magazynu w usłudze Fabric.

Ważny

Składnia alter TABLE różni się w przypadku tabel opartych na dyskach i tabel zoptymalizowanych pod kątem pamięci. Skorzystaj z poniższych linków, aby przejść bezpośrednio do odpowiedniego bloku składni dla typów tabel i do odpowiednich przykładów składni:

  • Tabele oparte na dyskach:

  • składni

  • Przykłady

  • Tabele zoptymalizowane pod kątem pamięci

  • składni

  • Przykłady

Aby uzyskać więcej informacji na temat konwencji składni, zobacz Transact-SQL konwencje składni.

Składnia tabel opartych na dyskach

ALTER TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
{
    ALTER COLUMN column_name
    {
        [ type_schema_name. ] type_name
            [ (
                {
                   precision [ , scale ]
                 | max
                 | xml_schema_collection
                }
            ) ]
        [ COLLATE collation_name ]
        [ NULL | NOT NULL ] [ SPARSE ]
      | { ADD | DROP }
          { ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION | SPARSE | HIDDEN }
      | { ADD | DROP } MASKED [ WITH ( FUNCTION = ' mask_function ') ]
    }
    [ WITH ( ONLINE = ON | OFF ) ]
    | [ WITH { CHECK | NOCHECK } ]
  
    | ADD
    {
        <column_definition>
      | <computed_column_definition>
      | <table_constraint>
      | <column_set_definition>
    } [ ,...n ]
      | [ system_start_time_column_name datetime2 GENERATED ALWAYS AS ROW START
                [ HIDDEN ] [ NOT NULL ] [ CONSTRAINT constraint_name ]
            DEFAULT constant_expression [WITH VALUES] ,
                system_end_time_column_name datetime2 GENERATED ALWAYS AS ROW END
                   [ HIDDEN ] [ NOT NULL ][ CONSTRAINT constraint_name ]
            DEFAULT constant_expression [WITH VALUES] ,
                start_transaction_id_column_name bigint GENERATED ALWAYS AS TRANSACTION_ID START
                   [ HIDDEN ] NOT NULL [ CONSTRAINT constraint_name ]
            DEFAULT constant_expression [WITH VALUES],
                  end_transaction_id_column_name bigint GENERATED ALWAYS AS TRANSACTION_ID END
                   [ HIDDEN ] NULL [ CONSTRAINT constraint_name ]
            DEFAULT constant_expression [WITH VALUES],
                  start_sequence_number_column_name bigint GENERATED ALWAYS AS SEQUENCE_NUMBER START
                   [ HIDDEN ] NOT NULL [ CONSTRAINT constraint_name ]
            DEFAULT constant_expression [WITH VALUES],
                  end_sequence_number_column_name bigint GENERATED ALWAYS AS SEQUENCE_NUMBER END
                   [ HIDDEN ] NULL [ CONSTRAINT constraint_name ]
            DEFAULT constant_expression [WITH VALUES]
        ]
       PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )
    | DROP
     [ {
         [ CONSTRAINT ][ IF EXISTS ]
         {
              constraint_name
              [ WITH
               ( <drop_clustered_constraint_option> [ ,...n ] )
              ]
          } [ ,...n ]
          | COLUMN [ IF EXISTS ]
          {
              column_name
          } [ ,...n ]
          | PERIOD FOR SYSTEM_TIME
     } [ ,...n ]
    | [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT
        { ALL | constraint_name [ ,...n ] }
  
    | { ENABLE | DISABLE } TRIGGER
        { ALL | trigger_name [ ,...n ] }
  
    | { ENABLE | DISABLE } CHANGE_TRACKING
        [ WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } ) ]
  
    | SWITCH [ PARTITION source_partition_number_expression ]
        TO target_table
        [ PARTITION target_partition_number_expression ]
        [ WITH ( <low_priority_lock_wait> ) ]

    | SET
        (
            [ FILESTREAM_ON =
                { partition_scheme_name | filegroup | "default" | "NULL" } ]
            | SYSTEM_VERSIONING =
                  {
                    OFF
                  | ON
                      [ ( HISTORY_TABLE = schema_name . history_table_name
                          [, DATA_CONSISTENCY_CHECK = { ON | OFF } ]
                          [, HISTORY_RETENTION_PERIOD =
                          {
                              INFINITE | number {DAY | DAYS | WEEK | WEEKS
                  | MONTH | MONTHS | YEAR | YEARS }
                          }
                          ]
                        )
                      ]
                  }
            | DATA_DELETION =
                {
                      OFF
                    | ON
                        [(  [ FILTER_COLUMN = column_name ]
                            [, RETENTION_PERIOD = { INFINITE | number {DAY | DAYS | WEEK | WEEKS
                                    | MONTH | MONTHS | YEAR | YEARS }}]
                        )]
                    }
    | REBUILD
      [ [PARTITION = ALL]
        [ WITH ( <rebuild_option> [ ,...n ] ) ]
      | [ PARTITION = partition_number
           [ WITH ( <single_partition_rebuild_option> [ ,...n ] ) ]
        ]
      ]
  
    | <table_option>
    | <filetable_option>
    | <stretch_configuration>
}
[ ; ]
  
-- ALTER TABLE options
  
<column_set_definition> ::=
    column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS

<drop_clustered_constraint_option> ::=
    {
        MAXDOP = max_degree_of_parallelism
      | ONLINE = { ON | OFF }
      | MOVE TO
         { partition_scheme_name ( column_name ) | filegroup | "default" }
    }
<table_option> ::=
    {
        SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
    }
  
<filetable_option> ::=
    {
       [ { ENABLE | DISABLE } FILETABLE_NAMESPACE ]
       [ SET ( FILETABLE_DIRECTORY = directory_name ) ]
    }
  
<stretch_configuration> ::=
    {
      SET (
        REMOTE_DATA_ARCHIVE
        {
            = ON (<table_stretch_options>)
          | = OFF_WITHOUT_DATA_RECOVERY ( MIGRATION_STATE = PAUSED )
          | ( <table_stretch_options> [, ...n] )
        }
            )
    }
  
<table_stretch_options> ::=
    {
     [ FILTER_PREDICATE = { null | table_predicate_function } , ]
       MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }
    }
  
<single_partition_rebuild__option> ::=
{
      SORT_IN_TEMPDB = { ON | OFF }
    | MAXDOP = max_degree_of_parallelism
    | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE} }
    | ONLINE = { ON [( <low_priority_lock_wait> ) ] | OFF }
}
  
<low_priority_lock_wait>::=
{
    WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ],
        ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )
}

Składnia tabel zoptymalizowanych pod kątem pamięci

ALTER TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
{
    ALTER COLUMN column_name
    {
        [ type_schema_name. ] type_name
            [ (
                {
                   precision [ , scale ]
                }
            ) ]
        [ COLLATE collation_name ]
        [ NULL | NOT NULL ]
    }

    | ALTER INDEX index_name
    {
        [ type_schema_name. ] type_name
        REBUILD
        [ [ NONCLUSTERED ] WITH ( BUCKET_COUNT = bucket_count )
        ]
    }

    | ADD
    {
        <column_definition>
      | <computed_column_definition>
      | <table_constraint>
      | <table_index>
      | <column_index>
    } [ ,...n ]
  
    | DROP
     [ {
         CONSTRAINT [ IF EXISTS ]
         {
              constraint_name
          } [ ,...n ]
        | INDEX [ IF EXISTS ]
      {
         index_name
       } [ ,...n ]
          | COLUMN [ IF EXISTS ]
          {
              column_name
          } [ ,...n ]
          | PERIOD FOR SYSTEM_TIME
     } [ ,...n ]
    | [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT
        { ALL | constraint_name [ ,...n ] }

    | { ENABLE | DISABLE } TRIGGER
        { ALL | trigger_name [ ,...n ] }
  
    | SWITCH [ [ PARTITION ] source_partition_number_expression ]
        TO target_table
        [ PARTITION target_partition_number_expression ]
        [ WITH ( <low_priority_lock_wait> ) ]
    
}
[ ; ]

-- ALTER TABLE options

< table_constraint > ::=
 [ CONSTRAINT constraint_name ]
{
   {PRIMARY KEY | UNIQUE }
     {
       NONCLUSTERED (column [ ASC | DESC ] [ ,... n ])
       | NONCLUSTERED HASH (column [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
     }
    | FOREIGN KEY
        ( column [ ,...n ] )
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]
    | CHECK ( logical_expression )
}

<column_index> ::=
  INDEX index_name
{ [ NONCLUSTERED ] | [ NONCLUSTERED ] HASH WITH (BUCKET_COUNT = bucket_count)}

<table_index> ::=
  INDEX index_name
{[ NONCLUSTERED ] HASH (column [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count)
  | [ NONCLUSTERED ] (column [ ASC | DESC ] [ ,... n ] )
      [ ON filegroup_name | default ]
  | CLUSTERED COLUMNSTORE [WITH ( COMPRESSION_DELAY = {0 | delay [Minutes]})]
      [ ON filegroup_name | default ]
}

Składnia dla usług Azure Synapse Analytics i Parallel Data Warehouse

-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse

ALTER TABLE { database_name.schema_name.source_table_name | schema_name.source_table_name | source_table_name }
{
    ALTER COLUMN column_name
        {
            type_name [ ( precision [ , scale ] ) ]
            [ COLLATE Windows_collation_name ]
            [ NULL | NOT NULL ]
        }
    | ADD { <column_definition> | <column_constraint> FOR column_name} [ ,...n ]
    | DROP { COLUMN column_name | [CONSTRAINT] constraint_name } [ ,...n ]
    | REBUILD {
            [ PARTITION = ALL [ WITH ( <rebuild_option> ) ] ]
          | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_option> ] ]
      }
    | { SPLIT | MERGE } RANGE (boundary_value)
    | SWITCH [ PARTITION source_partition_number
        TO target_table_name [ PARTITION target_partition_number ] [ WITH ( TRUNCATE_TARGET = ON | OFF )
}
[;]

<column_definition>::=
{
    column_name
    type_name [ ( precision [ , scale ] ) ]
    [ <column_constraint> ]
    [ COLLATE Windows_collation_name ]
    [ NULL | NOT NULL ]
}

<column_constraint>::=
    [ CONSTRAINT constraint_name ]
    {
        DEFAULT constant_expression
        | PRIMARY KEY NONCLUSTERED (column_name [ ,... n ]) NOT ENFORCED -- Applies to Azure Synapse Analytics only
        | UNIQUE (column_name [ ,... n ]) NOT ENFORCED -- Applies to Azure Synapse Analytics only
    }
<rebuild_option > ::=
{
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
        [ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]
    | XML_COMPRESSION = { ON | OFF }
        [ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]
}

<single_partition_rebuild_option > ::=
{
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
}

Nuta

Bezserwerowa pula SQL w usłudze Azure Synapse Analytics obsługuje tylko zewnętrznych i tymczasowych tabel.

Składnia magazynu w sieci szkieletowej

-- Syntax for Warehouse om Microsoft Fabric:

ALTER TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
{
  ADD  { column_name <data_type> [COLLATE collation_name] [ <column_options> ] } [ ,...n ]
| ADD { <column_constraint> FOR column_name} [ ,...n ]
| DROP { [CONSTRAINT] constraint_name } [ ,...n ]
}
[ ; ]

<column_options> ::=
[ NULL ] -- default is NULL

<data type> ::=
datetime2 ( n )
| date
| time ( n )
| float [ ( n ) ]
| real [ ( n ) ]
| decimal [ ( precision [ , scale ] ) ]
| numeric [ ( precision [ , scale ] ) ]
| bigint
| int
| smallint
| bit
| varchar [ ( n ) ]
| char [ ( n ) ]
| varbinary [ ( n ) ]
| uniqueidentifier

<column_constraint>::=
    [ CONSTRAINT constraint_name ]
    {
       PRIMARY KEY NONCLUSTERED (column_name [ ,... n ]) NOT ENFORCED
        | UNIQUE NONCLUSTERED (column_name [ ,... n ]) NOT ENFORCED
    | FOREIGN KEY
        ( column [ ,...n ] )
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ] NOT ENFORCED
    }

Argumenty

database_name

Nazwa bazy danych, w której została utworzona tabela.

schema_name

Nazwa schematu, do którego należy tabela.

table_name

Nazwa tabeli, która ma zostać zmieniona. Jeśli tabela nie znajduje się w bieżącej bazie danych lub znajduje się w schemacie należącym do bieżącego użytkownika, musisz jawnie określić bazę danych i schemat.

ALTER COLUMN

Określa, że nazwana kolumna ma zostać zmieniona lub zmieniona.

Zmodyfikowana kolumna nie może być:

  • Kolumna z sygnaturą czasową typ danych.

  • Kolumna ROWGUIDCOL dla tabeli.

  • Obliczona kolumna lub używana w obliczonej kolumnie.

  • Używane w statystykach generowanych przez instrukcję CREATE STATISTICS. Użytkownicy muszą uruchamiać STATYSTYKI DROP, aby usunąć statystyki, zanim funkcja ALTER COLUMN powiedzie się. Uruchom to zapytanie, aby pobrać wszystkie kolumny statystyk i statystyk dla tabeli przez użytkownika.

    SELECT s.name AS statistics_name
           ,c.name AS column_name
           ,sc.stats_column_id
    FROM sys.stats AS s
    INNER JOIN sys.stats_columns AS sc
         ON s.object_id = sc.object_id AND s.stats_id = sc.stats_id
    INNER JOIN sys.columns AS c
         ON sc.object_id = c.object_id AND c.column_id = sc.column_id
    WHERE s.object_id = OBJECT_ID('<table_name>');
    

    Nuta

    Statystyki generowane automatycznie przez optymalizator zapytań są automatycznie porzucane przez ALTER COLUMN.

  • Używany w ograniczeniu KLUCZ PODSTAWOWY lub [KLUCZ OBCY] .

  • Używany w ograniczeniu CHECK lub UNIQUE. Jednak zmiana długości kolumny o zmiennej długości używanej w ograniczeniu CHECK lub UNIQUE jest dozwolona.

  • Skojarzone z definicją domyślną. Jednak długość, precyzja lub skala kolumny można zmienić, jeśli typ danych nie zostanie zmieniony.

Typ danych tekstu, ntexti kolumn obrazu można zmienić tylko w następujący sposób:

  • tekstvarchar(max), nvarchar(max)lub xml
  • ntextvarchar(max), nvarchar(max)lub xml
  • obrazuvarbinary(max)

Niektóre zmiany typu danych mogą spowodować zmianę danych. Na przykład zmiana kolumny nchar lub nvarchar na char lub varcharmoże spowodować konwersję znaków rozszerzonych. Aby uzyskać więcej informacji, zobacz CAST i CONVERT. Zmniejszenie dokładności lub skali kolumny może spowodować obcięcie danych.

Nuta

Nie można zmienić typu danych kolumny tabeli partycjonowanej.

Nie można zmienić typu danych kolumn zawartych w indeksie, chyba że kolumna jest varchar, nvarcharlub varbinary typu danych, a nowy rozmiar jest równy lub większy niż stary rozmiar.

Nie można zmienić kolumny zawartej w ograniczeniu klucza podstawowego z NOT NULL na NULL.

W przypadku używania funkcji Always Encrypted (bez bezpiecznych enklaw), jeśli modyfikowana kolumna jest szyfrowana za pomocą funkcji "ENCRYPTED WITH", możesz zmienić typ danych na zgodny typ danych (np. INT na BIGINT), ale nie można zmienić żadnych ustawień szyfrowania.

W przypadku używania funkcji Always Encrypted z bezpiecznymi enklawami można zmienić dowolne ustawienie szyfrowania, jeśli klucz szyfrowania kolumny chroni kolumnę (i nowy klucz szyfrowania kolumny, jeśli zmieniasz klucz) obsługuje obliczenia enklaw (zaszyfrowane przy użyciu kluczy głównych kolumn z obsługą enklawy). Aby uzyskać szczegółowe informacje, zobacz Always Encrypted z bezpiecznymi enklawami.

Podczas modyfikowania kolumny aparat bazy danych śledzi każdą modyfikację, dodając wiersz w tabeli systemowej i oznaczając poprzednią modyfikację kolumny jako porzuconą kolumnę. W rzadkich przypadkach modyfikowanie kolumny jest zbyt wiele razy, aparat bazy danych może osiągnąć limit rozmiaru rekordu. W takim przypadku wystąpi błąd 511 lub 1708. Aby uniknąć tych błędów, należy okresowo ponownie skompilować indeks klastrowany w tabeli lub zmniejszyć liczbę modyfikacji kolumn.

column_name

Nazwa kolumny, która ma zostać zmieniona, dodana lub porzucona. Maksymalna column_name wynosi 128 znaków. W przypadku nowych kolumn można pominąć column_name dla kolumn utworzonych przy użyciu znacznika czasu typu danych. Nazwa sygnatury czasowej jest używana, jeśli nie określisz column_name dla sygnatury czasowej kolumny typu danych.

Nuta

Nowe kolumny są dodawane po zmianie wszystkich istniejących kolumn w tabeli.

[ type_schema_name. ] type_name

Nowy typ danych dla zmienionej kolumny lub typ danych dla dodanej kolumny. Nie można określić type_name dla istniejących kolumn tabel partycjonowanych. type_name może być jednym z następujących typów:

  • Typ danych systemowych programu SQL Server.
  • Typ danych aliasu oparty na typie danych systemowych programu SQL Server. Typy danych aliasu są tworzone za pomocą instrukcji CREATE TYPE, zanim będą one używane w definicji tabeli.
  • Typ zdefiniowany przez użytkownika programu .NET Framework i schemat, do którego należy. Typy zdefiniowane przez użytkownika są tworzone za pomocą instrukcji CREATE TYPE, zanim będą one używane w definicji tabeli.

Poniżej przedstawiono kryteria type_name zmienionej kolumny:

  • Poprzedni typ danych musi być niejawnie konwertowany na nowy typ danych.
  • type_name nie można sygnatury czasowej.
  • ANSI_NULL wartości domyślne są zawsze włączone dla funkcji ALTER COLUMN; jeśli nie zostanie określona, kolumna jest dopuszczana do wartości null.
  • ANSI_PADDING dopełnienie jest zawsze włączone dla funkcji ALTER COLUMN.
  • Jeśli zmodyfikowana kolumna jest kolumną tożsamości, new_data_type musi być typem danych obsługującym właściwość tożsamości.
  • Bieżące ustawienie dla zestawu ARITHABORT jest ignorowane. FUNKCJA ALTER TABLE działa tak, jakby właściwość ARITHABORT jest ustawiona na WARTOŚĆ WŁĄCZONE.

Nuta

Jeśli nie określono klauzuli COLLATE, zmiana typu danych kolumny powoduje zmianę sortowania na domyślne sortowanie bazy danych.

precyzji

Precyzja określonego typu danych. Aby uzyskać więcej informacji na temat prawidłowych wartości dokładności, zobacz precyzji, skalowania i długości.

skalowanie

Skala dla określonego typu danych. Aby uzyskać więcej informacji na temat prawidłowych wartości skalowania, zobacz precyzji, skalowania i długości.

Max

Dotyczy tylko varchar, nvarchari typów danych do przechowywania 2^31–1 bajtów znaków, danych binarnych i danych Unicode.

xml_schema_collection

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

Dotyczy tylko typu danych xml xml w celu skojarzenia schematu XML z typem. Przed wpisaniem kolumny xml do kolekcji schematów należy najpierw utworzyć kolekcję schematów w bazie danych przy użyciu CREATE XML SCHEMA COLLECTION.

SORTOWANIE <collation_name>

Określa nowe sortowanie dla zmienionej kolumny. Jeśli nie zostanie określona, kolumna zostanie przypisana do domyślnego sortowania bazy danych. Nazwa sortowania może być nazwą sortowania systemu Windows lub nazwą sortowania SQL. Aby uzyskać listę i więcej informacji, zobacz Nazwa sortowania systemu Windows i nazwa sortowania programu SQL Server.

Klauzula COLLATE zmienia sortowania tylko kolumn char, varchar, nchari nvarchar typów danych. Aby zmienić sortowanie kolumny typu danych aliasu zdefiniowanego przez użytkownika, użyj oddzielnych instrukcji ALTER TABLE, aby zmienić kolumnę na typ danych systemowych programu SQL Server. Następnie zmień sortowanie i zmień kolumnę z powrotem na typ danych aliasu.

Funkcja ALTER COLUMN nie może zmienić sortowania, jeśli istnieje co najmniej jeden z następujących warunków:

  • Jeśli ograniczenie CHECK, ograniczenie KLUCZA OBCEgo lub obliczone kolumny odwołują się do kolumny zmienionej.
  • Jeśli w kolumnie są tworzone jakiekolwiek indeksy, statystyki lub indeks pełnotekstowy. Statystyki utworzone automatycznie w zmienionej kolumnie zostaną porzucone, jeśli sortowanie kolumn zostanie zmienione.
  • Jeśli widok lub funkcja powiązana ze schematem odwołuje się do kolumny.

Aby uzyskać więcej informacji, zobacz COLLATE.

NULL | NOT NULL

Określa, czy kolumna może akceptować wartości null. Kolumny, które nie zezwalają na wartości null, są dodawane przy użyciu funkcji ALTER TABLE tylko wtedy, gdy mają one wartość domyślną lub jeśli tabela jest pusta. Można określić wartość NOT NULL dla obliczonych kolumn tylko wtedy, gdy określono również wartość UTRWALONE. Jeśli nowa kolumna zezwala na wartości null i nie określisz wartości domyślnej, nowa kolumna zawiera wartość null dla każdego wiersza w tabeli. Jeśli nowa kolumna zezwala na wartości null i dodajesz domyślną definicję z nową kolumną, możesz użyć funkcji WITH VALUES, aby zapisać wartość domyślną w nowej kolumnie dla każdego istniejącego wiersza w tabeli.

Jeśli nowa kolumna nie zezwala na wartości null, a tabela nie jest pusta, musisz dodać definicję DEFAULT z nową kolumną. Nowa kolumna zostanie automatycznie załadowana z wartością domyślną w nowych kolumnach w każdym istniejącym wierszu.

Wartość NULL można określić w alter COLUMN, aby wymusić, że kolumna NOT NULL zezwala na wartości null, z wyjątkiem kolumn w ograniczeniach KLUCZA PODSTAWOWEgo. W kolumnie ALTER COLUMN można określić wartość NOT NULL tylko wtedy, gdy kolumna nie zawiera wartości null. Wartości null należy zaktualizować do pewnej wartości, zanim kolumna ALTER COLUMN NOT NULL będzie dozwolona, na przykład:

UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL;
ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR(20) NOT NULL;

Podczas tworzenia lub zmieniania tabeli za pomocą instrukcji CREATE TABLE lub ALTER TABLE ustawienia bazy danych i sesji mają wpływ i ewentualnie przesłaniają wartość null typu danych używanego w definicji kolumny. Upewnij się, że zawsze jawnie definiujesz kolumnę jako NULL lub NOT NULL dla kolumn niekompilowanych.

Jeśli dodasz kolumnę z typem danych zdefiniowanym przez użytkownika, zdefiniuj kolumnę z taką samą wartością null jak typ danych zdefiniowany przez użytkownika. Następnie określ wartość domyślną dla kolumny. Aby uzyskać więcej informacji, zobacz CREATE TABLE.

Nuta

Jeśli określono wartość NULL lub NOT NULL z parametrem ALTER COLUMN, należy również określić new_data_type [(precyzji [, skalowanie ])]. Jeśli typ danych, precyzja i skala nie zostaną zmienione, określ bieżące wartości kolumn.

[ {ADD | DROP} ROWGUIDCOL ]

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

Określa, że właściwość ROWGUIDCOL jest dodawana do określonej kolumny lub porzucana. ROWGUIDCOL wskazuje, że kolumna jest kolumną GUID wiersza. Jako kolumnę ROWGUIDCOL można ustawić tylko jedną unikatową kolumnę identyfikatora na tabelę. Można również przypisać właściwość ROWGUIDCOL tylko do kolumny uniqueidentifier. Nie można przypisać elementu ROWGUIDCOL do kolumny typu danych zdefiniowanego przez użytkownika.

Funkcja ROWGUIDCOL nie wymusza unikatowości wartości przechowywanych w kolumnie i nie generuje automatycznie wartości dla nowych wierszy wstawionych do tabeli. Aby wygenerować unikatowe wartości dla każdej kolumny, użyj funkcji NEWID lub NEWSEQUENTIALID w instrukcjach INSERT. Możesz też określić funkcję NEWID lub NEWSEQUENTIALID jako domyślną dla kolumny.

[ {ADD | DROP} UTRWALONE ]

Określa, że właściwość PERSISTED jest dodawana do określonej kolumny lub porzucana z określonej kolumny. Kolumna musi być obliczoną kolumną zdefiniowaną za pomocą wyrażenia deterministycznego. W przypadku kolumn określonych jako PERSISTED aparat bazy danych fizycznie przechowuje obliczone wartości w tabeli i aktualizuje wartości, gdy są aktualizowane inne kolumny, od których zależy obliczona kolumna. Oznaczając obliczoną kolumnę jako PERSISTED, można utworzyć indeksy dla obliczonych kolumn zdefiniowanych w wyrażeniach deterministycznych, ale nie precyzyjnych. Aby uzyskać więcej informacji, zobacz Indeksy w kolumnach obliczanych.

SET QUOTED_IDENTIFIER musi być włączona podczas tworzenia lub zmieniania indeksów kolumn obliczeniowych lub indeksowanych widoków. Aby uzyskać więcej informacji, zobacz SET QUOTED_IDENTIFIER (Transact-SQL).

Każda obliczona kolumna używana jako kolumna partycjonowania tabeli partycjonowanej musi być jawnie oznaczona jako UTRWALONE.

UPUŚĆ NIE DLA REPLIKACJI

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

Określa, że wartości są zwiększane w kolumnach tożsamości podczas wykonywania operacji wstawiania przez agentów replikacji. Tę klauzulę można określić tylko wtedy, gdy column_name jest kolumną tożsamości.

RZADKI

Wskazuje, że kolumna jest rozrzedliwą kolumną. Przechowywanie rozrzedzonych kolumn jest zoptymalizowane pod kątem wartości null. Nie można ustawić rozrzedzona kolumn jako NOT NULL. W przypadku konwertowania kolumny z rozrzednia na nieparzystą lub z nieparzystego na rozrzednia ta opcja blokuje tabelę na czas wykonywania polecenia. Może być konieczne użycie klauzuli REBUILD w celu odzyskania wszelkich oszczędności miejsca. Aby uzyskać dodatkowe ograniczenia i więcej informacji o rozrzednych kolumnach, zobacz Use Sparse Columns.

ADD MASKED WITH ( FUNCTION = ' mask_function ')

Dotyczy: SQL Server (SQL Server 2016 (13.x) i Azure SQL Database.

Określa dynamiczną maskę danych. mask_function jest nazwą funkcji maskowania z odpowiednimi parametrami. Dostępne są trzy funkcje:

  • default()
  • email()
  • partial()
  • random()

Wymaga uprawnienia ALTER ANY MASK.

Aby usunąć maskę, użyj DROP MASKED. Aby uzyskać informacje o parametrach funkcji, zobacz dynamiczne maskowanie danych.

Dodawanie i usuwanie maski wymaga ALTER ANY MASK uprawnienia.

WITH ( ONLINE = ON | OFF) <jak ma zastosowanie do zmiany> kolumny

Dotyczy: SQL Server (SQL Server 2016 (13.x) i Azure SQL Database.

Umożliwia wykonywanie wielu akcji zmiany kolumny, gdy tabela pozostaje dostępna. Wartość domyślna to OFF. Możesz uruchomić polecenie alter column online w celu zmiany kolumny związane z typem danych, długością kolumny lub precyzją, wartością null, rozrzedżeniem i sortowaniem.

Zmiana kolumny online umożliwia użytkownikowi tworzenie i autostatystyka odwołuje się do zmienionej kolumny na czas trwania operacji ALTER COLUMN, która umożliwia uruchamianie zapytań w zwykły sposób. Na końcu operacji autostaty odwołujące się do kolumny są porzucane, a statystyki utworzone przez użytkownika są unieważniane. Użytkownik musi ręcznie zaktualizować statystyki wygenerowane przez użytkownika po zakończeniu operacji. Jeśli kolumna jest częścią wyrażenia filtru dla żadnych statystyk lub indeksów, nie można wykonać operacji zmiany kolumny.

  • Gdy operacja zmiany kolumny online jest uruchomiona, wszystkie operacje, które mogą mieć zależność od kolumny (indeks, widoki itd.) blokują lub kończą się niepowodzeniem z odpowiednim błędem. To zachowanie gwarantuje, że zmiana kolumny online nie zakończy się niepowodzeniem z powodu zależności wprowadzonych podczas działania operacji.
  • Zmiana kolumny z NOT NULL na NULL nie jest obsługiwana jako operacja online, gdy zmieniona kolumna jest przywoływana przez indeksy nieklastrowane.
  • Funkcja ALTER w trybie online nie jest obsługiwana, gdy kolumna jest przywoływana przez ograniczenie sprawdzania, a operacja ALTER ogranicza precyzję kolumny (liczbowej lub daty/godziny).
  • Nie można użyć opcji WAIT_AT_LOW_PRIORITY z kolumną alter online.
  • ALTER COLUMN ... ADD/DROP PERSISTED nie jest obsługiwana w przypadku kolumny zmiany online.
  • ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION nie ma wpływu na kolumnę zmiany online.
  • Zmiana kolumny w trybie online nie obsługuje zmiany tabeli, w której jest włączone śledzenie zmian lub jest wydawcą replikacji scalania.
  • Zmiana kolumny w trybie online nie obsługuje zmiany typów danych CLR ani z tych typów.
  • Zmiana kolumny w trybie online nie obsługuje zmiany typu danych XML, który ma kolekcję schematów inną niż bieżąca kolekcja schematów.
  • Zmiana kolumny online nie zmniejsza ograniczeń dotyczących zmiany kolumny. Odwołania według indeksu/statystyk i tak dalej mogą spowodować niepowodzenie zmiany.
  • Zmiana kolumny w trybie online nie obsługuje jednoczesnego zmieniania więcej niż jednej kolumny.
  • Zmiana kolumny w trybie online nie ma wpływu na tabelę czasową w wersji systemowej. Kolumna ALTER nie jest uruchamiana jako online, niezależnie od tego, która wartość została określona dla opcji ONLINE.

Zmiana kolumny online ma podobne wymagania, ograniczenia i funkcje podczas ponownego kompilowania indeksu online, co obejmuje:

  • Ponowne kompilowanie indeksu online nie jest obsługiwane, gdy tabela zawiera starsze kolumny LOB lub filestream lub gdy tabela ma indeks magazynu kolumn. Te same ograniczenia dotyczą zmiany kolumny online.
  • Zmieniona istniejąca kolumna wymaga dwukrotnego przydziału miejsca dla oryginalnej kolumny i dla nowo utworzonej ukrytej kolumny.
  • Strategia blokowania podczas operacji online zmiany kolumny jest zgodna z tym samym wzorcem blokowania używanym do kompilacji indeksu online.

ZA POMOCĄ SPRAWDZANIA | Z NOCHECK

Określa, czy dane w tabeli są lub nie są weryfikowane względem nowo dodanego lub ponownie włączonego klucza obcego lub ograniczenia CHECK. Jeśli nie określisz, opcja WITH CHECK jest zakładana dla nowych ograniczeń, a opcja WITH NOCHECK jest zakładana dla ponownie włączonych ograniczeń.

Jeśli nie chcesz weryfikować nowych ograniczeń CHECK lub FOREIGN KEY względem istniejących danych, użyj polecenia WITH NOCHECK. Nie zalecamy tego robić, z wyjątkiem rzadkich przypadków. Nowe ograniczenie jest oceniane we wszystkich późniejszych aktualizacjach danych. Wszelkie naruszenia ograniczeń pomijane przez polecenie WITH NOCHECK po dodaniu ograniczenia mogą spowodować niepowodzenie przyszłych aktualizacji, jeśli zaktualizują wiersze z danymi, które nie są zgodne z ograniczeniem. Optymalizator zapytań nie uwzględnia ograniczeń zdefiniowanych za pomocą polecenia NOCHECK. Takie ograniczenia są ignorowane do momentu ich ponownego włączenia przy użyciu ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL. Aby uzyskać więcej informacji, zobacz Wyłącz ograniczenia klucza obcego za pomocą instrukcji INSERT i UPDATE.

ALTER INDEX index_name

Określa, że liczba zasobników dla index_name ma zostać zmieniona lub zmieniona.

Składnia ALTER TABLE ... Funkcja ADD/DROP/ALTER INDEX jest obsługiwana tylko w przypadku tabel zoptymalizowanych pod kątem pamięci.

Ważny

Bez użycia instrukcji ALTER TABLE instrukcje CREATE INDEX, DROP INDEX, ALTER INDEXi PAD_INDEX nie są obsługiwane w przypadku indeksów w tabelach zoptymalizowanych pod kątem pamięci.

DODAWAĆ

Określa, że dodawane są co najmniej jedna definicja kolumny, obliczone definicje kolumn lub ograniczenia tabeli. Można też dodać kolumny używane przez system do przechowywania wersji systemu. W przypadku tabel zoptymalizowanych pod kątem pamięci można dodać indeks.

Nuta

Nowe kolumny są dodawane po zmianie wszystkich istniejących kolumn w tabeli.

Ważny

Bez użycia instrukcji ALTER TABLE instrukcje CREATE INDEX, DROP INDEX, ALTER INDEXi PAD_INDEX nie są obsługiwane w przypadku indeksów w tabelach zoptymalizowanych pod kątem pamięci.

OKRES DLA SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )

Dotyczy: SQL Server (SQL Server 2017 (14.x) i Azure SQL Database.

Określa nazwy kolumn używanych przez system do rejestrowania okresu, dla którego rekord jest prawidłowy. Możesz określić istniejące kolumny lub utworzyć nowe kolumny w ramach argumentu ADD PERIOD FOR SYSTEM_TIME. Skonfiguruj kolumny przy użyciu typu danych datetime2 i zdefiniuj je jako NOT NULL. Jeśli zdefiniujesz kolumnę kropki jako wartość NULL, zostanie wyświetlony błąd. Można zdefiniować column_constraint i/lub Określ wartości domyślne dla kolumn dla kolumn system_start_time i system_end_time. Zobacz Przykład A w poniższych przykładach obsługi wersji systemu, które pokazują użycie wartości domyślnej dla kolumny system_end_time.

Użyj tego argumentu z argumentem SET SYSTEM_VERSIONING, aby utworzyć istniejącą tabelę czasową. Aby uzyskać więcej informacji, zobacz Tabele czasowe i Wprowadzenie do tabel czasowych w usłudze Azure SQL Database.

Począwszy od programu SQL Server 2017 (14.x), użytkownicy mogą oznaczyć jedną lub obie kolumny kropki z flagą HIDDEN niejawnie ukryć te kolumny, tak aby SELECT * FROM <table_name> nie zwraca wartości dla kolumn. Domyślnie kolumny kropki nie są ukryte. Aby można było używać, ukryte kolumny muszą być jawnie uwzględnione we wszystkich zapytaniach, które bezpośrednio odwołują się do tabeli czasowej.

KROPLA

Określa, że usunięto co najmniej jedną definicję kolumny, obliczone definicje kolumn lub ograniczenia tabeli albo usunąć specyfikację kolumn używanych przez system do przechowywania wersji systemu.

Nuta

Kolumny porzucone w tabelach rejestru są usuwane nietrwale. Porzucona kolumna pozostaje w tabeli rejestru, ale jest oznaczona jako porzucona kolumna, ustawiając kolumnę dropped_ledger_table w sys.tables na wartość 1. Widok rejestru usuniętej tabeli rejestru jest również oznaczony jako porzucony przez ustawienie kolumny dropped_ledger_view w sys.tables na wartość 1. Zmieniono nazwę usuniętej tabeli rejestru, jej tabeli historii i widoku rejestru przez dodanie prefiksu (MSSQL_DroppedLedgerTable, MSSQL_DroppedLedgerHistory, MSSQL_DroppedLedgerView) i dołączanie identyfikatora GUID do oryginalnej nazwy.

CONSTRAINT_NAME OGRANICZEŃ

Określa, że constraint_name jest usuwana z tabeli. Można wymienić wiele ograniczeń.

Można określić zdefiniowaną przez użytkownika lub podaną przez system nazwę ograniczenia, wykonując zapytanie dotyczące widoków katalogu sys.check_constraint, sys.default_constraints, sys.key_constraintsi sys.foreign_keys.

Nie można porzucić ograniczenia klucza podstawowego, jeśli w tabeli istnieje indeks XML.

index_name INDEKSU

Określa, że index_name jest usuwana z tabeli.

Składnia ALTER TABLE ... Funkcja ADD/DROP/ALTER INDEX jest obsługiwana tylko w przypadku tabel zoptymalizowanych pod kątem pamięci.

Ważny

Bez użycia instrukcji ALTER TABLE instrukcje CREATE INDEX, DROP INDEX, ALTER INDEXi PAD_INDEX nie są obsługiwane w przypadku indeksów w tabelach zoptymalizowanych pod kątem pamięci.

column_name KOLUMNY

Określa, że constraint_name lub column_name jest usuwany z tabeli. Można wymienić wiele kolumn.

Nie można porzucić kolumny, gdy jest:

  • Używany w indeksie, niezależnie od tego, czy jest to kolumna klucza, czy jako include
  • Używane w ograniczeniu CHECK, FOREIGN KEY, UNIQUE lub PRIMARY KEY.
  • Skojarzona z wartością domyślną zdefiniowaną za pomocą słowa kluczowego DEFAULT lub powiązana z obiektem domyślnym.
  • Powiązana z regułą.

Nuta

Usunięcie kolumny nie powoduje odzyskania miejsca na dysku kolumny. Może być konieczne odzyskanie miejsca na dysku usuniętej kolumny, gdy rozmiar wiersza tabeli zbliża się lub przekracza limit. Odzyskaj miejsce, tworząc indeks klastrowany w tabeli lub ponownie kompilując istniejący indeks klastrowany przy użyciu ALTER INDEX. Aby uzyskać informacje o wpływie upuszczania typów danych BIZNESOWYCH, zobacz ten wpis w blogu CSS.

OKRES DLA SYSTEM_TIME

Dotyczy: SQL Server (SQL Server 2016 (13.x) i Azure SQL Database.

Pomiń specyfikację kolumn używanych przez system do przechowywania wersji systemu.

Z <drop_clustered_constraint_option>

Określa, że ustawiono co najmniej jedną opcję ograniczenia klastra.

MAXDOP = max_degree_of_parallelism

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

Zastępuje maksymalny stopień równoległości opcji konfiguracji tylko przez czas trwania operacji. Aby uzyskać więcej informacji, zobacz Configure the max degree of parallelism Server Configuration Option.

Użyj opcji MAXDOP, aby ograniczyć liczbę procesorów używanych w równoległym wykonywaniu planu. Maksymalna wartość to 64 procesory.

max_degree_of_parallelism może być jedną z następujących wartości:

  • 1

    Pomija generowanie planu równoległego.

  • >1

    Ogranicza maksymalną liczbę procesorów używanych w operacji indeksowania równoległego do określonej liczby.

  • 0 (wartość domyślna) Używa rzeczywistej liczby procesorów lub mniej na podstawie bieżącego obciążenia systemu.

Aby uzyskać więcej informacji, zobacz Configure Parallel Index Operations.

Nuta

Operacje indeksowania równoległego nie są dostępne w każdej wersji programu SQL Server. Aby uzyskać więcej informacji, zobacz Editions and supported features of SQL Server 2022.

ONLINE = { ON | OFF } <jak ma zastosowanie do drop_clustered_constraint_option>

Określa, czy tabele bazowe i skojarzone indeksy są dostępne dla zapytań i modyfikacji danych podczas operacji indeksu. Wartość domyślna to WYŁĄCZONE. Możesz uruchomić polecenie REBUILD jako operację ONLINE.

NA
Długoterminowe blokady tabeli nie są przechowywane przez czas trwania operacji indeksu. W fazie głównej operacji indeksowania blokada udziału intencji (IS) jest przechowywana w tabeli źródłowej. To zachowanie umożliwia kontynuowanie zapytań lub aktualizacji podstawowej tabeli i indeksów. Na początku operacji blokada współużytkowanego (S) jest przechowywana na obiekcie źródłowym przez krótki czas. Na końcu operacji przez krótki czas jest uzyskiwana blokada S (współdzielona) w źródle, jeśli tworzony jest indeks nieklastrowany. Można też uzyskać blokadę SCH-M (modyfikacja schematu) podczas tworzenia lub porzucania indeksu klastrowanego w trybie online i odbudowy indeksu klastrowanego lub nieklastrowanego. Nie można ustawić trybu ONLINE na WŁ., gdy indeks jest tworzony w lokalnej tabeli tymczasowej. Dozwolone jest tylko jednowątkowa operacja ponownego kompilowania stert.

Aby uruchomić DDL dla SWITCH lub ponowne kompilowanie indeksu online, należy ukończyć wszystkie aktywne transakcje blokujące uruchomione w określonej tabeli. Podczas wykonywania switch lub operacji ponownej kompilacji uniemożliwia rozpoczęcie nowych transakcji i może znacząco wpłynąć na przepływność obciążenia i tymczasowo opóźnić dostęp do tabeli bazowej.

OD
Blokady tabeli mają zastosowanie do czasu trwania operacji indeksu. Operacja indeksu w trybie offline, która tworzy, kompiluje lub usuwa indeks klastrowany albo usuwa indeks nieklastrowany, uzyskuje modyfikację schematu (Sch-M) blokady w tabeli. Ta blokada uniemożliwia wszystkim użytkownikom dostęp do tabeli bazowej przez czas trwania operacji. Operacja indeksu offline, która tworzy indeks nieklastrowany, uzyskuje blokadę współużytkowaną (S) w tabeli. Ta blokada uniemożliwia aktualizowanie podstawowej tabeli, ale umożliwia wykonywanie operacji odczytu, takich jak instrukcje SELECT. Operacje odbudowy sterta wielowątkowego są dozwolone.

Aby uzyskać więcej informacji, zobacz How Online Index Operations Work.

Nuta

Operacje indeksowania online nie są dostępne w każdej wersji programu SQL Server. Aby uzyskać więcej informacji, zobacz Editions and supported features of SQL Server 2022.

MOVE TO { partition_scheme_name(column_name [ ,...n ] ) | filegroup | "default" }

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

Określa lokalizację przenoszenia wierszy danych obecnie na poziomie liścia indeksu klastrowanego. Tabela zostanie przeniesiona do nowej lokalizacji. Ta opcja ma zastosowanie tylko do ograniczeń, które tworzą indeks klastrowany.

Nuta

W tym kontekście wartość domyślna nie jest słowem kluczowym. Jest to identyfikator domyślnej grupy plików i musi być rozdzielany, jak w sekcji MOVE TO "default" lub MOVE TO [default]. Jeśli określono "domyślny", opcja QUOTED_IDENTIFIER musi być włączona dla bieżącej sesji. Jest to ustawienie domyślne. Aby uzyskać więcej informacji, zobacz SET QUOTED_IDENTIFIER.

{ CHECK | NOCHECK } OGRANICZENIE

Określa, że constraint_name jest włączona lub wyłączona. Tej opcji można używać tylko z ograniczeniami KLUCZ OBCY i CHECK. Po określeniu polecenia NOCHECK ograniczenie jest wyłączone, a przyszłe wstawki lub aktualizacje kolumny nie są weryfikowane względem warunków ograniczeń. Nie można wyłączyć ograniczeń DEFAULT, PRIMARY KEY i UNIQUE.

CAŁY
Określa, że wszystkie ograniczenia są wyłączone z opcją NOCHECK lub włączone z opcją CHECK.

{ WŁĄCZ | WYŁĄCZ } WYZWALACZ

Określa, że trigger_name jest włączona lub wyłączona. Gdy wyzwalacz jest wyłączony, nadal jest zdefiniowany dla tabeli. Jednak gdy instrukcje INSERT, UPDATE lub DELETE są uruchamiane względem tabeli, akcje w wyzwalaczu nie są wykonywane, dopóki wyzwalacz nie zostanie ponownie włączony.

CAŁY
Określa, że wszystkie wyzwalacze w tabeli są włączone lub wyłączone.

trigger_name
Określa nazwę wyzwalacza do wyłączenia lub włączenia.

{ WŁĄCZ | WYŁĄCZ } CHANGE_TRACKING

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

Określa, czy śledzenie zmian jest włączone dla tabeli. Domyślnie śledzenie zmian jest wyłączone.

Ta opcja jest dostępna tylko wtedy, gdy śledzenie zmian jest włączone dla bazy danych. Aby uzyskać więcej informacji, zobacz ALTER DATABASE SET Options.

Aby włączyć śledzenie zmian, tabela musi mieć klucz podstawowy.

WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )

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

Określa, czy aparat bazy danych śledzi, które zmiany śledzone kolumny zostały zaktualizowane. Wartość domyślna to OFF.

SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name. ] target_table [ PARTITION target_partition_number_expression ]

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

Przełącza blok danych na jeden z następujących sposobów:

  • Ponownie przypisuje wszystkie dane tabeli jako partycję do istniejącej tabeli partycjonowanej.
  • Przełącza partycję z jednej partycjonowanej tabeli na inną.
  • Ponownie przypisuje wszystkie dane w jednej partycji tabeli partycjonowanej do istniejącej tabeli bez partycji.

Jeśli tabeli jest tabelą partycjonowaną, należy określić source_partition_number_expression. Jeśli target_table jest partycjonowana, musisz określić target_partition_number_expression. W przypadku ponownego przypisania danych tabeli jako partycji do istniejącej tabeli partycjonowanej lub przełączenia partycji z jednej tabeli partycjonowanej na inną partycja musi istnieć partycja docelowa i musi być pusta.

Podczas ponownego przypisania danych jednej partycji w celu utworzenia pojedynczej tabeli tabela docelowa musi już istnieć i musi być pusta. Zarówno tabela źródłowa, jak i partycja, a tabela docelowa lub partycja muszą znajdować się w tej samej grupie plików. Odpowiednie indeksy lub partycje indeksu muszą również znajdować się w tej samej grupie plików. Wiele dodatkowych ograniczeń dotyczy przełączania partycji. tabeli i target_table nie mogą być takie same. target_table może być identyfikatorem wieloczęściowym.

Zarówno source_partition_number_expression, jak i target_partition_number_expression to wyrażenia stałe, które mogą odwoływać się do zmiennych i funkcji. Obejmują one zmienne typu zdefiniowane przez użytkownika i funkcje zdefiniowane przez użytkownika. Nie mogą odwoływać się do Transact-SQL wyrażeń.

Partycjonowana tabela z klastrowanym indeksem magazynu kolumn zachowuje się jak partycjonowana sterta:

  • Klucz podstawowy musi zawierać klucz partycji.
  • Unikatowy indeks musi zawierać klucz partycji. Jednak dołączenie klucza partycji z istniejącym indeksem unikatowym może zmienić unikatowość.
  • Aby przełączyć partycje, wszystkie indeksy nieklastrowane muszą zawierać klucz partycji.

Aby uzyskać ograniczenie SWITCH podczas korzystania z replikacji, zobacz Replikowanie tabel i indeksów partycjonowanych.

Indeksy magazynu kolumn nieklastrowanych zostały wbudowane w format tylko do odczytu przed programem SQL Server 2016 (13.x) i dla usługi SQL Database przed wersją V12. Przed uruchomieniem jakichkolwiek operacji PARTYCJI należy ponownie skompilować indeksy nieklastrowanego magazynu kolumn do bieżącego formatu (który można zaktualizować).

ograniczenia

Jeśli obie tabele są partycjonowane identycznie, w tym indeksy nieklastrowane, a tabela docelowa nie ma żadnych indeksów nieklastrowanych, może zostać wyświetlony błąd 4907.

Przykładowe dane wyjściowe:

Msg 4907, Level 16, State 1, Line 38
'ALTER TABLE SWITCH' statement failed. The table 'MyDB.dbo.PrtTable1' has 4 partitions while index 'MS1' has 6 partitions.

SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | "default" | "NULL" })

Dotyczy: SQL Server (SQL Server 2008 (10.0.x) i nowsze). Usługa Azure SQL Database nie obsługuje FILESTREAM.

Określa, gdzie są przechowywane dane FILESTREAM.

FUNKCJA ALTER TABLE z klauzulą SET FILESTREAM_ON kończy się powodzeniem tylko wtedy, gdy tabela nie ma kolumn FILESTREAM. Kolumny FILESTREAM można dodać przy użyciu drugiej instrukcji ALTER TABLE.

Jeśli określisz partition_scheme_name, mają zastosowanie reguły CREATE TABLE. Upewnij się, że tabela jest już partycjonowana dla danych wierszy, a schemat partycji używa tej samej funkcji partycji i kolumn co schemat partycji FILESTREAM.

filestream_filegroup_name określa nazwę grupy plików FILESTREAM. Grupa plików musi zawierać jeden plik zdefiniowany dla grupy plików przy użyciu CREATE DATABASE lub instrukcji ALTER DATABASE lub błędu.

"domyślny" określa grupę plików FILESTREAM z zestawem właściwości DEFAULT. Jeśli nie ma grupy plików FILESTREAM, zostanie wyświetlony komunikat o błędzie.

"null" określa, że wszystkie odwołania do grup plików FILESTREAM dla tabeli są usuwane. Najpierw należy porzucić wszystkie kolumny FILESTREAM. Użyj polecenia SET FILESTREAM_ON = "null", aby usunąć wszystkie dane FILESTREAM skojarzone z tabelą.

SET ( SYSTEM_VERSIONING = { OFF | ON [ ( HISTORY_TABLE = schema_name . history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ] } )

Dotyczy: SQL Server (SQL Server 2016 (13.x) i Azure SQL Database.

Albo wyłącza lub włącza przechowywanie wersji systemu tabeli. Aby włączyć przechowywanie wersji systemu tabeli, system sprawdza, czy są spełnione wymagania dotyczące przechowywania wersji systemu, ograniczeń typu danych, wartości null i klucza podstawowego. System będzie rejestrować historię każdego rekordu w tabeli z wersją systemową w oddzielnej tabeli historii. Jeśli argument HISTORY_TABLE nie jest używany, nazwa tej tabeli historii będzie MSSQL_TemporalHistoryFor<primary_table_object_id>. Jeśli tabela historii nie istnieje, system generuje nową tabelę historii zgodną ze schematem bieżącej tabeli, tworzy połączenie między dwiema tabelami i umożliwia systemowi rejestrowanie historii każdego rekordu w bieżącej tabeli w tabeli historii. Jeśli użyjesz argumentu HISTORY_TABLE, aby utworzyć link do istniejącej tabeli historii i użyć jej, system utworzy łącze między bieżącą tabelą a określoną tabelą. Podczas tworzenia linku do istniejącej tabeli historii możesz przeprowadzić sprawdzanie spójności danych. Ten sprawdzanie spójności danych gwarantuje, że istniejące rekordy nie nakładają się na siebie. Uruchamianie sprawdzania spójności danych jest ustawieniem domyślnym. Użyj argumentu SYSTEM_VERSIONING = ON w tabeli zdefiniowanej za pomocą klauzuli PERIOD FOR SYSTEM_TIME, aby istniejąca tabela stanie się tabelą czasową. Aby uzyskać więcej informacji, zobacz Tabele czasowe.

HISTORY_RETENTION_PERIOD = { INFINITE | number {DAY | DNI | TYDZIEŃ | TYGODNIE | MIESIĄC | MIESIĄCE | ROK | YEARS} }

Dotyczy: SQL Server 2017 (14.x) i Azure SQL Database.

Określa skończone lub nieskończone przechowywanie danych historycznych w tabeli czasowej. W przypadku pominięcia przyjmuje się, że przyjmuje się nieskończone przechowywanie.

DATA_DELETION

Dotyczy: azure SQL Edge tylko

Umożliwia czyszczenie starych lub przestarzałych danych z tabel w bazie danych na podstawie zasad przechowywania. Aby uzyskać więcej informacji, zobacz Włączanie i wyłączanie przechowywania danych. Aby można było włączyć przechowywanie danych, należy określić następujące parametry.

FILTER_COLUMN = { column_name }
Określa kolumnę, która powinna służyć do określenia, czy wiersze w tabeli są przestarzałe, czy nie. Następujące typy danych są dozwolone dla kolumny filtru.

  • Data
  • Data/godzina
  • Data/godzina2
  • SmallDateTime
  • DateTimeOffset

RETENTION_PERIOD = { INFINITE | number {DAY | DNI | TYDZIEŃ | TYGODNIE | MIESIĄC | MIESIĄCE | ROK | LATA }}
Określa zasady okresu przechowywania dla tabeli. Okres przechowywania jest określany jako kombinacja dodatniej wartości całkowitej i jednostki części daty.

SET ( LOCK_ESCALATION = { AUTO | TABELA | WYŁĄCZ } )

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

Określa dozwolone metody eskalacji blokady dla tabeli.

AUTOMATYCZNIE
Ta opcja umożliwia aparatowi bazy danych programu SQL Server wybranie stopnia szczegółowości eskalacji blokady odpowiedniego dla schematu tabeli.

  • Jeśli tabela jest podzielona na partycje, eskalacja blokady będzie mogła być szczegółowa stos lub B-tree (HoBT). Innymi słowy, eskalacja będzie dozwolona na poziomie partycji. Po eskalacji blokady na poziom HoBT blokada nie zostanie później eskalowana do stopnia szczegółowości TABELI.
  • Jeśli tabela nie jest partycjonowana, eskalacja blokady jest wykonywana na poziomie szczegółowości tabeli.

STÓŁ
Eskalacja blokady jest wykonywana z dokładnością na poziomie tabeli niezależnie od tego, czy tabela jest partycjonowana, czy nie partycjonowana. TABELA jest wartością domyślną.

WYŁĄCZAĆ
Zapobiega eskalacji blokady w większości przypadków. Blokady na poziomie tabeli nie są całkowicie niedozwolone. Na przykład podczas skanowania tabeli, która nie ma indeksu klastrowanego na poziomie izolacji możliwej do serializacji, aparat bazy danych musi zablokować tabelę, aby chronić integralność danych.

ODBUDOWAĆ

Użyj składni REBUILD WITH, aby ponownie skompilować całą tabelę, w tym wszystkie partycje w tabeli partycjonowanej. Jeśli tabela ma indeks klastrowany, opcja REBUILD ponownie kompiluje indeks klastrowany. Ponowne kompilowanie można uruchomić jako operację ONLINE.

Użyj składni REBUILD PARTITION, aby ponownie skompilować pojedynczą partycję w tabeli partycjonowanej.

PARTYCJA = WSZYSTKO

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

Ponowne kompilowanie wszystkich partycji podczas zmieniania ustawień kompresji partycji.

PONOWNE KOMPILOWANIE ZA POMOCĄ ( <rebuild_option> )

Wszystkie opcje dotyczą tabeli z indeksem klastrowanym. Jeśli tabela nie ma indeksu klastrowanego, struktura stert ma wpływ tylko na niektóre opcje.

Jeśli określone ustawienie kompresji nie zostanie określone z operacją REBUILD, jest używane bieżące ustawienie kompresji dla partycji. Aby zwrócić bieżące ustawienie, wykonaj zapytanie względem kolumny data_compression w widoku wykazu sys.partitions.

Aby uzyskać pełne opisy opcji ponownego kompilowania, zobacz ALTER TABLE index_option.

DATA_COMPRESSION

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

Określa opcję kompresji danych dla określonej tabeli, numeru partycji lub zakresu partycji. Opcje są następujące:

BRAK tabeli lub określonych partycji nie są kompresowane. Ta opcja nie ma zastosowania do tabel magazynu kolumn.

Tabela wierszy lub określone partycje są kompresowane przy użyciu kompresji wierszy. Ta opcja nie ma zastosowania do tabel magazynu kolumn.

Tabela PAGE lub określone partycje są kompresowane przy użyciu kompresji strony. Ta opcja nie ma zastosowania do tabel magazynu kolumn.

MAGAZYN KOLUMN
Dotyczy: SQL Server (SQL Server 2014 (12.x) i Azure SQL Database.

Dotyczy tylko tabel magazynu kolumn. FUNKCJA COLUMNSTORE określa dekompresowanie partycji skompresowanej przy użyciu opcji COLUMNSTORE_ARCHIVE. Po przywróceniu danych będzie ona nadal kompresowana przy użyciu kompresji magazynu kolumn, która jest używana dla wszystkich tabel magazynu kolumn.

COLUMNSTORE_ARCHIVE
Dotyczy: SQL Server (SQL Server 2014 (12.x) i Azure SQL Database.

Dotyczy tylko tabel magazynu kolumn, które są tabelami przechowywanymi w klastrowanym indeksie magazynu kolumn. COLUMNSTORE_ARCHIVE będzie dodatkowo kompresować określoną partycję do mniejszego rozmiaru. Użyj tej opcji w przypadku archiwizacji lub innych sytuacji, które wymagają mniejszej ilości miejsca do magazynowania i mogą pozwolić sobie na więcej czasu na przechowywanie i pobieranie.

Aby ponownie skompilować wiele partycji w tym samym czasie, zobacz index_option. Jeśli tabela nie ma indeksu klastrowanego, zmiana kompresji danych ponownie kompiluje stertę i indeksy nieklastrowane. Aby uzyskać więcej informacji na temat kompresji, zobacz Kompresja danych.

ALTER TABLE REBUILD PARTITION WITH DATA COMPRESSION = ROW lub PAGE nie jest dozwolone w bazie danych SQL w usłudze Microsoft Fabric.

XML_COMPRESSION

Dotyczy: SQL Server 2022 (16.x) i nowsze wersje, Azure SQL Database i Azure SQL Managed Instance.

Określa opcję kompresji XML dla wszystkich kolumn typu danych xml xml w tabeli. Opcje są następujące:

NA
Kolumny używające xml typu danych są kompresowane.

OD
Kolumny używające typu danych xml nie są kompresowane.

ONLINE = { ON | OFF } <zgodnie z single_partition_rebuild_option>

Określa, czy pojedyncza partycja bazowych tabel i skojarzonych indeksów jest dostępna dla zapytań i modyfikacji danych podczas operacji indeksowania. Wartość domyślna to WYŁĄCZONE. Możesz uruchomić polecenie REBUILD jako operację ONLINE.

NA
Długoterminowe blokady tabeli nie są przechowywane przez czas trwania operacji indeksu. Blokada S w tabeli jest wymagana na początku odbudowy indeksu i blokada Sch-M na końcu ponownego kompilowania indeksu online. Mimo że obie blokady są krótkimi blokadami metadanych, Sch-M blokada musi czekać na zakończenie wszystkich transakcji blokujących. W czasie oczekiwania Sch-M blokada blokuje wszystkie inne transakcje, które oczekują za tą blokadą podczas uzyskiwania dostępu do tej samej tabeli.

Nuta

Ponowne kompilowanie indeksu online może ustawić opcje low_priority_lock_wait opisane w dalszej części tej sekcji.

OD
Blokady tabeli są stosowane do czasu trwania operacji indeksu. Zapobiega to dostępowi wszystkich użytkowników do tabeli bazowej przez czas trwania operacji.

COLUMN_SET XML column_set_name FOR ALL_SPARSE_COLUMNS

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

Nazwa zestawu kolumn. Zestaw kolumn to nietypowa reprezentacja XML, która łączy wszystkie rozrzedzone kolumny tabeli w dane wyjściowe ze strukturą. Nie można dodać zestawu kolumn do tabeli zawierającej rozrzedzona kolumna. Aby uzyskać więcej informacji na temat zestawów kolumn, zobacz Use Column Sets.

{ WŁĄCZ | WYŁĄCZ } FILETABLE_NAMESPACE

Dotyczy: SQL Server (SQL Server 2012 (11.x) i nowsze).

Włącza lub wyłącza ograniczenia zdefiniowane przez system w tabeli FileTable. Można używać tylko z tabelą FileTable.

SET ( FILETABLE_DIRECTORY = directory_name )

Dotyczy: SQL Server (SQL Server 2012 (11.x) i nowsze). Usługa Azure SQL Database nie obsługuje FILETABLE.

Określa nazwę katalogu FileTable zgodną z systemem Windows. Ta nazwa powinna być unikatowa wśród wszystkich nazw katalogów FileTable w bazie danych. Porównanie unikatowości jest niewrażliwe na wielkość liter, pomimo ustawień sortowania SQL. Można używać tylko z tabelą FileTable.

REMOTE_DATA_ARCHIVE

Dotyczy: SQL Server (SQL Server 2017 (14.x) i nowsze).

Włącza lub wyłącza bazę danych Stretch dla tabeli. Aby uzyskać więcej informacji, zobacz Stretch Database.

Ważny

Baza danych Stretch jest przestarzała w programie SQL Server 2022 (16.x) i usłudze Azure SQL Database. Ta funkcja zostanie usunięta w przyszłej wersji aparatu bazy danych. Unikaj używania tej funkcji w nowych pracach programistycznych i zaplanuj modyfikowanie aplikacji, które obecnie korzystają z tej funkcji.

włączanie bazy danych Stretch dla tabeli

Po włączeniu funkcji Stretch dla tabeli przez określenie ONnależy również określić MIGRATION_STATE = OUTBOUND, aby natychmiast rozpocząć migrację danych, lub MIGRATION_STATE = PAUSED odroczyć migrację danych. Wartość domyślna to MIGRATION_STATE = OUTBOUND. Aby uzyskać więcej informacji na temat włączania funkcji Stretch dla tabeli, zobacz Enable Stretch Database for a table.

wymagania wstępne. Przed włączeniem programu Stretch dla tabeli należy włączyć usługę Stretch na serwerze i w bazie danych. Aby uzyskać więcej informacji, zobacz Enable Stretch Database for a database.

uprawnienia. Włączenie programu Stretch dla bazy danych lub tabeli wymaga db_owner uprawnień. Włączenie funkcji Stretch dla tabeli wymaga również uprawnień ALTER w tabeli.

wyłączanie bazy danych Stretch dla tabeli

Po wyłączeniu funkcji Stretch dla tabeli masz dwie opcje dla danych zdalnych, które zostały już zmigrowane na platformę Azure. Aby uzyskać więcej informacji, zobacz Disable Stretch Database and bring back remote data.

  • Aby wyłączyć usługę Stretch dla tabeli i skopiować dane zdalne dla tabeli z platformy Azure z powrotem do programu SQL Server, uruchom następujące polecenie. Nie można anulować tego polecenia.

    ALTER TABLE <table_name>
       SET ( REMOTE_DATA_ARCHIVE ( MIGRATION_STATE = INBOUND ) ) ;
    

Ta operacja wiąże się z kosztami transferu danych i nie można jej anulować. Aby uzyskać więcej informacji, zobacz Szczegóły cennika transferu danych.

Po skopiowaniu wszystkich danych zdalnych z platformy Azure z powrotem do programu SQL Server usługa Stretch jest wyłączona dla tabeli.

  • Aby wyłączyć usługę Stretch dla tabeli i porzucić dane zdalne, uruchom następujące polecenie.

    ALTER TABLE <table_name>
       SET ( REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY ( MIGRATION_STATE = PAUSED ) ) ;
    

Po wyłączeniu bazy danych Stretch dla tabeli migracja danych zostanie zatrzymana i wyniki zapytania nie będą już uwzględniać wyników z tabeli zdalnej.

Wyłączenie funkcji Stretch nie powoduje usunięcia tabeli zdalnej. Jeśli chcesz usunąć tabelę zdalną, upuść ją przy użyciu witryny Azure Portal.

[ FILTER_PREDICATE = { null | predykat } ]

Dotyczy: SQL Server (SQL Server 2017 (14.x) i nowsze).

Opcjonalnie określa predykat filtru, aby wybrać wiersze do migracji z tabeli zawierającej zarówno dane historyczne, jak i bieżące. Predykat musi wywołać deterministyczną funkcję wartości tabeli wbudowanej. Aby uzyskać więcej informacji, zobacz Enable Stretch Database for a table and Select rows to migrate by using a filter function - Stretch Database.

Ważny

Jeśli podasz predykat filtru, który działa źle, migracja danych również działa źle. Baza danych Stretch stosuje predykat filtru do tabeli przy użyciu operatora CROSS APPLY.

Jeśli nie określisz predykatu filtru, cała tabela zostanie zmigrowana.

Po określeniu predykatu filtru należy również określić MIGRATION_STATE.

MIGRATION_STATE = { OUTBOUND | RUCH PRZYCHODZĄCY | WSTRZYMANO }

Dotyczy: SQL Server (SQL Server 2017 (14.x) i nowsze).

  • Określ OUTBOUND, aby przeprowadzić migrację danych z programu SQL Server na platformę Azure.

  • Określ INBOUND, aby skopiować dane zdalne dla tabeli z platformy Azure z powrotem do programu SQL Server i wyłączyć funkcję Stretch dla tabeli. Aby uzyskać więcej informacji, zobacz Disable Stretch Database and bring back remote data.

    Ta operacja wiąże się z kosztami transferu danych i nie można jej anulować.

  • Określ PAUSED, aby wstrzymać lub odłożyć migrację danych. Aby uzyskać więcej informacji, zobacz Wstrzymaj i wznawiaj migrację danych — Baza danych Stretch.

WAIT_AT_LOW_PRIORITY

Dotyczy: SQL Server (SQL Server 2014 (12.x) i Azure SQL Database.

Ponowne kompilowanie indeksu w trybie online musi czekać na operacje blokowania w tej tabeli. WAIT_AT_LOW_PRIORITY wskazuje, że operacja ponownego kompilowania indeksu online czeka na blokady o niskim priorytcie, co umożliwia wykonywanie innych operacji podczas oczekiwania na operację kompilacji indeksu online. Pominięcie opcji WAIT AT LOW PRIORITY jest takie samo jak WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).

MAX_DURATION = czas [MIN ]
Dotyczy: SQL Server (SQL Server 2014 (12.x) i Azure SQL Database.

Czas oczekiwania, czyli wartość całkowita określona w minutach, że SWITCH lub ponowne kompilowanie indeksu online czeka z niskim priorytetem podczas uruchamiania polecenia DDL. Jeśli operacja zostanie zablokowana przez MAX_DURATION czas, zostanie uruchomiona jedna z akcji ABORT_AFTER_WAIT. MAX_DURATION czas jest zawsze w minutach i można pominąć słowo MINUTy.

ABORT_AFTER_WAIT = [NONE | SELF | BLOKERY } ]

Dotyczy: SQL Server (SQL Server 2014 (12.x) i Azure SQL Database.

ŻADEN
Kontynuuj oczekiwanie na blokadę z normalnym (regularnym) priorytetem.

JAŹŃ
Zamknij obecnie uruchomioną operację DDL SWITCH lub indeksu online bez podejmowania żadnych akcji.

BLOKERY
Zabij wszystkie transakcje użytkownika, które obecnie blokują SWITCH lub operację ponownego kompilowania indeksu online, aby operacja mogła być kontynuowana.

Wymaga ALTER ANY CONNECTION uprawnienia.

JEŚLI ISTNIEJE

Dotyczy: SQL Server (SQL Server 2016 (13.x) i Azure SQL Database.

Warunkowo odrzuca kolumnę lub ograniczenie tylko wtedy, gdy już istnieje.

WZNAWIANIE = { WŁ. | WYŁ.}

Dotyczy: SQL Server 2022 (16.x) i nowszych.

Określa, czy operacja ALTER TABLE ADD CONSTRAINT jest wznawiana. Operacja dodawania ograniczeń tabeli jest wznawiana, gdy ON. Operacja dodawania ograniczeń tabeli nie jest wznawiana, gdy OFF. Wartość domyślna to OFF. Opcja RESUMABLE może być używana jako część ALTER TABLE index_option w ALTER TABLE table_constraint.

MAX_DURATION w przypadku użycia z RESUMABLE = ON (wymaga ONLINE = ON) wskazuje czas (wartość całkowita określona w minutach), że wznawiana operacja dodawania w trybie online jest wykonywana przed wstrzymaniem. Jeśli nie zostanie określony, operacja będzie kontynuowana do momentu ukończenia.

Aby uzyskać więcej informacji na temat włączania i używania wznawianych operacji ALTER TABLE ADD CONSTRAINT, zobacz Tabela z możliwością wznowienia dodawania ograniczeń.

Uwagi

Aby dodać nowe wiersze danych, użyj INSERT. Aby usunąć wiersze danych, użyj DELETE lub TRUNCATE TABLE. Aby zmienić wartości w istniejących wierszach, użyj UPDATE.

Jeśli w pamięci podręcznej procedury istnieją plany wykonywania odwołujące się do tabeli, funkcja ALTER TABLE oznacza je ponownie skompilować podczas następnego wykonywania.

W bazie danych SQL w usłudze Microsoft Fabric można utworzyć niektóre funkcje tabeli, ale nie będą dublowane w usłudze Fabric OneLake. Aby uzyskać więcej informacji, zobacz Ograniczenia dublowania bazy danych SQL w sieci szkieletowej.

Zmienianie rozmiaru kolumny

Długość, precyzja lub skala kolumny można zmienić, określając nowy rozmiar dla typu danych kolumny. Użyj klauzuli ALTER COLUMN. Jeśli dane istnieją w kolumnie, nowy rozmiar nie może być mniejszy niż maksymalny rozmiar danych. Ponadto nie można zdefiniować kolumny w indeksie, chyba że kolumna jest varchar, nvarcharlub varbinary typu danych, a indeks nie jest wynikiem ograniczenia klucza podstawowego. Zobacz przykład w krótkiej sekcji zatytułowanej Zmienianie definicji kolumny.

Blokady i ALTER TABLE

Zmiany określone w alter TABLE implementują natychmiast. Jeśli zmiany wymagają modyfikacji wierszy w tabeli, alter TABLE aktualizuje wiersze. Funkcja ALTER TABLE uzyskuje blokadę schematu (SCH-M) w tabeli, aby upewnić się, że żadne inne połączenia nie odwołują się nawet do metadanych tabeli podczas zmiany, z wyjątkiem operacji indeksu online, które wymagają krótkiej SCH-M blokady na końcu. W operacji ALTER TABLE...SWITCH blokada jest uzyskiwana zarówno w tabelach źródłowych, jak i docelowych. Modyfikacje wprowadzone w tabeli są rejestrowane i w pełni możliwe do odzyskania. Zmiany wpływające na wszystkie wiersze w dużych tabelach, takie jak upuszczenie kolumny lub w niektórych wersjach programu SQL Server, dodanie kolumny NOT NULL z wartością domyślną może zająć dużo czasu i wygenerować wiele rekordów dziennika. Uruchom te instrukcje ALTER TABLE z taką samą starannością jak dowolna instrukcja INSERT, UPDATE lub DELETE, która ma wpływ na wiele wierszy.

Dotyczy magazynu w usłudze Microsoft Fabric.

ALTER TABLE nie może być częścią jawnej transakcji.

XEvents przełącznika partycji

Następujące elementy XEvents są związane z ALTER TABLE ... SWITCH PARTITION i ponowne kompilowanie indeksu online.

  • lock_request_priority_state
  • process_killed_by_abort_blockers
  • ddl_with_wait_at_low_priority

Dodawanie kolumn NOT NULL jako operacji online

Począwszy od programu SQL Server 2012 (11.x) Enterprise Edition, dodanie kolumny NOT NULL z wartością domyślną jest operacją online, gdy wartością domyślną jest stała środowiska uruchomieniowego . Oznacza to, że operacja jest wykonywana niemal natychmiast pomimo liczby wierszy w tabeli, ponieważ istniejące wiersze w tabeli nie są aktualizowane podczas operacji. Zamiast tego wartość domyślna jest przechowywana tylko w metadanych tabeli, a wartość jest sprawdzana zgodnie z potrzebami w zapytaniach, które uzyskują dostęp do tych wierszy. To zachowanie jest automatyczne. Do zaimplementowania operacji online poza składnią ADD COLUMN nie jest wymagana żadna dodatkowa składnia. Stała środowiska uruchomieniowego to wyrażenie, które generuje tę samą wartość w czasie wykonywania dla każdego wiersza w tabeli, pomimo jego determinizmu. Na przykład stałe wyrażenie "Moje dane tymczasowe" lub funkcja systemowa GETUTCDATETIME() to stałe czasu wykonywania. Natomiast funkcje NEWID() lub NEWSEQUENTIALID() nie są stałymi środowiska uruchomieniowego, ponieważ unikatowa wartość jest generowany dla każdego wiersza w tabeli. Dodanie kolumny NOT NULL z wartością domyślną, która nie jest stałą środowiska uruchomieniowego, jest zawsze uruchamiana w trybie offline, a blokada na wyłączność (SCH-M) jest uzyskiwana przez czas trwania operacji.

Podczas gdy istniejące wiersze odwołują się do wartości przechowywanej w metadanych, wartość domyślna jest przechowywana w wierszu dla wszystkich nowo wstawionych wierszy i nie określa innej wartości dla kolumny. Wartość domyślna przechowywana w metadanych jest przenosina do istniejącego wiersza po zaktualizowaniu wiersza (nawet jeśli rzeczywista kolumna nie jest określona w instrukcji UPDATE) lub jeśli tabela lub indeks klastrowany zostanie ponownie skompilowany.

Kolumny typu varchar(max), nvarchar(max), varbinary(max), xml, tekst, ntext, obraz , hierarchyid , geometria , geografiilub CLR UDTS nie można dodać w operacji online. Nie można dodać kolumny w trybie online, jeśli spowoduje to, że maksymalny możliwy rozmiar wiersza przekracza limit 8060 bajtów. W tym przypadku kolumna jest dodawana jako operacja w trybie offline.

Równoległe wykonywanie planu

W programie SQL Server 2012 (11.x) Enterprise edition i nowszych wersjach liczba procesorów używanych do uruchamiania pojedynczej opcji konfiguracji ALTER TABLE ADD (indeksu) CONSTRAINT lub DROP (indeks klastrowany) jest określana przez maksymalny stopień równoległości opcji konfiguracji i bieżącego obciążenia. Jeśli aparat bazy danych wykryje, że system jest zajęty, stopień równoległości operacji zostanie automatycznie zmniejszony przed rozpoczęciem wykonywania instrukcji. Można ręcznie skonfigurować liczbę procesorów używanych do uruchamiania instrukcji, określając opcję MAXDOP. Aby uzyskać więcej informacji, zobacz Configure the max degree of parallelism Server Configuration Option.

Tabele partycjonowane

Oprócz wykonywania operacji SWITCH obejmujących tabele partycjonowane użyj funkcji ALTER TABLE, aby zmienić stan kolumn, ograniczeń i wyzwalaczy tabeli partycjonowanej, tak jak w przypadku tabel niepartycyjnych. Nie można jednak użyć tej instrukcji, aby zmienić sposób partycjonowania samej tabeli. Aby ponownie podzielić tabelę partycjonowaną, użyj ALTER PARTITION SCHEME i ALTER PARTITION FUNCTION. Ponadto nie można zmienić typu danych kolumny tabeli partycjonowanej.

Ograniczenia dotyczące tabel z widokami powiązanymi ze schematem

Ograniczenia stosowane do instrukcji ALTER TABLE w tabelach z widokami powiązanymi schematami są takie same jak ograniczenia stosowane obecnie podczas modyfikowania tabel za pomocą prostego indeksu. Dodawanie kolumny jest dozwolone. Jednak usunięcie lub zmiana kolumny, która uczestniczy w dowolnym widoku powiązanym ze schematem, nie jest dozwolona. Jeśli instrukcja ALTER TABLE wymaga zmiany kolumny używanej w widoku powiązanym schematem, funkcja ALTER TABLE ulegnie awarii, a aparat bazy danych zgłosi komunikat o błędzie. Aby uzyskać więcej informacji na temat powiązań schematu i widoków indeksowanych, zobacz CREATE VIEW.

Dodawanie lub usuwanie wyzwalaczy w tabelach bazowych nie ma wpływu na utworzenie widoku powiązanego ze schematem, który odwołuje się do tabel.

Indeksy i ALTER TABLE

Indeksy utworzone w ramach ograniczenia są porzucane po usunięciu ograniczenia. Indeksy utworzone za pomocą polecenia CREATE INDEX muszą zostać porzucone za pomocą polecenia DROP INDEX. Użyj instrukcji ALTER INDEX, aby ponownie skompilować część indeksu definicji ograniczenia; ograniczenie nie musi zostać usunięte i dodane ponownie za pomocą polecenia ALTER TABLE.

Przed usunięciem kolumny należy usunąć wszystkie indeksy i ograniczenia na podstawie kolumny.

Po usunięciu ograniczenia, które utworzyło indeks klastrowany, wiersze danych przechowywane na poziomie liści indeksu klastrowanego są przechowywane w tabeli nieklastrowanej. Indeks klastrowany można usunąć i przenieść wynikową tabelę do innej grupy plików lub schematu partycji w jednej transakcji, określając opcję PRZENIEŚ DO. Opcja MOVE TO ma następujące ograniczenia:

  • FUNKCJA MOVE TO nie jest prawidłowa dla indeksowanych widoków ani indeksów nieklastrowanych.
  • Schemat partycji lub grupa plików musi już istnieć.
  • Jeśli parametr MOVE TO nie jest określony, tabela znajduje się w tym samym schemacie partycji lub grupie plików, co zostało zdefiniowane dla klastrowanego indeksu.

Po usunięciu indeksu klastrowanego określ opcję ONLINE **=** ON, aby transakcja DROP INDEX nie blokowała zapytań i modyfikacji danych bazowych i skojarzonych indeksów nieklastrowanych.

Usługa ONLINE = ON ma następujące ograniczenia:

  • Usługa ONLINE = ON nie jest prawidłowa dla indeksów klastrowanych, które są również wyłączone. Wyłączone indeksy muszą zostać usunięte przy użyciu = ONLINE wył.
  • Jednocześnie można porzucić tylko jeden indeks.
  • Usługa ONLINE = ON nie jest prawidłowa dla indeksowanych widoków, indeksów nieklastrowanych ani indeksów w lokalnych tabelach tymczasowych.
  • Usługa ONLINE = ON nie jest prawidłowa dla indeksów magazynu kolumn.

Tymczasowe miejsce na dysku równe rozmiarowi istniejącego indeksu klastrowanego jest wymagane do porzucenia indeksu klastrowanego. To dodatkowe miejsce jest zwalniane natychmiast po zakończeniu operacji.

Nuta

Opcje wymienione w obszarze <drop_clustered_constraint_option> mają zastosowanie do klastrowanych indeksów w tabelach i nie można ich stosować do klastrowanych indeksów w widokach lub indeksach nieklastrowanych.

Replikowanie zmian schematu

Po uruchomieniu polecenia ALTER TABLE w opublikowanej tabeli w programie SQL Server Publisher domyślnie ta zmiana jest propagowana do wszystkich subskrybentów programu SQL Server. Ta funkcja ma pewne ograniczenia. Można go wyłączyć. Aby uzyskać więcej informacji, zobacz Wprowadzanie zmian schematu w bazach danych publikacji.

Kompresja danych

Nie można włączyć tabel systemowych na potrzeby kompresji. Jeśli tabela jest stertą, operacja ponownego kompilowania dla trybu ONLINE będzie mieć pojedynczy wątek. Użyj trybu OFFLINE dla wielowątkowego operacji ponownego kompilowania stert. Aby uzyskać więcej informacji na temat kompresji danych, zobacz Kompresja danych.

Aby ocenić, jak zmiana stanu kompresji wpłynie na tabelę, indeks lub partycję, użyj procedury składowanej systemu sp_estimate_data_compression_savings.

Następujące ograniczenia dotyczą tabel podzielonych na partycje:

  • Nie można zmienić ustawienia kompresji pojedynczej partycji, jeśli tabela ma nieprzywiązane indeksy.
  • ALTER TABLE <table> REBUILD PARTITION ... składnia ponownie kompiluje określoną partycję.
  • ALTER TABLE <table> REBUILD WITH ... składnia ponownie kompiluje wszystkie partycje.

Usuwanie kolumn NTEXT

Podczas upuszczania kolumn przy użyciu przestarzałego typu danych NTEXTczyszczenie usuniętych danych odbywa się jako operacja serializowana we wszystkich wierszach. Oczyszczanie może wymagać dużego czasu. Po upuszczaniu kolumny NTEXT w tabeli z dużą częścią wierszy zaktualizuj kolumnę NTEXT na wartość NULL, a następnie upuść kolumnę. Tę opcję można uruchomić za pomocą operacji równoległych i znacznie przyspieszyć.

Ponowne kompilowanie indeksu online

Aby uruchomić instrukcję DDL dla ponownego kompilowania indeksu online, należy ukończyć wszystkie aktywne transakcje blokujące uruchomione w określonej tabeli. Po uruchomieniu ponownego kompilowania indeksu online wszystkie nowe transakcje, które są gotowe do uruchomienia w tej tabeli. Mimo że czas trwania blokady ponownego kompilowania indeksu online jest krótki, oczekiwanie na ukończenie wszystkich otwartych transakcji w danej tabeli i zablokowanie nowych transakcji może znacząco wpłynąć na przepływność. Może to spowodować spowolnienie lub przekroczenie limitu czasu obciążenia i znaczne ograniczenie dostępu do tabeli bazowej. Opcja WAIT_AT_LOW_PRIORITY umożliwia administratorom baz danych zarządzanie blokadami S i Sch-M wymaganymi do ponownego kompilowania indeksu online. We wszystkich trzech przypadkach: NONE, SELF i BLOCKERS, jeśli w czasie oczekiwania ((MAX_DURATION =n [minutes]) ) nie ma żadnych działań blokujących, ponowne kompilowanie indeksu online jest uruchamiane natychmiast bez oczekiwania i instrukcja DDL zostanie ukończona.

Obsługa zgodności

Instrukcja ALTER TABLE obsługuje tylko dwie części (schema.object) nazwy tabel. W programie SQL Server określenie nazwy tabeli przy użyciu następujących formatów kończy się niepowodzeniem w czasie kompilacji z błędem 117.

  • server.database.schema.table
  • .database.schema.table
  • ..schema.table

We wcześniejszych wersjach określ format server.database.schema.table zwrócił błąd 4902. Określanie formatu .database.schema.table lub format ..schema.table powiodło się.

Aby rozwiązać ten problem, usuń użycie czteroczęściowego prefiksu.

Uprawnienia

Wymaga uprawnienia ALTER w tabeli.

Uprawnienia ALTER TABLE mają zastosowanie do obu tabel zaangażowanych w instrukcję ALTER TABLE SWITCH. Wszystkie przełączone dane dziedziczą zabezpieczenia tabeli docelowej.

Jeśli zdefiniowano dowolne kolumny w instrukcji ALTER TABLE jako typu środowiska uruchomieniowego języka wspólnego (CLR) zdefiniowanego przez użytkownika lub aliasu, wymagane jest uprawnienie REFERENCES dla typu.

Dodanie lub zmodyfikowanie kolumny, która aktualizuje wiersze tabeli, wymaga uprawnień UPDATE w tabeli. Na przykład dodanie kolumny NOT NULL z wartością domyślną lub dodanie kolumny tożsamości, gdy tabela nie jest pusta.

Przykłady

Kategoria Polecane elementy składni
dodawanie kolumn i ograniczeń DODAJ * KLUCZ PODSTAWOWY z opcjami indeksu * rozrzedzanymi kolumnami i zestawami kolumn *
usuwanie kolumn i ograniczeń KROPLA
zmienianie definicji kolumny zmiana typu danych * zmiana rozmiaru kolumny * sortowanie
zmienianie definicji tabeli DATA_COMPRESSION * SWITCH PARTITION * LOCK ESCALATION * change tracking
wyłączanie i włączanie ograniczeń i wyzwalaczy CHECK * NO CHECK * ENABLE TRIGGER * DISABLE TRIGGER
Operacje online ONLINE
przechowywanie wersji systemu SYSTEM_VERSIONING

Dodawanie kolumn i ograniczeń

Przykłady w tej sekcji przedstawiają dodawanie kolumn i ograniczeń do tabeli.

A. Dodawanie nowej kolumny

Poniższy przykład dodaje kolumnę, która zezwala na wartości null i nie zawiera wartości podanych za pomocą definicji DOMYŚLNEj. W nowej kolumnie każdy wiersz będzie miał NULL.

CREATE TABLE dbo.doc_exa (column_a INT) ;
GO
ALTER TABLE dbo.doc_exa ADD column_b VARCHAR(20) NULL ;
GO

B. Dodawanie kolumny z ograniczeniem

Poniższy przykład dodaje nową kolumnę z ograniczeniem UNIQUE.

CREATE TABLE dbo.doc_exc (column_a INT) ;
GO
ALTER TABLE dbo.doc_exc ADD column_b VARCHAR(20) NULL
    CONSTRAINT exb_unique UNIQUE ;
GO
EXEC sp_help doc_exc ;
GO
DROP TABLE dbo.doc_exc ;
GO

C. Dodawanie niezweryfikowanego ograniczenia CHECK do istniejącej kolumny

Poniższy przykład dodaje ograniczenie do istniejącej kolumny w tabeli. Kolumna ma wartość, która narusza ograniczenie. W związku z tym WITH NOCHECK służy do zapobiegania weryfikowaniu ograniczenia względem istniejących wierszy i umożliwienia dodania ograniczenia.

CREATE TABLE dbo.doc_exd (column_a INT) ;
GO
INSERT INTO dbo.doc_exd VALUES (-1) ;
GO
ALTER TABLE dbo.doc_exd WITH NOCHECK
ADD CONSTRAINT exd_check CHECK (column_a > 1) ;
GO
EXEC sp_help doc_exd ;
GO
DROP TABLE dbo.doc_exd ;
GO

D. Dodawanie ograniczenia DOMYŚLNEgo do istniejącej kolumny

Poniższy przykład tworzy tabelę z dwiema kolumnami i wstawia wartość do pierwszej kolumny, a druga kolumna pozostaje równa NULL. Ograniczenie DEFAULT jest następnie dodawane do drugiej kolumny. Aby sprawdzić, czy wartość domyślna jest stosowana, kolejna wartość jest wstawiana do pierwszej kolumny, a tabela jest odpytywane.

CREATE TABLE dbo.doc_exz (column_a INT, column_b INT) ;
GO
INSERT INTO dbo.doc_exz (column_a) VALUES (7) ;
GO
ALTER TABLE dbo.doc_exz
  ADD CONSTRAINT col_b_def
  DEFAULT 50 FOR column_b ;
GO
INSERT INTO dbo.doc_exz (column_a) VALUES (10) ;
GO
SELECT * FROM dbo.doc_exz ;
GO
DROP TABLE dbo.doc_exz ;
GO

E. Dodawanie kilku kolumn z ograniczeniami

W poniższym przykładzie dodano kilka kolumn z ograniczeniami zdefiniowanymi przy użyciu nowej kolumny. Pierwsza nowa kolumna ma właściwość IDENTITY. Każdy wiersz w tabeli ma nowe wartości przyrostowe w kolumnie tożsamości.

CREATE TABLE dbo.doc_exe (column_a INT CONSTRAINT column_a_un UNIQUE) ;
GO
ALTER TABLE dbo.doc_exe ADD

-- Add a PRIMARY KEY identity column.
column_b INT IDENTITY
CONSTRAINT column_b_pk PRIMARY KEY,

-- Add a column that references another column in the same table.
column_c INT NULL
CONSTRAINT column_c_fk
REFERENCES doc_exe(column_a),

-- Add a column with a constraint to enforce that
-- nonnull data is in a valid telephone number format.
column_d VARCHAR(16) NULL
CONSTRAINT column_d_chk
CHECK
(column_d LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' OR
column_d LIKE
'([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'),

-- Add a nonnull column with a default.
column_e DECIMAL(3,3)
CONSTRAINT column_e_default
DEFAULT .081 ;
GO
EXEC sp_help doc_exe ;
GO
DROP TABLE dbo.doc_exe ;
GO

F. Dodawanie kolumny dopuszczanej do wartości null z wartościami domyślnymi

Poniższy przykład dodaje kolumnę dopuszczaną do wartości null z definicją DEFAULT i używa WITH VALUES do podawania wartości dla każdego istniejącego wiersza w tabeli. Jeśli funkcja WITH VALUES nie jest używana, każdy wiersz ma wartość NULL w nowej kolumnie.

CREATE TABLE dbo.doc_exf (column_a INT) ;
GO
INSERT INTO dbo.doc_exf VALUES (1) ;
GO
ALTER TABLE dbo.doc_exf
ADD AddDate smalldatetime NULL
CONSTRAINT AddDateDflt
DEFAULT GETDATE() WITH VALUES ;
GO
DROP TABLE dbo.doc_exf ;
GO

G. Tworzenie ograniczenia KLUCZA PODSTAWOWEgo z opcjami kompresji indeksu lub danych

Poniższy przykład tworzy ograniczenie KLUCZA PODSTAWOWEgo PK_TransactionHistoryArchive_TransactionID i ustawia opcje FILLFACTOR, ONLINEi PAD_INDEX. Wynikowy indeks klastrowany będzie miał taką samą nazwę jak ograniczenie.

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

USE AdventureWorks;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID)
WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON);
GO

Ten podobny przykład stosuje kompresję strony podczas stosowania klastrowanego klucza podstawowego.

USE AdventureWorks;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID)
WITH (DATA_COMPRESSION = PAGE);
GO

H. Dodawanie rozrzednej kolumny

W poniższych przykładach pokazano dodawanie i modyfikowanie rozrzednych kolumn w tabeli T1. Kod do utworzenia T1 tabeli jest następujący.

CREATE TABLE T1 (
  C1 INT PRIMARY KEY,
  C2 VARCHAR(50) SPARSE NULL,
  C3 INT SPARSE NULL,
  C4 INT) ;
GO

Aby dodać dodatkową kolumnę rozrzedzną C5, wykonaj następującą instrukcję.

ALTER TABLE T1
ADD C5 CHAR(100) SPARSE NULL ;
GO

Aby przekonwertować kolumnę C4 bez rozrzedu na kolumnę rozrzedliwą, wykonaj następującą instrukcję.

ALTER TABLE T1
ALTER COLUMN C4 ADD SPARSE ;
GO

Aby przekonwertować kolumnę C4 rozrzednia na kolumnę nieparzystową, wykonaj następującą instrukcję.

ALTER TABLE T1
ALTER COLUMN C4 DROP SPARSE ;
GO

Ja. Dodawanie zestawu kolumn

W poniższych przykładach pokazano dodawanie kolumny do tabeli T2. Nie można dodać zestawu kolumn do tabeli, która zawiera już rozrzedzona kolumny. Kod do utworzenia T2 tabeli jest następujący.

CREATE TABLE T2 (
  C1 INT PRIMARY KEY,
  C2 VARCHAR(50) NULL,
  C3 INT NULL,
  C4 INT) ;
GO

Poniższe trzy instrukcje dodają zestaw kolumn o nazwie CS, a następnie zmodyfikuj kolumny C2 i C3 do SPARSE.

ALTER TABLE T2
ADD CS XML COLUMN_SET FOR ALL_SPARSE_COLUMNS ;
GO

ALTER TABLE T2
ALTER COLUMN C2 ADD SPARSE ;
GO

ALTER TABLE T2
ALTER COLUMN C3 ADD SPARSE ;
GO

J. Dodawanie zaszyfrowanej kolumny

Poniższa instrukcja dodaje zaszyfrowaną kolumnę o nazwie PromotionCode.

ALTER TABLE Customers ADD
    PromotionCode nvarchar(100)
    ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = MyCEK,
    ENCRYPTION_TYPE = RANDOMIZED,
    ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') ;

K. Dodawanie klucza podstawowego z operacją z możliwością wznowienia

Wznawiana operacja ALTER TABLE dodawania klucza podstawowego klastrowanego w kolumnie (a) z MAX_DURATION 240 minut.

ALTER TABLE table1
ADD CONSTRAINT PK_Constrain PRIMARY KEY CLUSTERED (a)
WITH (ONLINE = ON, MAXDOP = 2, RESUMABLE = ON, MAX_DURATION = 240);

Usuwanie kolumn i ograniczeń

W przykładach w tej sekcji przedstawiono usuwanie kolumn i ograniczeń.

A. Usuwanie kolumny lub kolumn

Pierwszy przykład modyfikuje tabelę w celu usunięcia kolumny. Drugi przykład usuwa wiele kolumn.

CREATE TABLE dbo.doc_exb (
     column_a INT,
     column_b VARCHAR(20) NULL,
     column_c DATETIME,
     column_d INT) ;
GO
-- Remove a single column.
ALTER TABLE dbo.doc_exb DROP COLUMN column_b ;
GO
-- Remove multiple columns.
ALTER TABLE dbo.doc_exb DROP COLUMN column_c, column_d;

B. Usuwanie ograniczeń i kolumn

Pierwszy przykład usuwa ograniczenie UNIQUE z tabeli. Drugi przykład usuwa dwa ograniczenia i jedną kolumnę.

CREATE TABLE dbo.doc_exc (column_a INT NOT NULL CONSTRAINT my_constraint UNIQUE) ;
GO

-- Example 1. Remove a single constraint.
ALTER TABLE dbo.doc_exc DROP my_constraint ;
GO

DROP TABLE dbo.doc_exc;
GO

CREATE TABLE dbo.doc_exc ( column_a INT
                          NOT NULL CONSTRAINT my_constraint UNIQUE
                          ,column_b INT
                          NOT NULL CONSTRAINT my_pk_constraint PRIMARY KEY) ;
GO

-- Example 2. Remove two constraints and one column
-- The keyword CONSTRAINT is optional. The keyword COLUMN is required.
ALTER TABLE dbo.doc_exc
DROP CONSTRAINT my_constraint, my_pk_constraint, COLUMN column_b ;
GO

C. Usuwanie ograniczenia KLUCZA PODSTAWOWEgo w trybie ONLINE

Poniższy przykład usuwa ograniczenie KLUCZA PODSTAWOWEgo z opcją ONLINE ustawioną na ON.

ALTER TABLE Production.TransactionHistoryArchive
DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID
WITH (ONLINE = ON) ;
GO

D. Dodawanie i usuwanie ograniczenia KLUCZA OBCEgo

Poniższy przykład tworzy tabelę ContactBackup, a następnie zmienia tabelę, najpierw dodając ograniczenie FOREIGN KEY odwołujące się do tabeli Person.Person, a następnie upuszczając ograniczenie FOREIGN KEY.

CREATE TABLE Person.ContactBackup
    (ContactID INT) ;
GO

ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBackup_Contact FOREIGN KEY (ContactID)
    REFERENCES Person.Person (BusinessEntityID) ;
GO

ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBackup_Contact ;
GO

DROP TABLE Person.ContactBackup ;

Zmienianie definicji kolumny

A. Zmienianie typu danych kolumny

Poniższy przykład zmienia kolumnę tabeli z INT na DECIMAL.

CREATE TABLE dbo.doc_exy (column_a INT) ;
GO
INSERT INTO dbo.doc_exy (column_a) VALUES (10) ;
GO
ALTER TABLE dbo.doc_exy ALTER COLUMN column_a DECIMAL (5, 2) ;
GO
DROP TABLE dbo.doc_exy ;
GO

B. Zmienianie rozmiaru kolumny

Poniższy przykład zwiększa rozmiar kolumny varchar oraz precyzję i skalę kolumny dziesiętnej. Ponieważ kolumny zawierają dane, rozmiar kolumny można zwiększyć tylko. Zwróć również uwagę, że col_a jest definiowana w unikatowym indeksie. Rozmiar col_a można nadal zwiększyć, ponieważ typ danych jest varchar, a indeks nie jest wynikiem ograniczenia KLUCZA PODSTAWOWEgo.

-- Create a two-column table with a unique index on the varchar column.
CREATE TABLE dbo.doc_exy (col_a varchar(5) UNIQUE NOT NULL, col_b decimal (4,2)) ;
GO
INSERT INTO dbo.doc_exy VALUES ('Test', 99.99) ;
GO
-- Verify the current column size.
SELECT name, TYPE_NAME(system_type_id), max_length, precision, scale
FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.doc_exy') ;
GO
-- Increase the size of the varchar column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_a varchar(25) ;
GO
-- Increase the scale and precision of the decimal column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_b decimal (10,4) ;
GO
-- Insert a new row.
INSERT INTO dbo.doc_exy VALUES ('MyNewColumnSize', 99999.9999) ;
GO
-- Verify the current column size.
SELECT name, TYPE_NAME(system_type_id), max_length, precision, scale
FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.doc_exy') ;

C. Zmienianie sortowania kolumn

W poniższym przykładzie pokazano, jak zmienić sortowanie kolumny. Najpierw tabela jest tworzona z domyślnym sortowaniem użytkownika.

CREATE TABLE T3 (
  C1 INT PRIMARY KEY,
  C2 VARCHAR(50) NULL,
  C3 INT NULL,
  C4 INT) ;
GO

Następnie sortowanie kolumn C2 zostanie zmienione na Latin1_General_BIN. Typ danych jest wymagany, mimo że nie został zmieniony.

ALTER TABLE T3
ALTER COLUMN C2 varchar(50) COLLATE Latin1_General_BIN ;
GO

D. Szyfrowanie kolumny

W poniższym przykładzie pokazano, jak zaszyfrować kolumnę przy użyciu funkcji Always Encrypted z bezpiecznymi enklawami.

Najpierw tabela jest tworzona bez żadnych zaszyfrowanych kolumn.

CREATE TABLE T3 (
  C1 INT PRIMARY KEY,
  C2 VARCHAR(50) NULL,
  C3 INT NULL,
  C4 INT) ;
GO

Następnie kolumna "C2" jest szyfrowana przy użyciu klucza szyfrowania kolumny o nazwie CEK1i losowego szyfrowania. Aby następująca instrukcja powiodła się:

  • Klucz szyfrowania kolumny musi być włączony w enklawie. Oznacza to, że musi być zaszyfrowany przy użyciu klucza głównego kolumny, który umożliwia obliczenia enklawy.
  • Docelowe wystąpienie programu SQL Server musi obsługiwać funkcję Always Encrypted z bezpiecznymi enklawami.
  • Instrukcję należy wydać za pośrednictwem połączenia skonfigurowanego dla funkcji Always Encrypted z bezpiecznymi enklawami i przy użyciu obsługiwanego sterownika klienta.
  • Aplikacja wywołująca musi mieć dostęp do klucza głównego kolumny, chroniąc CEK1.
ALTER TABLE T3
ALTER COLUMN C2 VARCHAR(50) ENCRYPTED
WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL;
GO

Zmienianie definicji tabeli

W przykładach w tej sekcji pokazano, jak zmienić definicję tabeli.

A. Modyfikowanie tabeli w celu zmiany kompresji

Poniższy przykład zmienia kompresję tabeli niepartycyjnej. Sterta lub indeks klastrowany zostaną ponownie skompilowane. Jeśli tabela jest stertą, wszystkie indeksy nieklastrowane zostaną ponownie skompilowane.

ALTER TABLE T1
REBUILD WITH (DATA_COMPRESSION = PAGE) ;

Poniższy przykład zmienia kompresję partycjonowanej tabeli. Składnia REBUILD PARTITION = 1 powoduje ponowne skompilowanie tylko 1 numerów partycji.

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

ALTER TABLE PartitionTable1
REBUILD PARTITION = 1 WITH (DATA_COMPRESSION =NONE) ;
GO

Ta sama operacja przy użyciu następującej alternatywnej składni powoduje ponowne skompilowanie wszystkich partycji w tabeli.

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

ALTER TABLE PartitionTable1
REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = PAGE ON PARTITIONS(1)) ;

Aby uzyskać dodatkowe przykłady kompresji danych, zobacz Kompresja danych.

B. Modyfikowanie tabeli magazynu kolumn w celu zmiany kompresji archiwalnej

Poniższy przykład dodatkowo kompresuje partycję tabeli magazynu kolumn przez zastosowanie dodatkowego algorytmu kompresji. Ta kompresja zmniejsza tabelę do mniejszego rozmiaru, ale także zwiększa czas wymagany do przechowywania i pobierania. Jest to przydatne w przypadku archiwizacji lub sytuacji, które wymagają mniejszej ilości miejsca i mogą pozwolić na więcej czasu na przechowywanie i pobieranie.

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

ALTER TABLE PartitionTable1
REBUILD PARTITION = 1 WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE) ;
GO

Poniższy przykład dekompresuje partycję tabeli magazynu kolumn, która została skompresowana przy użyciu opcji COLUMNSTORE_ARCHIVE. Po przywróceniu danych będzie ona nadal kompresowana przy użyciu kompresji magazynu kolumn, która jest używana dla wszystkich tabel magazynu kolumn.

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

ALTER TABLE PartitionTable1
REBUILD PARTITION = 1 WITH (DATA_COMPRESSION = COLUMNSTORE) ;
GO

C. Przełączanie partycji między tabelami

Poniższy przykład tworzy tabelę partycjonowaną przy założeniu, że schemat partycji myRangePS1 został już utworzony w bazie danych. Następnie zostanie utworzona tabela bez partycji z taką samą strukturą jak tabela partycjonowana i w tej samej grupie plików co PARTITION 2 tabeli PartitionTable. Dane PARTITION 2 tabeli PartitionTable są następnie przełączane na tabelę NonPartitionTable.

CREATE TABLE PartitionTable (col1 INT, col2 CHAR(10))
ON myRangePS1 (col1) ;
GO
CREATE TABLE NonPartitionTable (col1 INT, col2 CHAR(10))
ON test2fg ;
GO
ALTER TABLE PartitionTable SWITCH PARTITION 2 TO NonPartitionTable ;
GO

D. Zezwalaj na eskalację blokady w tabelach podzielonych na partycje

Poniższy przykład umożliwia eskalację blokady do poziomu partycji w tabeli partycjonowanej. Jeśli tabela nie jest partycjonowana, eskalacja blokady jest ustawiona na poziomie TABELI.

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

ALTER TABLE dbo.T1 SET (LOCK_ESCALATION = AUTO) ;
GO

E. Konfigurowanie śledzenia zmian w tabeli

Poniższy przykład umożliwia śledzenie zmian w tabeli Person.Person.

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

USE AdventureWorks;
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING ;

Poniższy przykład umożliwia śledzenie zmian i umożliwia śledzenie kolumn, które są aktualizowane podczas zmiany.

Dotyczy: SQL Server 2008 (10.0.x) i nowszych.

USE AdventureWorks;
GO
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON)

Poniższy przykład wyłącza śledzenie zmian w tabeli Person.Person.

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

USE AdventureWorks;
GO
ALTER TABLE Person.Person
DISABLE CHANGE_TRACKING ;

Wyłączanie i włączanie ograniczeń i wyzwalaczy

A. Wyłączanie i ponowne włączanie ograniczenia

Poniższy przykład wyłącza ograniczenie ograniczające, które ogranicza wynagrodzenia akceptowane w danych. NOCHECK CONSTRAINT jest używany z ALTER TABLE, aby wyłączyć ograniczenie i zezwalać na wstawianie, które zwykle naruszałoby ograniczenie. CHECK CONSTRAINT ponownie włącza ograniczenie.

CREATE TABLE dbo.cnst_example (
  id INT NOT NULL,
  name VARCHAR(10) NOT NULL,
  salary MONEY NOT NULL
  CONSTRAINT salary_cap CHECK (salary < 100000)) ;

-- Valid inserts
INSERT INTO dbo.cnst_example VALUES (1,'Joe Brown',65000) ;
INSERT INTO dbo.cnst_example VALUES (2,'Mary Smith',75000) ;

-- This insert violates the constraint.
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000) ;

-- Disable the constraint and try again.
ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000) ;

-- Re-enable the constraint and try another insert; this will fail.
ALTER TABLE dbo.cnst_example CHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (4,'Eric James',110000) ;

B. Wyłączanie i ponowne włączanie wyzwalacza

W poniższym przykładzie użyto opcji DISABLE TRIGGERALTER TABLE, aby wyłączyć wyzwalacz i zezwolić na wstawianie, które zwykle narusza wyzwalacz. ENABLE TRIGGER następnie służy do ponownego włączania wyzwalacza.

CREATE TABLE dbo.trig_example (
  id INT,
  name VARCHAR(12),
  salary MONEY) ;
GO
-- Create the trigger.
CREATE TRIGGER dbo.trig1 ON dbo.trig_example FOR INSERT
AS
IF (SELECT COUNT(*) FROM INSERTED
WHERE salary > 100000) > 0
BEGIN
    print 'TRIG1 Error: you attempted to insert a salary > $100,000'
    ROLLBACK TRANSACTION
END ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (1,'Pat Smith',100001) ;
GO
-- Disable the trigger.
ALTER TABLE dbo.trig_example DISABLE TRIGGER trig1 ;
GO
-- Try an insert that would typically violate the trigger.
INSERT INTO dbo.trig_example VALUES (2,'Chuck Jones',100001) ;
GO
-- Re-enable the trigger.
ALTER TABLE dbo.trig_example ENABLE TRIGGER trig1 ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (3,'Mary Booth',100001) ;
GO

Operacje online

A. Ponowne kompilowanie indeksu online przy użyciu opcji oczekiwania o niskim priorytcie

W poniższym przykładzie pokazano, jak wykonać ponowną kompilację indeksu online, określając opcje oczekiwania o niskim priorytekcie.

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

ALTER TABLE T1
REBUILD WITH
(
    PAD_INDEX = ON,
    ONLINE = ON ( WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 4 MINUTES,
                                         ABORT_AFTER_WAIT = BLOCKERS ) )
) ;

B. Zmiana kolumny online

W poniższym przykładzie pokazano, jak uruchomić operację zmiany kolumny z opcją ONLINE.

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

CREATE TABLE dbo.doc_exy (column_a INT) ;
GO
INSERT INTO dbo.doc_exy (column_a) VALUES (10) ;
GO
ALTER TABLE dbo.doc_exy
    ALTER COLUMN column_a DECIMAL (5, 2) WITH (ONLINE = ON) ;
GO
sp_help doc_exy;
DROP TABLE dbo.doc_exy ;
GO

Przechowywanie wersji systemu

Poniższe cztery przykłady ułatwią zapoznanie się ze składnią używania wersji systemu. Aby uzyskać dodatkową pomoc, zobacz Wprowadzenie do tabel czasowych System-Versioned.

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

A. Dodawanie przechowywania wersji systemu do istniejących tabel

W poniższym przykładzie pokazano, jak dodać przechowywanie wersji systemu do istniejącej tabeli i utworzyć tabelę historii przyszłości. W tym przykładzie przyjęto założenie, że istnieje istniejąca tabela o nazwie InsurancePolicy z zdefiniowanym kluczem podstawowym. W tym przykładzie są wypełniane nowo utworzone kolumny okresu na potrzeby przechowywania wersji systemu przy użyciu wartości domyślnych dla czasów rozpoczęcia i zakończenia, ponieważ te wartości nie mogą mieć wartości null. W tym przykładzie użyto klauzuli HIDDEN, aby zapewnić brak wpływu na istniejące aplikacje wchodzące w interakcję z bieżącą tabelą. Używa również HISTORY_RETENTION_PERIOD, które są dostępne tylko w usłudze SQL Database.

--Alter non-temporal table to define periods for system versioning
ALTER TABLE InsurancePolicy
ADD PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo),
ValidFrom datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL
    DEFAULT SYSUTCDATETIME(),
ValidTo datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL
    DEFAULT CONVERT(DATETIME2, '9999-12-31 23:59:59.99999999') ;

--Enable system versioning with 1 year retention for historical data
ALTER TABLE InsurancePolicy
SET (SYSTEM_VERSIONING = ON (HISTORY_RETENTION_PERIOD = 1 YEAR)) ;

B. Migrowanie istniejącego rozwiązania do korzystania z przechowywania wersji systemu

W poniższym przykładzie pokazano, jak przeprowadzić migrację do przechowywania wersji systemu z rozwiązania, które używa wyzwalaczy do naśladowania obsługi czasowej. W przykładzie przyjęto założenie, że istnieje istniejące rozwiązanie korzystające z tabeli ProjectTask i tabeli ProjectTaskHistory dla istniejącego rozwiązania, które używa kolumn Changed Date i Revised Date dla swoich okresów, że te kolumny okresu nie używają typu danych datetime2 i że tabela ProjectTask ma zdefiniowany klucz podstawowy.

-- Drop existing trigger
DROP TRIGGER ProjectTask_HistoryTrigger;

-- Adjust the schema for current and history table
-- Change data types for existing period columns
ALTER TABLE ProjectTask ALTER COLUMN [Changed Date] datetime2 NOT NULL ;
ALTER TABLE ProjectTask ALTER COLUMN [Revised Date] datetime2 NOT NULL ;
ALTER TABLE ProjectTaskHistory ALTER COLUMN [Changed Date] datetime2 NOT NULL ;
ALTER TABLE ProjectTaskHistory ALTER COLUMN [Revised Date] datetime2 NOT NULL ;

-- Add SYSTEM_TIME period and set system versioning with linking two existing tables
-- (a certain set of data checks happen in the background)
ALTER TABLE ProjectTask
ADD PERIOD FOR SYSTEM_TIME ([Changed Date], [Revised Date])

ALTER TABLE ProjectTask
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.ProjectTaskHistory, DATA_CONSISTENCY_CHECK = ON))

C. Wyłączanie i ponowne włączanie przechowywania wersji systemu w celu zmiany schematu tabeli

W tym przykładzie pokazano, jak wyłączyć przechowywanie wersji systemu w tabeli Department, dodać kolumnę i ponownie włączyć przechowywanie wersji systemu. Wyłączenie przechowywania wersji systemu jest wymagane do zmodyfikowania schematu tabeli. Wykonaj te kroki w ramach transakcji, aby zapobiec aktualizacjom obu tabel podczas aktualizowania schematu tabeli, co umożliwia administratorowi bazy danych pominięcie sprawdzania spójności danych podczas ponownego włączania przechowywania wersji systemu i uzyskania korzyści z wydajności. Zadania takie jak tworzenie statystyk, przełączanie partycji lub stosowanie kompresji do jednej lub obu tabel nie wymagają wyłączenia przechowywania wersji systemu.

BEGIN TRAN
/* Takes schema lock on both tables */
ALTER TABLE Department
    SET (SYSTEM_VERSIONING = OFF) ;
/* expand table schema for temporal table */
ALTER TABLE Department
     ADD Col5 int NOT NULL DEFAULT 0 ;
/* Expand table schema for history table */
ALTER TABLE DepartmentHistory
    ADD Col5 int NOT NULL DEFAULT 0 ;
/* Re-establish versioning again*/
ALTER TABLE Department
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE=dbo.DepartmentHistory,
                                 DATA_CONSISTENCY_CHECK = OFF)) ;
COMMIT

D. Usuwanie przechowywania wersji systemu

W tym przykładzie pokazano, jak całkowicie usunąć przechowywanie wersji systemu z tabeli Dział i usunąć tabelę DepartmentHistory. Opcjonalnie możesz również usunąć kolumny okresów używane przez system do rejestrowania informacji o wersji systemu. Nie można usunąć Department lub tabel DepartmentHistory podczas włączania przechowywania wersji systemu.

ALTER TABLE Department
    SET (SYSTEM_VERSIONING = OFF) ;
ALTER TABLE Department
DROP PERIOD FOR SYSTEM_TIME ;
DROP TABLE DepartmentHistory ;

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

W poniższych przykładach od A do C użyto tabeli FactResellerSales w bazie danych AdventureWorksPDW2022.

A. Określanie, czy tabela jest partycjonowana

Poniższe zapytanie zwraca co najmniej jeden wiersz, jeśli tabela FactResellerSales jest partycjonowana. Jeśli tabela nie jest partycjonowana, nie są zwracane żadne wiersze.

SELECT * FROM sys.partitions AS p
JOIN sys.tables AS t
    ON p.object_id = t.object_id
WHERE p.partition_id IS NOT NULL
    AND t.name = 'FactResellerSales' ;

B. Określanie wartości granic dla tabeli partycjonowanej

Poniższe zapytanie zwraca wartości granic dla każdej partycji w tabeli FactResellerSales.

SELECT t.name AS TableName, i.name AS IndexName, p.partition_number,
    p.partition_id, i.data_space_id, f.function_id, f.type_desc,
    r.boundary_id, r.value AS BoundaryValue
FROM sys.tables AS t
JOIN sys.indexes AS i
    ON t.object_id = i.object_id
JOIN sys.partitions AS p
    ON i.object_id = p.object_id AND i.index_id = p.index_id
JOIN  sys.partition_schemes AS s
    ON i.data_space_id = s.data_space_id
JOIN sys.partition_functions AS f
    ON s.function_id = f.function_id
LEFT JOIN sys.partition_range_values AS r
    ON f.function_id = r.function_id and r.boundary_id = p.partition_number
WHERE t.name = 'FactResellerSales' AND i.type <= 1
ORDER BY p.partition_number ;

C. Określanie kolumny partycji dla tabeli partycjonowanej

Poniższe zapytanie zwraca nazwę kolumny partycjonowania dla tabeli. FactResellerSales.

SELECT t.object_id AS Object_ID, t.name AS TableName,
    ic.column_id as PartitioningColumnID, c.name AS PartitioningColumnName
FROM sys.tables AS t
JOIN sys.indexes AS i
    ON t.object_id = i.object_id
JOIN sys.columns AS c
    ON t.object_id = c.object_id
JOIN sys.partition_schemes AS ps
    ON ps.data_space_id = i.data_space_id
JOIN sys.index_columns AS ic
    ON ic.object_id = i.object_id
    AND ic.index_id = i.index_id AND ic.partition_ordinal > 0
WHERE t.name = 'FactResellerSales'
AND i.type <= 1
AND c.column_id = ic.column_id ;

D. Scalanie dwóch partycji

Poniższy przykład scala dwie partycje w tabeli.

Tabela Customer ma następującą definicję:

CREATE TABLE Customer (
    id INT NOT NULL,
    lastName VARCHAR(20),
    orderCount INT,
    orderDate DATE)
WITH
    ( DISTRIBUTION = HASH(id),
    PARTITION ( orderCount RANGE LEFT
    FOR VALUES (1, 5, 10, 25, 50, 100))) ;

Następujące polecenie łączy granice partycji 10 i 25.

ALTER TABLE Customer MERGE RANGE (10);

Nowy DDL dla tabeli to:

CREATE TABLE Customer (
    id INT NOT NULL,
    lastName VARCHAR(20),
    orderCount INT,
    orderDate DATE)
WITH
    ( DISTRIBUTION = HASH(id),
    PARTITION ( orderCount RANGE LEFT
    FOR VALUES (1, 5, 25, 50, 100))) ;

E. Dzielenie partycji

Poniższy przykład dzieli partycję w tabeli.

Tabela Customer ma następujący kod DDL:

DROP TABLE Customer;

CREATE TABLE Customer (
    id INT NOT NULL,
    lastName VARCHAR(20),
    orderCount INT,
    orderDate DATE)
WITH
    ( DISTRIBUTION = HASH(id),
    PARTITION ( orderCount RANGE LEFT
    FOR VALUES (1, 5, 10, 25, 50, 100 ))) ;

Następujące polecenie tworzy nową partycję powiązaną z wartością 75 z zakresu od 50 do 100.

ALTER TABLE Customer SPLIT RANGE (75);

Nowy DDL dla tabeli to:

CREATE TABLE Customer (
   id INT NOT NULL,
   lastName VARCHAR(20),
   orderCount INT,
   orderDate DATE)
   WITH DISTRIBUTION = HASH(id),
   PARTITION ( orderCount (RANGE LEFT
      FOR VALUES (1, 5, 10, 25, 50, 75, 100))) ;

F. Przenoszenie partycji do tabeli historii za pomocą funkcji SWITCH

Poniższy przykład przenosi dane w partycji tabeli Orders do partycji w tabeli OrdersHistory.

Tabela Orders ma następujący kod DDL:

CREATE TABLE Orders (
    id INT,
    city VARCHAR (25),
    lastUpdateDate DATE,
    orderDate DATE)
WITH
    (DISTRIBUTION = HASH (id),
    PARTITION ( orderDate RANGE RIGHT
    FOR VALUES ('2004-01-01', '2005-01-01', '2006-01-01', '2007-01-01'))) ;

W tym przykładzie tabela Orders ma następujące partycje. Każda partycja zawiera dane.

Partycja Czy dane są? Zakres granic
1 Tak OrderDate < "2004-01-01"
2 Tak "2004-01-01" <= OrderDate < "2005-01-01"
3 Tak "2005-01-01" <= OrderDate< "2006-01-01"
4 Tak "2006-01-01"<= OrderDate < "2007-01-01"
5 Tak "2007-01-01" <= OrderDate
  • Partycja 1 (zawiera dane): OrderDate < "2004-01-01"
  • Partycja 2 (zawiera dane): "2004-01-01" <= OrderDate < "2005-01-01"
  • Partycja 3 (zawiera dane): "2005-01-01" <= OrderDate< "2006-01-01"
  • Partycja 4 (zawiera dane): "2006-01-01"<= OrderDate < "2007-01-01"
  • Partycja 5 (zawiera dane): "2007-01-01" <= OrderDate

Tabela OrdersHistory zawiera następującą tabelę DDL, która zawiera identyczne kolumny i nazwy kolumn jako tabelę Orders. Oba są rozproszone skrótami w kolumnie id.

CREATE TABLE OrdersHistory (
   id INT,
   city VARCHAR (25),
   lastUpdateDate DATE,
   orderDate DATE)
WITH
    (DISTRIBUTION = HASH (id),
    PARTITION ( orderDate RANGE RIGHT
    FOR VALUES ('2004-01-01'))) ;

Chociaż nazwy kolumn i kolumn muszą być takie same, granice partycji nie muszą być takie same. W tym przykładzie tabela OrdersHistory ma następujące dwie partycje, a obie partycje są puste:

  • Partycja 1 (brak danych): Data zamówienia < "2004-01-01"
  • Partycja 2 (pusta): "2004-01-01" <= OrderDate

W przypadku poprzednich dwóch tabel następujące polecenie przenosi wszystkie wiersze z OrderDate < '2004-01-01' z tabeli Orders do tabeli OrdersHistory.

ALTER TABLE Orders SWITCH PARTITION 1 TO OrdersHistory PARTITION 1;

W związku z tym pierwsza partycja w Orders jest pusta, a pierwsza partycja w OrdersHistory zawiera dane. Tabele są teraz wyświetlane w następujący sposób:

tabela Orders

  • Partycja 1 (pusta): orderDate < "2004-01-01"
  • Partycja 2 (zawiera dane): "2004-01-01" <= OrderDate < "2005-01-01"
  • Partycja 3 (zawiera dane): "2005-01-01" <= OrderDate< "2006-01-01"
  • Partycja 4 (zawiera dane): "2006-01-01"<= OrderDate < "2007-01-01"
  • Partycja 5 (zawiera dane): "2007-01-01" <= OrderDate

tabela OrdersHistory

  • Partycja 1 (zawiera dane): OrderDate < "2004-01-01"
  • Partycja 2 (pusta): "2004-01-01" <= OrderDate

Aby wyczyścić tabelę Orders, możesz usunąć pustą partycję, scalając partycje 1 i 2 w następujący sposób:

ALTER TABLE Orders MERGE RANGE ('2004-01-01');

Po scaleniu tabela Orders ma następujące partycje:

tabela Orders

  • Partycja 1 (zawiera dane): Data zamówienia < "2005-01-01"
  • Partycja 2 (zawiera dane): "2005-01-01" <= OrderDate< "2006-01-01"
  • Partycja 3 (zawiera dane): "2006-01-01"<= OrderDate < "2007-01-01"
  • Partycja 4 (zawiera dane): "2007-01-01" <= OrderDate

Załóżmy, że kolejny rok przechodzi i możesz zarchiwizować rok 2005. Pustą partycję można przydzielić dla roku 2005 w tabeli OrdersHistory, dzieląc pustą partycję w następujący sposób:

ALTER TABLE OrdersHistory SPLIT RANGE ('2005-01-01');

Po podzieleniu tabela OrdersHistory ma następujące partycje:

tabela OrdersHistory

  • Partycja 1 (zawiera dane): OrderDate < "2004-01-01"
  • Partycja 2 (pusta): "2004-01-01" < "2005-01-01"
  • Partycja 3 (pusta): "2005-01-01" <= OrderDate