ALTER TABLE (Transact-SQL)

Applies to:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Warehouse v Microsoft FabricSQL v databázi Microsoft Fabric

Upraví definici tabulky změnou, přidáním nebo vyřazením sloupců a omezení. ALTER TABLE také znovu přiřazuje a znovu sestavuje oddíly nebo zakazuje a povoluje omezení a triggery.

Návod

Syntaxe ALTER TABLE se liší v různých verzích Microsoft SQL Database Engine. Pomocí rozevíracího seznamu selektoru verzí zvolte příslušnou verzi produktu.

Syntaxe pro ALTER TABLE tabulky založené na disku a tabulky optimalizované pro paměť se liší. Pomocí následujících odkazů přejdete přímo na příslušný blok syntaxe pro vaše typy tabulek a na odpovídající příklady syntaxe:

Diskové tabulky:

Tabulky optimalizované pro paměť:

Další informace o konvencích syntaxe najdete v tématu Transact-SQL konvence syntaxe.

Syntaxe pro diskové tabulky

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

Další informace najdete tady:

Syntaxe pro tabulky optimalizované pro paměť

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

Syntaxe pro Azure Synapse Analytics a paralelní 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 }
}

Note

Bezserverový fond SQL v Azure Synapse Analytics podporuje pouze tabulky external a temporary.

Syntaxe pro sklad v 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 { COLUMN column_name | [CONSTRAINT] constraint_name } [ ,...n ]
}
[ ; ]

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

<data type> ::= type_name [ ( precision [ , scale ] ) ]

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

Arguments

název databáze

Název databáze, ve které jste vytvořili tabulku.

schema_name

Název schématu, do kterého tabulka patří.

název_tabulky

Název tabulky, která se má změnit. Pokud tabulka není v aktuální databázi nebo pokud schéma tabulky nepatří aktuálnímu uživateli, musíte explicitně zadat databázi a schéma.

ALTERŮV SLOUP

Určuje pojmenovaný sloupec, který chcete změnit.

Upravený sloupec nemůže být následující:

  • Sloupec s časovým razítkem datový typ.

  • Tabulka ROWGUIDCOL .

  • Počítaný sloupec nebo použitý ve vypočítaném sloupci.

  • Používá se ve statistikách vygenerovaných příkazem CREATE STATISTICS . Pokud chcete tyto statistiky odstranit, spusťte DROP STATISTICS před ALTER COLUMN úspěchem. Spuštěním tohoto dotazu získejte všechny sloupce statistiky a statistiky vytvořené uživatelem pro tabulku.

    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>');
    
  • Používá se v PRIMARY KEY omezení.[FOREIGN KEY] REFERENCES

  • Používá se v CHECK omezení.UNIQUE Můžete ale změnit délku sloupce s proměnnou délkou použitou CHECKUNIQUE v omezení nebo omezení.

  • Přidruženo k výchozí definici. Pokud ale datový typ nezměníte, můžete změnit délku, přesnost nebo měřítko sloupce.

ALTER COLUMN zahodí statistiky, které optimalizátor dotazů automaticky vygeneruje.

Datový typ textu, ntextu a sloupců obrázků můžete změnit pouze následujícími způsoby:

  • textové na varchar(max), nvarchar(max)nebo xml
  • ntextvarchar(max), nvarchar(max)nebo xml
  • varbinary(max)

Některé změny datového typu můžou způsobit změnu dat. Změna sloupce nchar nebo nvarchar na znak nebo varchar může například způsobit převod rozšířených znaků. Další informace najdete v tématu CAST a CONVERT (Transact-SQL).

  • Snížení přesnosti nebo měřítka sloupce může způsobit zkrácení dat.
  • Datový typ sloupce v dělené tabulce nemůžete změnit.
  • Datový typ sloupců zahrnutých v indexu nelze změnit, pokud sloupec není varchar, nvarchar nebo varbinární datový typ a nová velikost se rovná nebo je větší než stará velikost.
  • Sloupec, který je součástí omezení primárního klíče, nelze změnit z NOT NULL omezení na NULL.

Pokud použijete funkci Always Encrypted (bez zabezpečených enkláv), změníte-li sloupec šifrovaný pomocí ENCRYPTED WITH, můžete datový typ změnit na kompatibilní datový typ (například int na bigint), ale nemůžete změnit žádné nastavení šifrování.

Pokud používáte funkci Always Encrypted se zabezpečenými enklávami, můžete změnit nastavení šifrování, pokud šifrovací klíč sloupce chrání sloupec (a nový šifrovací klíč sloupce, pokud měníte klíč) podporuje výpočty enklávy (šifrované pomocí klíčů sloupců master s podporou enklávy). Podrobnosti najdete v tématu Always Encrypted se zabezpečenými enklávy.

Když upravíte sloupec, Database Engine sleduje každou změnu přidáním řádku v systémové tabulce a označením předchozí úpravy sloupce jako vyřazeného sloupce. Ve výjimečných případech, kdy upravujete sloupec příliš mnohokrát, může Database Engine dosáhnout limitu velikosti záznamu. Pokud k tomu dojde, zobrazí se chyba MSSQLSERVER_511 nebo 1708. Abyste se těmto chybám vyhnuli, znovu sestavte clusterovaný index v tabulce pravidelně nebo snižte počet úprav sloupců.

název sloupce

Název sloupce, který chcete změnit, přidat nebo odstranit. Maximální column_name je 128 znaků.

U nových sloupců můžete vynechat column_name pro sloupce vytvořené pomocí časového razítka datového typu. Název časové razítko se použije, pokud nezadáte column_name pro sloupec časové razítko datového typu.

Note

Nové sloupce se přidají po změně všech existujících sloupců v tabulce.

[ type_schema_name. ] type_name

Nový datový typ pro změněný sloupec nebo datový typ přidaného sloupce. Nemůžete zadat type_name pro existující sloupce dělených tabulek. type_name může být některý z následujících typů:

  • Datový typ systému SQL Server.
  • Datový typ aliasu založený na SQL Server systémovém datovém typu. Datové typy aliasů CREATE TYPE vytvoříte příkazem před jejich použitím v definici tabulky.
  • Uživatelem definovaný typ .NET Framework a schéma, do kterého patří. Před použitím definice tabulky vytvoříte uživatelem definované typy s CREATE TYPE příkazem.

Pro type_name změněného sloupce platí následující kritéria:

  • Předchozí datový typ se musí implicitně převést na nový datový typ.
  • type_name nemůže být časové razítko.
  • ANSI_NULL výchozí hodnoty jsou vždy zapnuté ALTER COLUMN. Pokud není zadaný, sloupec má hodnotu null.
  • ANSI_PADDING odsazení je vždy ON pro ALTER COLUMN.
  • Pokud je upraveným sloupcem sloupec identity, new_data_type musí být datový typ, který podporuje vlastnost identity.
  • Aktuální nastavení SET ARITHABORT je ignorováno. ALTER TABLE funguje tak, jako by ARITHABORT byla nastavena na ONhodnotu .

Note

Pokud klauzuli COLLATE nezadáte, změna datového typu sloupce způsobí změnu kolace na výchozí kolaci databáze.

přesnost

Přesnost zadaného datového typu. Další informace o platných hodnotách přesnosti najdete v tématu Precision, scale a length (Transact-SQL).

škálování

Měřítko pro zadaný datový typ. Další informace o platných hodnotách škálování najdete v tématu Precision, scale a length (Transact-SQL).

max

Platí pouze pro varchar, nvarchara varbinární datové typy pro ukládání 2^31-1 bajtů znaků, binárních dat a dat Unicode.

xml_schema_collection

Applies to: SQL Server a Azure SQL Database.

Platí pouze pro xml datový typ pro přidružení schématu XML k typu. Před zadáním sloupce xml do kolekce schémat nejprve vytvoříte kolekci schématu v databázi pomocí CREATE XML SCHEMA COLLECTION (Transact-SQL).

< COLLATION_NAME> COLLATE

Určuje novou kolaci pro změněný sloupec. Pokud neurčíte kolaci, sloupci se přiřadí výchozí kolace databáze. Název kolace může být buď Windows název kolace, nebo název kolace SQL. Další informace najdete v tématu Windows název kolace (Transact-SQL) a SQL Server Název kolace (Transact-SQL).

Klauzule COLLATE změní kolace pouze sloupců datových typů char, varchar, nchar a nvarchar . Ke změně kolace sloupce datového typu aliasu definovaného uživatelem použijte samostatné příkazy ALTER TABLE a změňte sloupec na SQL Server systémový datový typ. Potom změňte kolaci a změňte sloupec zpět na datový typ aliasu.

ALTER COLUMN nemůže mít změnu kolace, pokud existuje jedna nebo více následujících podmínek:

  • Změněný CHECK sloupec odkazuje na omezení, FOREIGN KEY omezení nebo počítané sloupce.
  • Ve sloupci se vytvoří libovolný index, statistika nebo fulltextový index. Pokud se změní kolace sloupce, statistika vytvořená automaticky u sloupce se zahodí.
  • Zobrazení vázané na schéma nebo funkce odkazuje na sloupec.

Další informace o podporovaných kolacích najdete v tématu COLLATE (Transact-SQL).

NULL | NE NULL

Určuje, jestli sloupec může přijímat hodnoty null. Sloupce, které nepovolují hodnoty null, můžete přidat pouze v ALTER TABLE případě, že mají zadanou výchozí hodnotu nebo pokud je tabulka prázdná. Pro počítané sloupce můžete zadat NOT NULL pouze v případě, že zadáte PERSISTEDtaké . Pokud nový sloupec umožňuje hodnoty null a nezadáte výchozí hodnotu, nový sloupec obsahuje hodnotu null pro každý řádek v tabulce. Pokud nový sloupec umožňuje hodnoty null a přidáte výchozí definici s novým sloupcem, můžete použít WITH VALUES k uložení výchozí hodnoty do nového sloupce pro každý existující řádek v tabulce.

Pokud nový sloupec nepovoluje hodnoty null a tabulka není prázdná, musíte do nového sloupce přidat DEFAULT definici. Nový sloupec se automaticky načte s výchozí hodnotou v nových sloupcích v každém existujícím řádku.

NULL ALTER COLUMN Pokud chcete vynutit, NOT NULL aby sloupec povolil hodnoty null, s výjimkou sloupců v PRIMARY KEY omezeních. Můžete zadat NOT NULLALTER COLUMN pouze v případě, že sloupec neobsahuje žádné hodnoty null. Před povolením je nutné aktualizovat hodnoty null na určitou hodnotu ALTER COLUMNNOT NULL , například:

UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL;

ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR (20) NOT NULL;

Při vytváření nebo změně tabulky pomocí CREATE TABLE příkazů nebo ALTER TABLE příkazů může nastavení databáze a relace ovlivnit a případně potlačit hodnotu null datového typu, který zadáte v definici sloupce. Vždy explicitně definujte sloupec jako NULL nebo NOT NULL pro nekomprimované sloupce.

Pokud přidáte sloupec s uživatelem definovaným datovým typem, nezapomeňte definovat sloupec se stejnou hodnotou null jako uživatelem definovaný datový typ. A zadejte výchozí hodnotu sloupce. Další informace najdete v tématu CREATE TABLE (Transact-SQL).

Note

Pokud zadáte NULL nebo NOT NULL zadáte ALTER COLUMN, musíte také zadat new_data_type [(přesnost [; měřítko ])]. Pokud se datový typ, přesnost a měřítko nemění, zadejte hodnoty aktuálního sloupce.

[ {PŘIDAT | DROP} ROWGUIDCOL ]

Applies to: SQL Server a Azure SQL Database.

Určuje, že ROWGUIDCOL vlastnost je přidána nebo vyřazena ze zadaného sloupce. ROWGUIDCOL označuje, že sloupec je sloupec guid řádku. Jako sloupec můžete nastavit pouze jeden sloupec uniqueidentifier pro tabulku ROWGUIDCOL . Vlastnost můžete přiřadit ROWGUIDCOL pouze ke sloupci uniqueidentifier . Nemůžete přiřadit ROWGUIDCOL sloupec uživatelem definovaného datového typu.

ROWGUIDCOL nevynucuje jedinečnost hodnot uložených ve sloupci a negeneruje automaticky hodnoty pro nové řádky vložené do tabulky. K vygenerování jedinečných hodnot pro každý sloupec použijte funkci NEWID() nebo NEWSEQUENTIALID() v příkazech INSERT. Můžete také zadat funkci NEWID() nebo NEWSEQUENTIALID() jako výchozí pro sloupec.

[ {ADD | DROP} TRVALÉ ]

Určuje, že PERSISTED vlastnost je přidána nebo vyřazena ze zadaného sloupce. Sloupec musí být počítaný sloupec definovaný deterministickým výrazem. U sloupců zadaných jako PERSISTED se Database Engine fyzicky ukládají vypočítané hodnoty v tabulce a aktualizují hodnoty, pokud se aktualizují všechny ostatní sloupce, na kterých je vypočítaný sloupec závislý. Když označíte počítaný sloupec jako PERSISTED, můžete vytvořit indexy na počítaných sloupcích definovaných ve výrazech, které jsou deterministické, ale nejsou přesné. Další informace najdete v tématu Indexy ve vypočítaných sloupcích.

SET QUOTED_IDENTIFIER musí být ON , když vytváříte nebo měníte indexy ve vypočítaných sloupcích nebo indexovaných zobrazeních. Další informace najdete v tématu SET QUOTED_IDENTIFIER (Transact-SQL).

Každý počítaný sloupec, který se používá jako sloupec dělení v dělené tabulce, musí být explicitně označen PERSISTED.

Note

Ve Fabric databázi SQL jsou počítané sloupce povolené, ale v současné době se zrcadlí na Fabric OneLake.

DROP NOT FOR REPLICATION

Applies to: SQL Server a Azure SQL Database.

Určuje, že hodnoty se při provádění operací vložení agentů replikace zvýší ve sloupcích identit. Tuto klauzuli můžete zadat pouze v případě, že column_name je sloupec identity.

SPARSE

Označuje, že sloupec je řídký sloupec. Úložiště řídkých sloupců je optimalizované pro hodnoty null. Řídké sloupce nemůžete nastavit jako NOT NULL. Při převodu sloupce z řídké na nesparse nebo z nesparse na řídkou, tato možnost uzamkne tabulku po dobu trvání provádění příkazu. Možná budete muset klauzuli REBUILD použít k uvolnění jakýchkoli úspor místa. Další omezení a další informace o řídkých sloupcích najdete v tématu Použití řídkých sloupců.

PŘIDEJ MASKOVANÉ ( FUNKCE = 'mask_function')

Applies to: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.

Určuje dynamickou masku dat. mask_function je název funkce maskování s příslušnými parametry. K dispozici jsou tři funkce:

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

Vyžaduje ALTER ANY MASK oprávnění.

Pokud chcete masku odstranit, použijte DROP MASKED. Parametry funkce najdete v tématu Dynamické maskování dat.

Přidání a odstranění masky vyžaduje ALTER ANY MASK oprávnění.

WITH ( ONLINE = ON | OFF) <, jak platí pro změnu> sloupce

Applies to: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.

Umožňuje provádět mnoho akcí alter column, zatímco tabulka zůstává k dispozici. Výchozí hodnota je OFF. U změn sloupce souvisejících s datovým typem, délkou nebo přesností, nulovostí, řídkými a kolací můžete spustit online změny sloupce.

Online ALTER COLUMN umožňuje uživatelům vytvořeným a automatickým statistikám odkazovat na změněný sloupec po dobu trvání ALTER COLUMN operace, což umožňuje, aby dotazy běžely obvyklým způsobem. Na konci operace se zahodí automatické statistiky, které odkazují na sloupec, a statistiky vytvořené uživatelem se zneplatní. Uživatel musí po dokončení operace ručně aktualizovat statistiky generované uživatelem. Pokud je sloupec součástí výrazu filtru pro jakékoli statistiky nebo indexy, nemůžete operaci provést ALTER COLUMN .

  • Během online ALTER COLUMN operace je zablokovaná jakákoli operace DDL, která by mohla záviset na daném sloupci (například vytváření nebo úpravách indexů nebo zobrazení), nebo selže s příslušnou chybou. Toto chování zaručuje, že online ALTER COLUMN selžou kvůli závislostem zavedeným při spuštění operace.

  • Změna sloupce z NOT NULL na NULL není podporována jako online operace, pokud se na změněný sloupec odkazuje neclusterované indexy.

  • Online ALTER se nepodporuje, pokud se na sloupec odkazuje omezením kontroly a ALTER operace omezuje přesnost sloupce (číselná hodnota nebo datum a čas).

  • Tuto WAIT_AT_LOW_PRIORITY možnost nelze použít s online ALTER COLUMN.

  • ALTER COLUMN ... ADD/DROP PERSISTED není podporováno pro online ALTER COLUMN.

  • ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION není ovlivněna online ALTER COLUMN.

  • Online ALTER COLUMN nepodporuje změnu tabulky, kde je povolené sledování změn nebo je to vydavatel slučovací replikace.

  • Online ALTER COLUMN nepodporuje změny datových typů CLR ani na datové typy CLR.

  • Online ALTER COLUMN nepodporuje změnu datového typu XML, který má jinou kolekci schématu než aktuální kolekce schématu.

  • Online ALTER COLUMN nesnižuje omezení, kdy je možné sloupec změnit. Odkazy podle indexu, statistik atd. můžou způsobit selhání změny.

  • Online ALTER COLUMN nepodporuje souběžné změny více než jednoho sloupce.

  • Online ALTER COLUMN nemá žádný vliv na dočasnou tabulku se systémovou verzí. ALTER sloupec se nespustí jako online bez ohledu na to, kterou hodnotu jste zadali pro ONLINE možnost.

Online ALTER COLUMN má podobné požadavky, omezení a funkce jako opětovné sestavení online indexu, mezi které patří:

  • Opětovné sestavení online indexu není podporováno, pokud tabulka obsahuje starší sloupce LOB nebo filestream nebo pokud tabulka obsahuje index columnstore. Stejná omezení platí pro online ALTER COLUMN.
  • Upravený sloupec vyžaduje dvojnásobek přidělení místa pro původní sloupec a nově vytvořený skrytý sloupec.
  • Strategie uzamčení během online operace alter column se řídí stejným vzorem uzamčení, který se používá pro sestavení online indexu.

WITH CHECK | S KONTROLOU NOCHECK

Určuje, jestli se data v tabulce neověřují proti nově přidanému nebo opětovnému povolení FOREIGN KEY nebo CHECK omezení. Pokud ho nezadáte, WITH CHECK předpokládá se pro nová omezení a WITH NOCHECK předpokládá se u znovu povolených omezení.

Pokud nechcete ověřovat nová CHECK nebo FOREIGN KEY omezení pro existující data, použijte WITH NOCHECK. Obvykle se to nikdy nedoporučuje, ale v některých případech se to může vyžadovat. Nové omezení se vyhodnotí ve všech pozdějších aktualizacích dat. Všechna porušení omezení potlačovaná WITH NOCHECK při přidání omezení můžou způsobit selhání budoucích aktualizací, pokud aktualizují řádky dat, která nedodržují omezení. Optimalizátor dotazů nebere v úvahu omezení, která jsou definována WITH NOCHECK. Tato omezení se ignorují, dokud nebudou povolena pomocí ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL. Další informace naleznete v tématu Zakázání omezení cizího klíče s příkazy INSERT a UPDATE.

ALTER INDEX index_name

Určuje, že se má změnit nebo změnit počet kbelíků pro index_name.

Syntaxe ALTER TABLE ... ADD/DROP/ALTER INDEX je podporována pouze pro tabulky optimalizované pro paměť.

Important

Bez použití příkazu ALTER TABLE příkazy CREATE INDEX (Transact-SQL), DROP INDEX (Transact-SQL), ALTER INDEX (Transact-SQL) a ALTER TABLE index_option (Transact-SQL) nejsou u indexů podporované. tabulky optimalizované pro paměť.

ADD

Určuje, že se přidají definice jednoho nebo více sloupců, definice počítaného sloupce nebo omezení tabulky. Nebo se přidají sloupce, které systém používá pro správu verzí systému. Pro tabulky optimalizované pro paměť můžete přidat index.

Note

Nové sloupce se přidají po změně všech existujících sloupců v tabulce.

Important

Bez použití příkazu ALTER TABLE příkazy CREATE INDEX (Transact-SQL), DROP INDEX (Transact-SQL), ALTER INDEX (Transact-SQL) a ALTER TABLE index_option (Transact-SQL) nejsou u indexů podporované. tabulky optimalizované pro paměť.

OBDOBÍ PRO SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )

Applies to: SQL Server 2017 (14.x) a novější verze a Azure SQL Database.

Určuje názvy sloupců, které systém používá k zaznamenání časového období, pro které je záznam platný. Jako součást argumentu ADD PERIOD FOR SYSTEM_TIME můžete zadat existující sloupce nebo vytvořit nové sloupce. Nastavte sloupce s datovým typem datetime2 a definujte je jako NOT NULL. Pokud definujete sloupec tečky jako NULL, zobrazí se chybové výsledky. Můžete definovat column_constraint nebo Zadat výchozí hodnoty pro sloupce system_start_time a system_end_time. Podívejte se na příklad A v následujících system versioning příklady, které ukazují použití výchozí hodnoty pro sloupec system_end_time.

Tento argument s argumentem SET SYSTEM_VERSIONING použijte k vytvoření existující tabulky jako dočasné tabulky. Další informace naleznete v části Dočasné tabulky a Začínáme s dočasnými tabulkami.

Od SQL Server 2017 (14.x) můžou uživatelé označit jeden nebo oba sloupce období pomocí příznaku HIDDEN, aby tyto sloupce implicitně skrývaly tak, aby SELECT * FROM <table_name> nevrátil hodnotu sloupců. Ve výchozím nastavení nejsou sloupce období skryté. Aby bylo možné je použít, musí být skryté sloupce explicitně zahrnuty do všech dotazů, které přímo odkazují na dočasnou tabulku.

DROP

Určuje, že dojde k vyřazení jedné nebo více definic sloupců, definic počítaného sloupce nebo omezení tabulky nebo k vyřazení specifikace sloupců, které systém používá pro správu verzí systému.

Note

Sloupce vynechané v tabulkách registru jsou odstraněny pouze obnovitelné odstranění. Vyřazený sloupec zůstane v tabulce registru, ale je označený jako vyřazený sloupec nastavením dropped_ledger_table sloupce na sys.tables1hodnotu . Zobrazení registru zahozené tabulky registru je také označeno jako vyřazené nastavením sloupce dropped_ledger_view v sys.tables na 1. Vyřazená tabulka registru, její tabulka historie a její zobrazení registru se přejmenují přidáním předpony (MSSQL_DroppedLedgerTable, MSSQL_DroppedLedgerHistory, MSSQL_DroppedLedgerView) a připojením identifikátoru GUID k původnímu názvu.

CONSTRAINT_NAME CONSTRAINT

Určuje, že constraint_name se z tabulky odebere. Můžete uvést několik omezení.

Uživatelem definovaný nebo systémový název omezení můžete určit dotazováním zobrazení katalogu sys.check_constraint, sys.default_constraints, sys.key_constraintsa sys.foreign_keys katalogu.

PRIMARY KEY Omezení nelze vynechat, pokud v tabulce existuje index XML.

INDEX index_name

Určuje, že index_name se z tabulky odeberou.

Syntaxe ALTER TABLE ... ADD/DROP/ALTER INDEX je podporována pouze pro tabulky optimalizované pro paměť.

Important

Bez použití příkazu ALTER TABLE příkazy CREATE INDEX (Transact-SQL), DROP INDEX (Transact-SQL), ALTER INDEX (Transact-SQL) a ALTER TABLE index_option (Transact-SQL) nejsou u indexů podporované. tabulky optimalizované pro paměť.

COLUMN_NAME SLOUPCE

Určuje, že constraint_name nebo column_name se z tabulky odeberou. Můžete uvést více sloupců.

Sloupec nejde vyhodit, když je:

  • Používá se v indexu, ať už jako klíčový sloupec, nebo jako INCLUDE
  • Používá se v sadě CHECK, FOREIGN KEY, UNIQUEnebo PRIMARY KEY omezení.
  • Přidruženo k výchozímu nastavení definovanému klíčovým slovem DEFAULT nebo vázanému na výchozí objekt.
  • Svázané s pravidlem

Note

Vyřazení sloupce neodebere místo na disku sloupce. Pokud se velikost řádku tabulky blíží nebo překročila, bude pravděpodobně nutné uvolnit místo na disku vyřazeného sloupce. Uvolněte místo vytvořením clusterovaného indexu v tabulce nebo opětovným sestavením existujícího clusterovaného indexu pomocí ALTER INDEX (Transact-SQL). Informace o dopadu vyřazení datových typů LOB naleznete v tomto blogový záznam CSS.

OBDOBÍ PRO SYSTEM_TIME

Applies to: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.

Zahodí specifikaci sloupců, které systém používá pro správu verzí systému.

S <drop_clustered_constraint_option>

Určuje, že jsou nastaveny jednu nebo více možností omezení s vyřazeným clusterem.

MAXDOP = max_degree_of_parallelism

Applies to: SQL Server a Azure SQL Database.

Přepíše maximální stupeň paralelismu možnost konfigurace pouze po dobu trvání operace. Další informace naleznete v tématu Konfigurace serveru: maximální stupeň paralelismu.

MAXDOP Pomocí možnosti omezte počet procesorů používaných při paralelním provádění plánu. Maximum je 64 procesorů.

max_degree_of_parallelism může být jedna z následujících hodnot:

  • 1

    Potlačí generování paralelního plánu.

  • >1

    Omezí maximální počet procesorů použitých v paralelní operaci indexu na zadané číslo.

  • 0 (výchozí)

    Používá skutečný počet procesorů nebo méně na základě aktuální systémové úlohy.

Další informace najdete v tématu Konfigurace paralelních operací indexu.

Note

Paralelní operace indexu nejsou k dispozici v každé edici SQL Server. Další informace najdete v tématu Editions a podporované funkce SQL Server 2022.

ONLINE = { ON | OFF } <, jak se vztahuje na drop_clustered_constraint_option>

Určuje, jestli jsou podkladové tabulky a přidružené indexy dostupné pro dotazy a úpravy dat během operace indexu. Výchozí hodnota je OFF. Můžete spustit REBUILD jako ONLINE operaci.

  • ON

    Dlouhodobé zámky tabulek se neudržují po dobu trvání operace indexu. Během hlavní fáze operace indexu se ve zdrojové tabulce uchovává pouze zámek Sdílení záměru (IS). Toto chování umožňuje pokračovat v dotazech nebo aktualizacích podkladové tabulky a indexů. Na začátku operace se na zdrojovém objektu po krátkou dobu uchovává zámek Shared (S). Na konci operace se po krátkou dobu získá zámek S (Shared), pokud se vytváří neclusterovaný index. Nebo se zámek Sch-M (úprava schématu) získá při vytvoření nebo vyřazení clusterovaného indexu online a při vytvoření clusterovaného nebo neclusterovaného indexu. ONLINE Nelze nastavit, když ON se index vytváří v místní dočasné tabulce. Je povolena pouze operace opětovného sestavení haldy s jedním vláknem.

    Chcete-li spustit DDL pro SWITCH opětovné sestavení indexu nebo online index, musí být dokončeny všechny aktivní blokující transakce spuštěné v konkrétní tabulce. Při provádění operace opětovného SWITCH sestavení zabrání spuštění nových transakcí a může výrazně ovlivnit propustnost úloh a dočasně zpozdit přístup k podkladové tabulce.

  • OFF

    Zámky tabulek platí pro dobu trvání operace indexu. Operace offline indexu, která vytvoří, znovu sestaví nebo zahodí clusterovaný index nebo znovu sestaví nebo zamkne neclusterovaný index, získá v tabulce zámek schématu (Sch-M). Tento zámek brání všem uživatelům v přístupu k podkladové tabulce po dobu trvání operace. Operace offline indexu, která vytvoří neclusterovaný index, získá v tabulce zámek Shared (S). Tento zámek zabraňuje aktualizacím podkladové tabulky, ale umožňuje operace čtení, jako SELECT jsou příkazy. Operace opětovného sestavení haldy s více vlákny jsou povolené.

    Další informace naleznete v tématu Jak fungují online operace indexu.

    Note

    Online indexovací operace nejsou k dispozici v každé edici SQL Server. Další informace najdete v tématu Editions a podporované funkce SQL Server 2022.

PŘESUNOUT NA { partition_scheme_name(column_name [ ,...n ] ) | skupiny souborů | "default" }

Applies to: SQL Server a Azure SQL Database.

Určuje umístění pro přesunutí datových řádků aktuálně na úrovni listu clusterovaného indexu. Tabulka se přesune do nového umístění. Tato možnost se vztahuje pouze na omezení, která vytvářejí clusterovaný index.

Note

V tomto kontextu default není klíčové slovo. Jedná se o identifikátor výchozí skupiny souborů, který musí být oddělený jako in MOVE TO "default" nebo MOVE TO [default]. Pokud "default" je tato možnost zadaná, QUOTED_IDENTIFIER musí být ON pro aktuální relaci. Toto je výchozí nastavení. Další informace najdete v tématu SET QUOTED_IDENTIFIER (Transact-SQL).

{ CHECK | NOCHECK } OMEZENÍ

Určuje, že constraint_name je povolená nebo zakázaná. Tuto možnost lze použít pouze s omezeními FOREIGN KEYCHECK . Po NOCHECK zadání se omezení zakáže a budoucí vložení nebo aktualizace sloupce nebudou ověřeny proti podmínkám omezení. DEFAULT, PRIMARY KEYa UNIQUE omezení nelze zakázat.

  • ALL

    Určuje, že všechna omezení jsou zakázána s NOCHECK možností nebo povolenou CHECK možností.

{ ENABLE | ZAKÁZAT } TRIGGER

Určuje, že trigger_name je povolená nebo zakázaná. Když je trigger zakázaný, je stále definovaný pro tabulku. Pokud INSERTse však příkazy UPDATEnebo DELETE příkazy spustí v tabulce, akce v triggeru se neprovedou, dokud se aktivační událost znovu nepovolí.

  • ALL

    Určuje, že všechny triggery v tabulce jsou povolené nebo zakázané.

  • trigger_name

    Určuje název triggeru, který se má zakázat nebo povolit.

{ ENABLE | VYPNOUT } CHANGE_TRACKING

Applies to: SQL Server a Azure SQL Database.

Určuje, jestli je pro tabulku povoleno sledování změn. Ve výchozím nastavení je sledování změn zakázané.

Tato možnost je dostupná jenom v případě, že je pro databázi povolené sledování změn. Další informace najdete v tématu MOŽNOSTI SADY DATABÁZÍALTER (Transact-SQL).

Pokud chcete povolit sledování změn, musí mít tabulka primární klíč.

S ( TRACK_COLUMNS_UPDATED = { ON | VYPNUTO } )

Applies to: SQL Server a Azure SQL Database.

Určuje, zda byly aktualizovány Database Engine stopy, které změnily sledované sloupce. Výchozí hodnota je OFF.

PŘEPNOUT [ PARTITION source_partition_number_expression ] NA [ schema_name. ] target_table [ ODDÍL target_partition_number_expression ]

Applies to: SQL Server a Azure SQL Database.

Přepne blok dat jedním z následujících způsobů:

  • Znovu přiřazuje všechna data tabulky jako oddíl k již existující dělené tabulce.
  • Přepne oddíl z jedné dělené tabulky do jiné.
  • Znovu přiřazuje všechna data v jednom oddílu dělené tabulky k existující nedělené tabulce.

Pokud tabulka je dělená tabulka, je nutné zadat source_partition_number_expression. Pokud je target_table rozdělený na oddíly, je nutné zadat target_partition_number_expression. Při opětovném přiřazení dat tabulky jako oddílu k již existující dělené tabulce nebo přepnutí oddílu z jedné dělené tabulky na jinou musí cílový oddíl existovat a musí být prázdný.

Při opětovném přiřazení dat jednoho oddílu pro vytvoření jedné tabulky musí cílová tabulka již existovat a musí být prázdná. Zdrojová tabulka nebo oddíl i cílová tabulka nebo oddíl musí být umístěné ve stejné skupině souborů. Odpovídající indexy nebo oddíly indexu musí být také umístěny ve stejné skupině souborů. Pro přepínání oddílů platí mnoho dalších omezení. tabulky a target_table nemůžou být stejné. target_table může být identifikátor s více částmi.

source_partition_number_expression i target_partition_number_expression jsou konstantní výrazy, které mohou odkazovat na proměnné a funkce. Patří mezi ně proměnné typu definované uživatelem a uživatelem definované funkce. Nemůžou odkazovat na výrazy Transact-SQL.

Dělená tabulka s clusterovaným indexem columnstore se chová jako dělená halda:

  • Primární klíč musí obsahovat klíč oddílu.
  • Jedinečný index musí obsahovat klíč oddílu. Zahrnutí klíče oddílu s existujícím jedinečným indexem ale může změnit jedinečnost.
  • Pokud chcete přepnout oddíly, musí všechny neclusterované indexy obsahovat klíč oddílu.

Omezení SWITCH při použití replikace najdete v tématu Replikace dělených tabulek a indexů.

Neclusterované indexy columnstore byly vytvořeny ve formátu jen pro čtení před SQL Server 2016 (13.x) a pro SQL Database před verzí V12. Před spuštěním jakékoli PARTITION operace je nutné znovu sestavit neclusterované indexy columnstore do aktuálního formátu (který je aktualizovatelný).

Limitations

Pokud jsou obě tabulky rozdělené stejně, včetně neclusterovaných indexů a cílová tabulka neobsahuje žádné neclusterované indexy, může se zobrazit chyba 4907.

Příklad výstupu:

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" })

Applies to: SQL Server. Azure SQL Database nepodporuje FILESTREAM.

Určuje, kde jsou uložena data FILESTREAM.

ALTER TABLE klauzule SET FILESTREAM_ON bude úspěšná pouze v případě, že tabulka neobsahuje žádné sloupce FILESTREAM. Sloupce FILESTREAM můžete přidat pomocí druhého ALTER TABLE příkazu.

Pokud zadáte partition_scheme_name, použijí se pravidla pro CREATE TABLE (Transact-SQL). Ujistěte se, že tabulka je již rozdělena pro data řádků a schéma oddílů používá stejnou funkci oddílu a sloupce jako schéma oddílů FILESTREAM.

filestream_filegroup_name určuje název skupiny souborů FILESTREAM. Skupina souborů musí mít jeden soubor definovaný pro skupinu souborů pomocí příkazu CREATE DATABASE nebo ALTER DATABASE (Transact-SQL) nebo se zobrazí chyba.

"default" určuje filegroup FILESTREAM se DEFAULT sadou vlastností. Pokud neexistuje žádná skupina souborů FILESTREAM, zobrazí se chyba.

"NULL" určuje, že všechny odkazy na filegroups filegroups pro tabulku jsou odebrány. Nejprve je nutné vynechat všechny sloupce FILESTREAM. Slouží SET FILESTREAM_ON = "NULL" k odstranění všech dat FILESTREAM přidružených k tabulce.

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

Applies to: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.

Buď zakáže nebo povolí správu systémových verzí tabulky. Aby bylo možné povolit systémovou správu verzí tabulky, systém ověří, že jsou splněny požadavky na datové typy, omezení nullability a omezení primárního klíče pro správu verzí systému. Systém zaznamenává historii každého záznamu v tabulce se systémovou verzí v samostatné tabulce historie. HISTORY_TABLE Pokud se argument nepoužívá, název této tabulky historie je MSSQL_TemporalHistoryFor<primary_table_object_id>. Pokud tabulka historie neexistuje, systém vygeneruje novou tabulku historie odpovídající schématu aktuální tabulky, vytvoří propojení mezi těmito dvěma tabulkami a umožní systému zaznamenávat historii každého záznamu v aktuální tabulce v tabulce historie. Pokud použijete argument HISTORY_TABLE k vytvoření propojení a použití existující tabulky historie, systém vytvoří propojení mezi aktuální tabulkou a zadanou tabulkou. Při vytváření odkazu na existující tabulku historie můžete provést kontrolu konzistence dat. Tato kontrola konzistence dat zajišťuje, že se existující záznamy nepřekrývají. Spuštění kontroly konzistence dat je výchozí. Pomocí argumentu SYSTEM_VERSIONING = ON v tabulce definované pomocí klauzule PERIOD FOR SYSTEM_TIME vytvořte existující tabulku jako dočasnou tabulku. Další informace naleznete v části Dočasné tabulky.

HISTORY_RETENTION_PERIOD = { INFINITE | číslo { DEN | DNY | TÝDEN | TÝDNY | MĚSÍC | MĚSÍCE | ROK | YEARS } }

Applies to: SQL Server 2017 (14.x) a Azure SQL Database.

Určuje konečné nebo nekonečné uchovávání historických dat v dočasné tabulce. Pokud je vynecháno, předpokládá se nekonečné uchovávání.

DATA_DELETION

Applies to: Azure SQL Edge only

Umožňuje vyčištění starých nebo starých dat z tabulek v databázi na základě zásad uchovávání informací. Další informace najdete v tématu Povolení a zakázáníuchovávání dat . Aby bylo možné povolit uchovávání dat, musí být zadány následující parametry.

  • FILTER_COLUMN = { column_name }

    Určuje sloupec, který se má použít k určení, jestli jsou řádky v tabulce zastaralé nebo ne. Pro sloupec filtru jsou povoleny následující datové typy.

    • date
    • datetime
    • datetime2
    • smalldatetime
    • datetimeoffset
  • RETENTION_PERIOD = { INFINITE | číslo { DEN | DNY | TÝDEN | TÝDNY | MĚSÍC | MĚSÍCE | ROK | YEARS } }

    Určuje zásady doby uchovávání informací pro tabulku. Doba uchovávání je určena jako kombinace kladné celočíselné hodnoty a jednotky části kalendářního data.

SET ( LOCK_ESCALATION = { AUTO | TABULKA | DISABLE } )

Applies to: SQL Server a Azure SQL Database.

Určuje povolené metody eskalace zámku pro tabulku.

  • AUTO

    Tato možnost umožňuje SQL Server Database Engine vybrat členitost eskalace zámku, která je vhodná pro schéma tabulky.

    • Pokud je tabulka rozdělená na oddíly, je eskalace zámku povolena na členitost haldy nebo B-tree (HoBT). Jinými slovy, eskalace je povolená na úrovni oddílu. Po eskalaci zámku na úroveň HoBT nebude zámek eskalován později na TABLE členitost.

    • Pokud tabulka není rozdělená na oddíly, eskalace zámku se provede s TABLE členitostí.

  • TABLE

    Eskalace zámku se provádí v členitosti na úrovni tabulky bez ohledu na to, jestli je tabulka rozdělená na oddíly, nebo ne. TABLE je výchozí hodnota.

  • DISABLE

    Ve většině případů zabraňuje eskalaci zámku. Zámky na úrovni tabulky nejsou zcela zakázány. Když například prohledáváte tabulku, která nemá žádný clusterovaný index pod úrovní serializovatelné izolace, Database Engine musí zamknout tabulku, aby byla zajištěna integrita dat.

REBUILD

REBUILD WITH Syntaxe slouží k opětovnému sestavení celé tabulky včetně všech oddílů v dělené tabulce. Pokud tabulka obsahuje clusterovaný index, REBUILD možnost znovu sestaví clusterovaný index. REBUILD lze spustit jako ONLINE operaci.

REBUILD PARTITION Syntaxe slouží k opětovnému sestavení jednoho oddílu v dělené tabulce.

PARTITION = VŠE

Applies to: SQL Server a Azure SQL Database.

Při změně nastavení komprese oddílů znovu sestaví všechny oddíly.

PŘESTAVBA S ( <rebuild_option> )

Všechny možnosti platí pro tabulku s clusterovaným indexem. Pokud tabulka nemá clusterovaný index, struktura haldy je ovlivněna pouze některými možnostmi.

Pokud se při operaci nezadá REBUILD konkrétní nastavení komprese, použije se aktuální nastavení komprese pro oddíl. Pokud chcete vrátit aktuální nastavení, zadejte dotaz na sloupec data_compression v zobrazení katalogu sys.partitions.

Úplný popis možností opětovného sestavení najdete v tématu ALTER TABLE index_option (Transact-SQL).

DATA_COMPRESSION

Applies to: SQL Server a Azure SQL Database.

Určuje možnost komprese dat pro zadanou tabulku, číslo oddílu nebo rozsah oddílů. Možnosti jsou následující:

  • NONE

    Tabulky nebo zadané oddíly nejsou komprimované. Tato možnost se nevztahuje na tabulky columnstore.

  • VESLOVAT

    Tabulky nebo zadané oddíly se komprimují pomocí komprese řádků. Tato možnost se nevztahuje na tabulky columnstore.

  • STRÁNKA

    Tabulky nebo zadané oddíly se komprimují pomocí komprese stránky. Tato možnost se nevztahuje na tabulky columnstore.

  • COLUMNSTORE

    Applies to: SQL Server 2014 (12.x) a novější verze a Azure SQL Database.

    Platí pouze pro tabulky columnstore. COLUMNSTORE určuje dekomprimaci oddílu, který byl komprimován s COLUMNSTORE_ARCHIVE možností. Po obnovení se data budou dál komprimovat pomocí komprese columnstore, která se používá pro všechny tabulky columnstore.

  • COLUMNSTORE_ARCHIVE

    Applies to: SQL Server 2014 (12.x) a novější verze a Azure SQL Database.

    Platí pouze pro tabulky columnstore, které jsou tabulky uložené s clusterovaným indexem columnstore. COLUMNSTORE_ARCHIVE dále zkomprimuje zadaný oddíl na menší velikost. Tuto možnost použijte pro archivaci nebo jiné situace, které vyžadují méně úložiště a mohou si dovolit více času pro ukládání a načítání.

    Pokud chcete znovu sestavit více oddílů najednou, přečtěte si index_option. Pokud tabulka nemá clusterovaný index, změna komprese dat znovu sestaví haldu a neclusterované indexy. Další informace o kompresi naleznete v tématu Komprese dat.

    ALTER TABLE REBUILD PARTITION WITH DATA COMPRESSION = ROW nebo PAGE není v databázi SQL v Microsoft Fabric povolená.

XML_COMPRESSION

Applies to: SQL Server 2022 (16.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance.

Určuje možnost komprese XML pro všechny xml sloupce datového typu v tabulce. Možnosti jsou následující:

  • ON

    Sloupce používající datový typ xml jsou komprimované.

  • OFF

    Sloupce používající xml datový typ nejsou komprimované.

ONLINE = { ON | OFF } <, jak platí pro single_partition_rebuild_option>

Určuje, jestli je během operace indexu k dispozici jeden oddíl podkladových tabulek a přidružených indexů pro dotazy a úpravy dat. Výchozí hodnota je OFF. Můžete spustit REBUILD jako ONLINE operaci.

  • ON

    Dlouhodobé zámky tabulek se neudržují po dobu trvání operace indexu. Na začátku opětovného sestavení indexu se vyžaduje zámek S-Lock v tabulce a Sch-M uzamčení tabulky na konci opětovného sestavení indexu online. I když oba zámky jsou krátké zámky metadat, Sch-M zámek musí čekat na dokončení všech blokujících transakcí. Během doby čekání Sch-M zámek blokuje všechny ostatní transakce, které čekají za tímto zámkem při přístupu ke stejné tabulce.

    Note

    Opětovné sestavení online indexu může nastavit low_priority_lock_wait možnosti popsané dále v této části.

  • OFF

    Zámky tabulek se použijí po dobu trvání operace indexu. Tím zabráníte všem uživatelům přístup k podkladové tabulce po dobu trvání operace.

column_set_name COLUMN_SET XML PRO ALL_SPARSE_COLUMNS

Applies to: SQL Server a Azure SQL Database.

Název sady sloupců. Sada sloupců je netypová reprezentace XML, která kombinuje všechny řídké sloupce tabulky do strukturovaného výstupu. Sadu sloupců nelze přidat do tabulky, která obsahuje řídké sloupce. Další informace o sadách sloupců najdete v tématu Použití sad sloupců.

{ ENABLE | VYPNOUT } FILETABLE_NAMESPACE

Applies to: SQL Server.

Povolí nebo zakáže systémově definovaná omezení pro FileTable. Lze použít pouze se Souborovou tabulkou.

SET ( FILETABLE_DIRECTORY = directory_name )

Applies to: SQL Server. Azure SQL Database nepodporuje FileTable.

Určuje název adresáře FileTable kompatibilní s Windows. Tento název by měl být jedinečný mezi všemi názvy adresářů FileTable v databázi. Porovnání jedinečnosti nerozlišuje malá a velká písmena bez ohledu na nastavení kolace SQL. Lze použít pouze se Souborovou tabulkou.

REMOTE_DATA_ARCHIVE

Applies to: SQL Server 2017 (14.x) a novější verze.

Povolí nebo zakáže funkci Stretch Database pro tabulku. Další informace naleznete v tématu Stretch Database.

Important

Funkce Stretch Database je v SQL Server 2022 (16.x) a Azure SQL Database zastaralá. Tato funkce se odebere v budoucí verzi Database Engine. Nepoužívejte tuto funkci v nové vývojové práci a naplánujte úpravu aplikací, které tuto funkci aktuálně používají.

Povolení funkce Stretch Database pro tabulku

Když funkci Stretch pro tabulku povolíte zadáním ON, musíte také určit, MIGRATION_STATE = OUTBOUND začít migrovat data okamžitě, nebo MIGRATION_STATE = PAUSED odložení migrace dat. Výchozí hodnota je MIGRATION_STATE = OUTBOUND. Další informace o povolení funkce Stretch pro tabulku naleznete v tématu Enable Stretch Database pro tabulku.

Prerequisites. Před povolením funkce Stretch pro tabulku musíte povolit funkci Stretch na serveru a v databázi. Další informace najdete v tématu Povolení funkce Stretch Database pro databázi.

Permissions. Povolení funkce Stretch pro databázi nebo tabulku vyžaduje db_owner oprávnění. Povolení funkce Stretch pro tabulku také vyžaduje ALTER oprávnění k tabulce.

Zakázání funkce Stretch Database pro tabulku

Když funkci Stretch pro tabulku zakážete, máte dvě možnosti pro vzdálená data, která už byla migrována do Azure. Další informace najdete v tématu Zakázání funkce Stretch Database a vrácení vzdálených dat.

  • Pokud chcete funkci Stretch pro tabulku zakázat a zkopírovat vzdálená data tabulky z Azure zpět do SQL Server, spusťte následující příkaz. Tento příkaz nejde zrušit.

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

Tato operace nese náklady na přenos dat a nedá se zrušit. Další informace najdete v tématu Podrobnosti o cenách přenosů dat.

Po zkopírování všech vzdálených dat z Azure zpět do SQL Server je funkce Stretch pro tabulku zakázaná.

  • Pokud chcete funkci Stretch pro tabulku zakázat a vzdálená data opustit, spusťte následující příkaz.

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

Po zakázání funkce Stretch Database pro tabulku se migrace dat zastaví a výsledky dotazu už nebudou obsahovat výsledky ze vzdálené tabulky.

Zakázání funkce Stretch neodebere vzdálenou tabulku. Pokud chcete vzdálenou tabulku odstranit, přetáhněte ji pomocí portálu Azure.

[ FILTER_PREDICATE = { null | predikát } ]

Applies to: SQL Server 2017 (14.x) a novější verze.

Volitelně určuje predikát filtru pro výběr řádků, které se mají migrovat z tabulky, která obsahuje historická i aktuální data. Predikát musí volat deterministické vložené funkce s hodnotou tabulky. Další informace najdete v tématu Povolení funkce Stretch Database pro tabulku a Výběr řádků, které chcete migrovat pomocí funkce filtru – Stretch Database.

Important

Pokud zadáte predikát filtru, který se provádí špatně, migrace dat také funguje špatně. Funkce Stretch Database použije predikát filtru na tabulku pomocí operátoru CROSS APPLY .

Pokud nezadáte predikát filtru, celá tabulka se migruje.

Když zadáte predikát filtru, musíte také zadat MIGRATION_STATE.

MIGRATION_STATE = { ODCHOZÍ | PŘÍCHOZÍ | POZASTAVENO }

Applies to: SQL Server 2017 (14.x) a novější verze.

WAIT_AT_LOW_PRIORITY

Applies to: SQL Server 2014 (12.x) a novější verze a Azure SQL Database.

Opětovné sestavení online indexu musí čekat na blokující operace v této tabulce. WAIT_AT_LOW_PRIORITY označuje, že operace opětovného sestavení online indexu čeká na zámky s nízkou prioritou, což umožňuje jiným operacím pokračovat, zatímco operace sestavení online indexu čeká. Vynechání WAIT AT LOW PRIORITY možnosti je stejné jako WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).

MAX_DURATION = čas [ MINUTY ]

Applies to: SQL Server 2014 (12.x) a novější verze a Azure SQL Database.

Doba čekání, což je celočíselná hodnota zadaná v minutách, že SWITCH opětovné sestavení indexu nebo online indexu čeká při spuštění příkazu DDL s nízkou prioritou. Pokud je operace zablokovaná po MAX_DURATION tuto dobu, spustí se jedna z ABORT_AFTER_WAIT akcí. MAX_DURATION čas je vždy v minutách a můžete vynechat slovo MINUTES.

ABORT_AFTER_WAIT = { NONE | SELF | BLOKÁTORY }

Applies to: SQL Server 2014 (12.x) a novější verze a Azure SQL Database.

  • NONE

    Pokračujte v čekání na zámek s normální (pravidelnou) prioritou.

  • SELF

    Ukončete operaci opětovného SWITCH sestavení DDL nebo online indexu, která se právě spouští, aniž byste museli provádět žádnou akci.

  • BLOCKERS

    Ukončete všechny uživatelské transakce, které aktuálně blokují operaci DDL opětovného sestavení indexu SWITCH nebo online indexu, aby operace nemohla pokračovat.

    Vyžaduje ALTER ANY CONNECTION oprávnění.

POKUD EXISTUJE

Applies to: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.

Podmíněně zahodí sloupec nebo omezení jenom v případě, že už existuje.

RESUMABLE = { ON | VYPNUTO}

Applies to: SQL Server 2022 (16.x) a novější verze.

Určuje, zda je operace ALTER TABLE ADD CONSTRAINT obnovitelná. Operace přidání omezení tabulky se dá obnovit, když ON. Operace přidání omezení tabulky není při OFFobnovitelná. Výchozí hodnota je OFF. Možnost RESUMABLE lze použít jako součást ALTER TABLE index_option (Transact-SQL) v ALTER TABLE table_constraint (Transact-SQL).

MAX_DURATION při použití s RESUMABLE = ON (vyžaduje ONLINE = ON) označuje čas (celočíselná hodnota zadaná v minutách), že se před pozastavením provede operace obnovení online přidání omezení. Pokud není zadáno, operace pokračuje až do dokončení.

Další informace o povolení a používání resumable ALTER TABLE ADD CONSTRAINT operací naleznete v tématu Obnovitelné přidání omezení tabulky.

Remarks

Pokud chcete přidat nové řádky dat, použijte INSERT (Transact-SQL). Pokud chcete odebrat řádky dat, použijte DELETE (Transact-SQL) nebo TRUNCATE TABLE (Transact-SQL). Pokud chcete změnit hodnoty v existujících řádcích, použijte UPDATE (Transact-SQL).

Pokud jsou v mezipaměti procedur nějaké plány provádění, které odkazují na tabulku, ALTER TABLE označí je, aby se znovu zkompilovaly při dalším spuštění.

V současné době nelze v databázi SQL v Microsoft Fabric vytvořit tabulky v paměti, registru, historii registru a always Encrypted. Další informace najdete v tématu Limitations in SQL Database in Microsoft Fabric.

Ve službě SQL Database v Microsoft Fabric je možné vytvořit některé funkce tabulky, ale nejsou v Fabric OneLake. Další informace najdete v tématu Limitations for Fabric SQL Database mirroring.

V Fabric Data Warehouse mohou podporované operace ALTER TABLE Transact-SQL provádět uvnitř explicitní uživatelem definované transakce. Další informace najdete v tématu Transactions v Fabric Data Warehouse.

V Fabric Data Warehouse můžete pomocí ALTER TABLE změnit distribuované tabulky #temp, ale ne dočasné tabulky založené na MDF. Další informace najdete v tabulkách #temp v Fabric Data Warehouse.

Změna velikosti sloupce

Délku, přesnost nebo měřítko sloupce můžete změnit zadáním nové velikosti datového typu sloupce. Použijte klauzuli ALTER COLUMN . Pokud data ve sloupci existují, nová velikost nemůže být menší než maximální velikost dat. Kromě toho nelze definovat sloupec v indexu, pokud není sloupec varchar, nvarchar nebo varbinary a index není výsledkem PRIMARY KEY omezení. Podívejte se na příklad v krátké části s názvem Altering a Column Definition.

Zámky a ALTER TABLE

Změny, které zadáte, ALTER TABLE se projeví okamžitě. Pokud změny vyžadují úpravy řádků v tabulce, ALTER TABLE aktualizujte řádky. ALTER TABLE získá zámek schématu (Sch-M) v tabulce, aby se zajistilo, že žádná další připojení nebudou během změny odkazovat na metadata tabulky, s výjimkou operací online indexu, které vyžadují krátký Sch-M zámek na konci. V ALTER TABLE...SWITCH operaci se zámek získá ve zdrojové i cílové tabulce. Změny provedené v tabulce jsou protokolovány a plně obnovitelné. Změny, které mají vliv na všechny řádky ve velkých tabulkách, například vyřazení sloupce nebo v některých edicích SQL Server, přidání sloupce NOT NULL s výchozí hodnotou může trvat dlouhou dobu, než se dokončí a vygeneruje mnoho záznamů protokolu. Spusťte tyto ALTER TABLE příkazy se stejnou opatrností jako jakýkoli INSERTpříkaz nebo UPDATEpříkaz, DELETE který ovlivňuje mnoho řádků.

Rozšířené události (XEvents) pro přepínač oddílů

Následující události XEvent se vztahují k ALTER TABLE ... SWITCH PARTITION a online index znovu sestaví.

  • lock_request_priority_state
  • process_killed_by_abort_blockers
  • ddl_with_wait_at_low_priority

Přidání sloupců NOT NULL jako online operace

V SQL Server 2012 (11.x) Edice Enterprise a novějších verzích je přidání sloupce NOT NULL s výchozí hodnotou online operace, pokud je výchozí hodnotou konstanta runtime. Toto výchozí chování znamená, že operace se dokončí téměř okamžitě i přes počet řádků v tabulce, protože stávající řádky v tabulce se během operace neaktualizují. Místo toho je výchozí hodnota uložená pouze v metadatech tabulky a podle potřeby se tato hodnota vyhledá v dotazech, které přistupují k těmto řádkům. Toto chování je automatické. K implementaci online operace nad ADD COLUMN rámec syntaxe není nutná žádná další syntaxe. Konstanta modulu runtime je výraz, který vytváří stejnou hodnotu za běhu pro každý řádek v tabulce bez ohledu na jeho determinismus. Například konstantní výraz "My temporary data"nebo systémová funkce GETUTCDATETIME() jsou konstanty modulu runtime. Naproti tomu funkce NEWID() nebo NEWSEQUENTIALID() nejsou konstanty modulu runtime, protože pro každý řádek v tabulce se vytvoří jedinečná hodnota. NOT NULL Přidání sloupce s výchozí hodnotou, která není konstantou modulu runtime, se vždy spouští offline a po dobu trvání operace se získá výhradní zámek (Sch-M).

Zatímco existující řádky odkazují na hodnotu uloženou v metadatech, výchozí hodnota je uložena na řádku pro všechny nové řádky, které jsou vloženy, a nezadávají jinou hodnotu sloupce. Výchozí hodnota uložená v metadatech se při aktualizaci řádku přesune na existující řádek (i když v příkazu není zadaný UPDATE skutečný sloupec), nebo pokud se znovu sestaví tabulka nebo clusterovaný index.

V online operaci nemůžete přidat sloupce typu varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography nebo typy definované uživatelem CLR. Sloupec nemůžete přidat online, pokud tak učiníte, protože maximální možná velikost řádku překročí limit 8 060 bajtů. Sloupec se v tomto případě přidá jako offline operace.

Paralelní spuštění plánu

V SQL Server 2012 (11.x) Edice Enterprise a novějších verzích max degree of parallelism určí počet procesorů, na kterých běží jeden ALTER TABLE ADD (indexový) CONSTRAINT nebo DROP (clusterovaný index) CONSTRAINT příkaz. Pokud Database Engine zjistí, že systém je zaneprázdněný, automaticky snižuje stupeň paralelismu operace před spuštěním příkazu. Zadáním možnosti můžete ručně nakonfigurovat počet procesorů, které příkaz MAXDOP spouští. Další informace naleznete v tématu Konfigurace serveru: maximální stupeň paralelismu.

Dělené tabulky

Kromě provádění SWITCH operací, které zahrnují dělené tabulky, použijte ALTER TABLE ke změně stavu sloupců, omezení a triggerů dělené tabulky stejně jako u tabulek, které nejsou rozdělené. Tento příkaz ale nemůžete použít ke změně způsobu dělení tabulky samotné. Pokud chcete předělit dělenou tabulku, použijte ALTER PARTITION SCHEME (Transact-SQL) a ALTER PARTITION FUNCTION (Transact-SQL). Kromě toho nemůžete změnit datový typ sloupce dělené tabulky.

Omezení tabulek s zobrazeními vázaných schématem

Omezení, která platí pro ALTER TABLE příkazy u tabulek se zobrazeními vázanými na schéma, jsou stejná jako omezení, která se aktuálně používají při úpravách tabulek pomocí jednoduchého indexu. Můžete přidat sloupec. Nemůžete ale odebrat ani změnit sloupec, který se účastní jakéhokoli zobrazení vázaného na schéma. Pokud příkaz ALTER TABLE vyžaduje změnu sloupce použitého v zobrazení vázaném na schéma, ALTER TABLE selže a Database Engine vyvolá chybovou zprávu. Další informace o vazbách schématu a indexovaných zobrazeních najdete v tématu CREATE VIEW (Transact-SQL).

Přidání nebo odebrání aktivačních událostí u základních tabulek není ovlivněno vytvořením zobrazení vázaného na schéma, které odkazuje na tabulky.

Indexy a ALTER TABLE

Indexy vytvořené jako součást omezení se při vyřazení omezení zahodí. Chcete-li odstranit indexy, které jste vytvořili pomocí , CREATE INDEXpoužijte DROP INDEX. ALTER INDEX Příkaz použijte k opětovnému sestavení indexu, který je součástí definice omezení. Omezení nemusíte znovu zahazovat a přidávat pomocí .ALTER TABLE

Před odebráním sloupce je nutné odebrat všechny indexy a omezení založená na sloupci.

Když odstraníte omezení, které vytvořilo clusterovaný index, budou řádky dat uložené na úrovni listu clusterovaného indexu uloženy v neclusterované tabulce. Můžete odstranit clusterovaný index a přesunout výslednou tabulku do jiné skupiny souborů nebo schématu oddílů v jedné transakci zadáním MOVE TO možnosti. Možnost MOVE TO má následující omezení:

  • MOVE TO není platný pro indexovaná zobrazení nebo neclusterované indexy.

  • Schéma oddílů nebo skupina souborů již musí existovat.

  • Pokud nezadáte MOVE TO, tabulka se nachází ve stejném schématu oddílů nebo skupině souborů, jako byla definovaná pro clusterovaný index.

Při vyřazení clusterovaného indexu zadejte ONLINE = ON možnost, aby DROP INDEX transakce neblokovala dotazy a úpravy podkladových dat a přidružených neclusterovaných indexů.

ONLINE = ON má následující omezení:

  • ONLINE = ON není platný pro clusterované indexy, které jsou také zakázané. Zakázané indexy je nutné odstranit pomocí .ONLINE = OFF
  • Index můžete najednou vypustit jen jednou.
  • ONLINE = ON není platný pro indexovaná zobrazení, neclusterované indexy nebo indexy v místních dočasných tabulkách.
  • ONLINE = ON není platný pro indexy columnstore.

Vyřazení clusterovaného indexu vyžaduje dočasné místo na disku, které odpovídá velikosti existujícího clusterovaného indexu. Tato operace uvolní další místo, jakmile se dokončí.

Note

Možnosti uvedené v části <drop_clustered_constraint_option> Platí pro clusterované indexy v tabulkách. Tyto možnosti nemůžete použít u clusterovaných indexů v zobrazeních nebo neclusterovaných indexech.

Replikace změn schématu

Když spustíte ALTER TABLE publikované tabulky v SQL Server Publisher, změna se ve výchozím nastavení rozšíří do všech odběratelů SQL Server. Tato funkce má určitá omezení. Můžete ho zakázat. Další informace naleznete v tématu provádění změn schématu v databázích publikace.

Komprese dat

U systémových tabulek nemůžete povolit kompresi. Pokud je tabulka haldou, operace opětovného sestavení pro ONLINE režim je jednovláknová. Režim použití OFFLINE pro operaci opětovného sestavení haldy s více vlákny Další informace o kompresi dat naleznete v tématu Komprese dat.

Pokud chcete vyhodnotit, jak změna stavu komprese ovlivňuje tabulku, index nebo oddíl, použijte uloženou proceduru sp_estimate_data_compression_savings systému.

Pro dělené tabulky platí následující omezení:

  • Pokud tabulka obsahuje nerovné indexy, nemůžete změnit nastavení komprese jednoho oddílu.
  • ALTER TABLE <table> REBUILD PARTITION ... syntaxe znovu sestaví zadaný oddíl.
  • ALTER TABLE <table> REBUILD WITH ... syntaxe znovu sestaví všechny oddíly.

Přetažení ntextových sloupců

Když vyřadíte sloupce, které používají zastaralý datový typ ntext , vyčištění odstraněných dat proběhne jako serializovaná operace na všech řádcích. Vyčištění může vyžadovat velké množství času. Když v tabulce s velkým množstvím řádků zahodíte ntextový sloupec, nejprve aktualizujte sloupec ntext na NULL hodnotu a potom sloupec vypusťte. Tuto možnost můžete spustit s paralelními operacemi a zrychlit ji.

Opětovné sestavení online indexu

Chcete-li spustit příkaz DDL pro opětovné sestavení online indexu, musí být dokončeny všechny aktivní blokující transakce spuštěné v konkrétní tabulce. Při spuštění online indexu zablokuje všechny nové transakce, které jsou připravené začít spouštět v této tabulce. Přestože doba trvání zámku pro opětovné sestavení online indexu je krátká, čekání na dokončení všech otevřených transakcí v dané tabulce a blokování nových transakcí, které se mají spustit, může výrazně ovlivnit propustnost. Toto čekání na uzamčení může způsobit zpomalení úlohy nebo vypršení časového limitu a výrazně omezit přístup k podkladové tabulce. Tato WAIT_AT_LOW_PRIORITY možnost umožňuje DBA spravovat zámek S a Sch-M zámky vyžadované pro opětovné sestavení online indexu. Ve všech třechpřípadechch NONESELFBLOCKERS(MAX_DURATION = n [minutes])

Podpora kompatibility

Příkaz ALTER TABLE podporuje pouze názvy dvou částí (schema.object) tabulek. V SQL Server zadání názvu tabulky pomocí následujících formátů selže v době kompilace s chybou 117.

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

V dřívějších verzích zadejte formát server.database.schema.table vrátil chybu 4902. Zadání formátu .database.schema.table nebo formátu ..schema.table bylo úspěšné.

Pokud chcete tento problém vyřešit, odeberte použití předpony čtyřdílné části.

Permissions

Vyžaduje ALTER oprávnění k tabulce.

ALTER TABLE oprávnění platí pro obě tabulky zahrnuté v ALTER TABLE SWITCH příkazu. Všechna přepíná data dědí zabezpečení cílové tabulky.

Pokud definujete libovolné sloupce v ALTER TABLE příkazu, které mají být uživatelem definovaným typem nebo datovým typem aliasu CLR (Common Language Runtime), REFERENCES je vyžadováno oprávnění k danému typu.

Přidání nebo změna sloupce, který aktualizuje řádky tabulky, vyžaduje UPDATE oprávnění k tabulce. Například přidání NOT NULL sloupce s výchozí hodnotou nebo přidáním sloupce identity, pokud tabulka není prázdná.

Examples

Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Server ukázky a projekty komunity.

Category Doporučené prvky syntaxe
Přidání sloupců a omezení ADD; PRIMARY KEY s možnostmi indexu, řídkými sloupci a sadami sloupců
vyřazení sloupců a omezení DROP
změna definice sloupce Změna datového typu; změnit velikost sloupce; Kolace
změna definice tabulky DATA_COMPRESSION; SWITCH PARTITION; ; LOCK ESCALATION sledování změn
Zakázání a povolení omezení a triggerů CHECK; NO CHECK; ; ENABLE TRIGGERDISABLE TRIGGER
Online operace ONLINE
Správa verzí systému SYSTEM_VERSIONING

Přidání sloupců a omezení

Příklady v této části ukazují přidání sloupců a omezení do tabulky.

A. Přidání nového sloupce

Následující příklad přidá sloupec, který umožňuje hodnoty null a neobsahuje definici DEFAULT . V novém sloupci má NULLkaždý řádek .

CREATE TABLE dbo.doc_exa (column_a INT);
GO

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

B. Přidání sloupce s omezením

Následující příklad přidá nový sloupec s omezením 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

EXECUTE sp_help doc_exc;
GO

DROP TABLE dbo.doc_exc;
GO

C. Přidání neověřeného omezení CHECK do existujícího sloupce

Následující příklad přidá omezení do existujícího sloupce v tabulce. Sloupec má hodnotu, která porušuje omezení. Proto příklad používá WITH NOCHECK k zabránění ověření omezení proti existujícím řádkům a k povolení přidání omezení.

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

EXECUTE sp_help doc_exd;
GO

DROP TABLE dbo.doc_exd;
GO

D. Přidání omezení DEFAULT do existujícího sloupce

Následující příklad vytvoří tabulku se dvěma sloupci a vloží hodnotu do prvního sloupce, zatímco druhý sloupec zůstane NULL. Příklad pak přidá DEFAULT omezení do druhého sloupce. Pokud chcete ověřit, že se použije výchozí hodnota, vloží příklad jinou hodnotu do prvního sloupce a dotazuje se na tabulku.

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. Přidání několika sloupců s omezeními

Následující příklad přidá několik sloupců s omezeními definovanými novým sloupcem. První nový sloupec má vlastnost IDENTITY. Každý řádek v tabulce má ve sloupci identity nové přírůstkové hodnoty.

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

ALTER TABLE dbo.doc_exe

    -- Add a PRIMARY KEY identity column.
    ADD 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 FOREIGN KEY 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

EXECUTE sp_help doc_exe;
GO

DROP TABLE dbo.doc_exe;
GO

F. Přidání sloupce s možnou hodnotou null s výchozími hodnotami

Následující příklad přidá sloupec s možnou hodnotou null s definicí DEFAULT a používá WITH VALUES k zadání hodnot pro každý existující řádek v tabulce. Pokud ho nepoužíváte WITH VALUES, každý řádek má hodnotu NULL v novém sloupci.

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
        CONSTRAINT AddDateDflt DEFAULT GETDATE() WITH VALUES NULL;
GO

DROP TABLE dbo.doc_exf;
GO

G. Vytvoření omezení PRIMÁRNÍHO KLÍČE s možnostmi indexu nebo komprese dat

Následující příklad vytvoří PRIMARY KEY omezení PK_TransactionHistoryArchive_TransactionID a nastaví možnosti FILLFACTOR, ONLINEa PAD_INDEX. Výsledný clusterovaný index má stejný název jako omezení.

Applies to: SQL Server a Azure SQL Database.

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

Tento podobný příklad používá kompresi stránky při použití clusterovaného primárního klíče.

USE AdventureWorks2022;
GO

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

H. Přidání zhuštěného sloupce

Následující příklady ukazují přidání a úpravy řídkých sloupců v tabulce T1. Kód pro vytvoření tabulky T1 je následující.

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

Pokud chcete přidat další zhuštěný sloupec C5, spusťte následující příkaz.

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

Chcete-li převést C4 neřídký sloupec na řídký sloupec, spusťte následující příkaz.

ALTER TABLE T1
    ALTER COLUMN C4 ADD SPARSE;
GO

Chcete-li převést C4 řídký sloupec na sloupec, který neníparse, spusťte následující příkaz.

ALTER TABLE T1
    ALTER COLUMN C4 DROP SPARSE;
GO

I. Přidání sady sloupců

Následující příklady ukazují, jak přidat sloupec do tabulky T2. Do tabulky, která už obsahuje řídké sloupce, nemůžete přidat sadu sloupců. Následující kód vytvoří tabulku T2.

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

Následující tři příkazy přidají sadu sloupců s názvem CSa potom upraví sloupce C2 a C3 na 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. Přidání šifrovaného sloupce

Následující příkaz přidá šifrovaný sloupec s názvem 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. Přidání primárního klíče s obnovitelnou operací

Operace obnovení ALTER TABLE pro přidání primárního klíče clusterovaného ve sloupci (a) s 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);

Vyřazení sloupců a omezení

Příklady v této části ukazují, jak odstranit sloupce a omezení.

A. Přetažení sloupce nebo sloupců

První příklad upraví tabulku tak, aby odebrala sloupec. Druhý příklad odebere více sloupců.

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. Omezení a sloupce přetažení

První příklad odebere omezení UNIQUE z tabulky. Druhý příklad odebere dvě omezení a jeden sloupec.

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. Vyřazení omezení PRIMÁRNÍHO KLÍČE v režimu ONLINE

Následující příklad odstraní PRIMARY KEY omezení s možností nastavenou ONLINE na ON.

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

D. Přidání a vyřazení omezení CIZÍHO KLÍČE

Následující příklad vytvoří tabulku ContactBackupa pak změní tabulku. Nejprve přidá FOREIGN KEY omezení, které odkazuje na tabulku Person.Person. Pak omezení zahodí 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;

Změna definice sloupce

A. Změna datového typu sloupce

Následující příklad změní sloupec tabulky 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. Změna velikosti sloupce

Následující příklad zvětšuje velikost sloupce varchar a přesnost a měřítko sloupce desetinných míst. Protože sloupce obsahují data, můžete velikost sloupce pouze zvětšit. Všimněte si také, že col_a je definován v jedinečném indexu. Stále můžete zvětšit velikost col_a , protože datový typ je varchar a index není výsledkem PRIMARY KEY omezení.

-- 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. Změna kolace sloupců

Následující příklad ukazuje, jak změnit kolaci sloupce. Nejprve vytvoříte tabulku s výchozí kolací uživatele.

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

Dále změňte kolaci sloupce C2 na Latin1_General_BIN. Datový typ musíte zadat, i když se nezmění.

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

D. Šifrování sloupce

Následující příklad ukazuje, jak zašifrovat sloupec pomocí funkce Always Encrypted se zabezpečenými enklávy.

Nejprve vytvoříte tabulku bez šifrovaných sloupců.

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

Dále zašifrujte sloupec C2 pomocí šifrovacího klíče sloupce s názvem CEK1a randomizovaným šifrováním. Pro úspěšné provedení následujícího příkazu:

  • Šifrovací klíč sloupce musí být povolený pro enklávu. Tento požadavek znamená, že musí být šifrovaný pomocí klíče sloupce master (CMK), který umožňuje výpočty enklávy.
  • Cílová SQL Server instance musí podporovat funkci Always Encrypted se zabezpečenými enklávy.
  • Příkaz musí být vydán prostřednictvím připojení nastaveného pro Always Encrypted se zabezpečenými enklávy a pomocí podporovaného klientského ovladače.
  • Volající aplikace musí mít přístup k CMK a chránit 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

Změna definice tabulky

Příklady v této části ukazují, jak změnit definici tabulky.

A. Úprava tabulky pro změnu komprese

Následující příklad změní kompresi tabulky, která není součástí. Haldu nebo clusterovaný index se znovu sestaví. Pokud je tabulka haldou, všechny neclusterované indexy se znovu sestaví.

ALTER TABLE T1 REBUILD
    WITH (DATA_COMPRESSION = PAGE);

Následující příklad změní kompresi dělené tabulky. Syntaxe REBUILD PARTITION = 1 způsobí, že se znovu sestaví jenom číslo oddílu 1.

Applies to: SQL Server.

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

Stejná operace pomocí následující alternativní syntaxe způsobí, že se všechny oddíly v tabulce znovu sestaví.

Applies to: SQL Server.

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

Další příklady komprese dat najdete v tématu Komprese dat.

B. Úprava tabulky columnstore za účelem změny archivní komprese

Následující příklad dále komprimuje oddíl tabulky columnstore použitím dalšího algoritmu komprese. Tato komprese zmenší tabulku na menší velikost, ale také zvětší čas potřebný pro ukládání a načítání. Tato komprese je užitečná pro archivaci nebo pro situace, které vyžadují méně místa a mohou si dovolit více času pro ukládání a načítání.

Applies to: SQL Server 2014 (12.x) a novější verze a Azure SQL Database.

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

Následující příklad dekomprimuje oddíl tabulky columnstore, který byl komprimován s COLUMNSTORE_ARCHIVE možností. Po obnovení se data budou dál komprimovat pomocí komprese columnstore, která se používá pro všechny tabulky columnstore.

Applies to: SQL Server 2014 (12.x) a novější verze a Azure SQL Database.

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

C. Přepínání oddílů mezi tabulkami

Následující příklad vytvoří dělenou tabulku za předpokladu, že schéma oddílů myRangePS1 je již vytvořeno v databázi. Dále se vytvoří nesedělená tabulka se stejnou strukturou jako dělená tabulka a ve stejné skupině souborů jako PARTITION 2 tabulky PartitionTable. Data PARTITION 2 tabulky PartitionTable se pak přepnou do tabulky 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. Povolit eskalaci zámku u dělených tabulek

Následující příklad umožňuje eskalaci zámku na úrovni oddílu v dělené tabulce. Pokud tabulka není rozdělená na oddíly, je eskalace zámku nastavená TABLE na úrovni.

Applies to: SQL Server a Azure SQL Database.

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

E. Konfigurace sledování změn v tabulce

Následující příklad umožňuje sledování změn v tabulce Person.Person.

Applies to: SQL Server a Azure SQL Database.

USE AdventureWorks2022;

ALTER TABLE Person.Person ENABLE CHANGE_TRACKING;

Následující příklad umožňuje sledování změn a umožňuje sledování sloupců, které se aktualizují během změny.

Applies to: SQL Server.

USE AdventureWorks2022;
GO

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

Následující příklad zakáže sledování změn v tabulce Person.Person.

Applies to: SQL Server a Azure SQL Database.

USE AdventureWorks2022;
GO

ALTER TABLE Person.Person DISABLE CHANGE_TRACKING;

Zakázání a povolení omezení a triggerů

A. Zakázání a opětovné povolení omezení

Následující příklad zakáže omezení, které omezuje platy přijaté v datech. NOCHECK CONSTRAINT Slouží ALTER TABLE k zakázání omezení a povolení vložení, které by obvykle porušovalo omezení. Slouží CHECK CONSTRAINT k opětovnému povolení omezení.

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 fails.
ALTER TABLE dbo.cnst_example CHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (4, 'Eric James', 110000);

B. Zakázání a opětovné povolení triggeru

Následující příklad používá DISABLE TRIGGER možnost ALTER TABLE zakázat trigger a povolit vložení, které by obvykle porušovalo trigger. Slouží ENABLE TRIGGER k opětovnému povolení triggeru.

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

Online operace

A. Online opětovné sestavení indexu s využitím možností čekání s nízkou prioritou

Následující příklad ukazuje, jak provést online opětovné sestavení indexu určující možnosti čekání s nízkou prioritou.

Applies to: SQL Server 2014 (12.x) a novější verze a 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. Online sloupec oltárů

Následující příklad ukazuje, jak spustit operaci alter column s ONLINE možností.

Applies to: SQL Server 2016 (13.x) a novější verze a 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

EXECUTE sp_help doc_exy;
DROP TABLE dbo.doc_exy;
GO

Správa verzí systému

Následující čtyři příklady vám pomůžou seznámit se syntaxí pro používání systémových verzí. Další pomoc najdete v tématu Začínáme se systémovými dočasnými tabulkami.

Applies to: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.

A. Přidání správy systémových verzí do existujících tabulek

Následující příklad ukazuje, jak přidat systémovou správu verzí do existující tabulky a vytvořit budoucí tabulku historie. Tento příklad předpokládá, že existuje existující tabulka s názvem InsurancePolicy s definovaným primárním klíčem. Tento příklad naplní nově vytvořené sloupce období pro správu verzí systému pomocí výchozích hodnot pro počáteční a koncové časy, protože tyto hodnoty nemohou být null. V tomto příkladu se HIDDEN klauzule používá k zajištění žádného účinku na existující aplikace, které pracují s aktuální tabulkou. Používá také HISTORY_RETENTION_PERIOD službu, která je k dispozici pouze ve službě SQL Database.

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

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

B. Migrace existujícího řešení pro použití správy verzí systému

Následující příklad ukazuje, jak migrovat na správu verzí systému z řešení, které používá triggery k napodobování dočasné podpory. Příklad předpokládá, že existuje existující řešení, které používá ProjectTask tabulku a ProjectTaskHistory tabulku pro stávající řešení, které používá Changed Date sloupce a Revised Date sloupce pro období, že tyto sloupce období nepoužívají datový typ datetime2 a že ProjectTask tabulka má definovaný primární klíč.

-- 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. Zakázání a opětovné povolení správy verzí systému pro změnu schématu tabulky

Tento příklad ukazuje, jak zakázat správu verzí systému v tabulce Department, přidat sloupec a znovu povolit správu verzí systému. K úpravě schématu tabulky se vyžaduje zakázání správy verzí systému. Pomocí těchto kroků v rámci transakce zabráníte aktualizacím obou tabulek při aktualizaci schématu tabulky, což dbA umožňuje přeskočit kontrolu konzistence dat při opětovném povolení správy verzí systému a získat výhodu výkonu. Úlohy, jako je vytváření statistik, přepínání oddílů nebo použití komprese u jedné nebo obou tabulek, nevyžadují zakázání správy verzí systému.

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. Odebrání správy verzí systému

Tento příklad ukazuje, jak úplně odebrat správu verzí systému z tabulky Oddělení a odstranit DepartmentHistory tabulku. Volitelně můžete chtít také vyřadit sloupce období používané systémem k záznamu informací o správě verzí systému. V době, kdy je povolená správa systémových verzí, nemůžete odstranit tabulky Department ani tabulky DepartmentHistory.

ALTER TABLE Department
    SET (SYSTEM_VERSIONING = OFF);

ALTER TABLE Department
    DROP PERIOD FOR SYSTEM_TIME;

DROP TABLE DepartmentHistory;

Příklady: Azure Synapse Analytics a systém PDW (Analytics Platform System)

Následující příklady A až C používají tabulku FactResellerSales v databázi AdventureWorksPDW2022.

A. Určení, jestli je tabulka rozdělená na oddíly

Následující dotaz vrátí jeden nebo více řádků, pokud je tabulka FactResellerSales rozdělena. Pokud tabulka není rozdělená na oddíly, dotaz nevrátí žádné řádky.

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

B. Určení hodnot hranic pro dělenou tabulku

Následující dotaz vrátí hodnoty hranic pro každý oddíl v tabulce 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
     INNER JOIN sys.indexes AS i
         ON t.object_id = i.object_id
     INNER JOIN sys.partitions AS p
         ON i.object_id = p.object_id
        AND i.index_id = p.index_id
     INNER JOIN sys.partition_schemes AS s
         ON i.data_space_id = s.data_space_id
     INNER JOIN sys.partition_functions AS f
         ON s.function_id = f.function_id
     LEFT OUTER 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. Určení sloupce oddílu pro dělenou tabulku

Následující dotaz vrátí název sloupce dělení tabulky 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
     INNER JOIN sys.indexes AS i
         ON t.object_id = i.object_id
     INNER JOIN sys.columns AS c
         ON t.object_id = c.object_id
     INNER JOIN sys.partition_schemes AS ps
         ON ps.data_space_id = i.data_space_id
     INNER 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. Sloučení dvou oddílů

Následující příklad sloučí dva oddíly v tabulce.

Tabulka Customer má následující definici:

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

Následující příkaz kombinuje hranice oddílů 10 a 25.

ALTER TABLE Customer MERGE RANGE (10);

Nový DDL tabulky je následující:

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. Rozdělení oddílu

Následující příklad rozdělí oddíl na tabulku.

Tabulka Customer obsahuje následující 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)
    )
);

Následující příkaz vytvoří nový oddíl vázaný na hodnotu 75 v rozmezí od 50 do 100.

ALTER TABLE Customer SPLIT RANGE (75);

Nový DDL tabulky je následující:

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. Přesunutí oddílu do tabulky historie pomocí přepínače

Následující příklad přesune data v oddílu tabulky Orders do oddílu v tabulce OrdersHistory.

Tabulka Orders obsahuje následující 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')
    )
);

V tomto příkladu má tabulka Orders následující oddíly. Každý oddíl obsahuje data.

Partition Obsahuje data? Rozsah hranic
1 Yes OrderDate < '2004-01-01'
2 Yes '2004-01-01' <= OrderDate < '2005-01-01'
3 Yes '2005-01-01' <= OrderDate< '2006-01-01'
4 Yes '2006-01-01'<= OrderDate < '2007-01-01'
5 Yes '2007-01-01' <= OrderDate
  • Oddíl 1 (obsahuje data): OrderDate < '2004-01-01'
  • Oddíl 2 (obsahuje data): '2004-01-01' <= OrderDate < '2005-01-01'
  • Oddíl 3 (obsahuje data): '2005-01-01' <= OrderDate< '2006-01-01'
  • Oddíl 4 (obsahuje data): '2006-01-01'<= OrderDate < '2007-01-01'
  • Oddíl 5 (obsahuje data): '2007-01-01' <= OrderDate

Tabulka OrdersHistory obsahuje následující DDL, který má stejné sloupce a názvy sloupců jako Orders tabulka. Oba se distribuují hodnotou hash ve sloupci 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')
    )
);

I když názvy sloupců a sloupců musí být stejné, hranice oddílů nemusí být stejné. V tomto příkladu má tabulka OrdersHistory následující dva oddíly a oba oddíly jsou prázdné:

  • Oddíl 1 (bez dat): OrderDate < '2004-01-01'
  • Oddíl 2 (prázdný): '2004-01-01' <= OrderDate

U předchozích dvou tabulek následující příkaz přesune všechny řádky s OrderDate < '2004-01-01' z tabulky Orders do tabulky OrdersHistory.

ALTER TABLE Orders SWITCH PARTITION 1 TO OrdersHistory PARTITION 1;

V důsledku toho je první oddíl v Orders prázdný a první oddíl v OrdersHistory obsahuje data. Tabulky se teď zobrazují takto:

tabulka Orders

  • Oddíl 1 (prázdný): OrderDate < '2004-01-01'
  • Oddíl 2 (obsahuje data): '2004-01-01' <= OrderDate < '2005-01-01'
  • Oddíl 3 (obsahuje data): '2005-01-01' <= OrderDate< '2006-01-01'
  • Oddíl 4 (obsahuje data): '2006-01-01'<= OrderDate < '2007-01-01'
  • Oddíl 5 (obsahuje data): '2007-01-01' <= OrderDate

tabulka OrdersHistory

  • Oddíl 1 (obsahuje data): OrderDate < '2004-01-01'
  • Oddíl 2 (prázdný): '2004-01-01' <= OrderDate

Pokud chcete tabulku vyčistit Orders , můžete prázdný oddíl odebrat sloučením oddílů 1 a 2 následujícím způsobem:

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

Po sloučení má tabulka Orders následující oddíly:

tabulka Orders

  • Oddíl 1 (obsahuje data): OrderDate < '2005-01-01'
  • Oddíl 2 (obsahuje data): '2005-01-01' <= OrderDate< '2006-01-01'
  • Oddíl 3 (obsahuje data): '2006-01-01'<= OrderDate < '2007-01-01'
  • Oddíl 4 (obsahuje data): '2007-01-01' <= OrderDate

Předpokládejme, že další rok projde a jste připraveni archivovat rok 2005. Prázdný oddíl můžete přidělit pro rok 2005 v tabulce OrdersHistory rozdělením prázdného oddílu následujícím způsobem:

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

Po rozdělení má tabulka OrdersHistory následující oddíly:

tabulka OrdersHistory

  • Oddíl 1 (obsahuje data): OrderDate < '2004-01-01'
  • Oddíl 2 (prázdný): '2004-01-01' < '2005-01-01'
  • Oddíl 3 (prázdný): '2005-01-01' <= OrderDate