Sdílet prostřednictvím


ALTER TABLE (Transact-SQL)

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Warehouse v 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.

Poznámka

V současné době se ALTER TABLE ve službě Fabric Warehouse podporuje pouze pro omezení a přidávání sloupců s možnou hodnotou null. Viz syntaxe pro sklad vFabric .

Důležitý

Syntaxe příkazu ALTER TABLE se u tabulek založených na disku a tabulek optimalizovaných pro paměť 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:

  • syntaxe

  • Příklady

  • Tabulky optimalizované pro paměť

  • syntaxe

  • Příklady

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

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í datový sklad

-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse

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

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

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

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

Poznámka

Bezserverový fond SQL ve službě Azure Synapse Analytics podporuje pouze externí a dočasných tabulek.

Syntaxe pro sklad v prostředcích infrastruktury

-- Syntax for Warehouse om Microsoft Fabric:

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

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

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

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

Argumenty

database_name

Název databáze, ve které byla tabulka vytvořena.

schema_name

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

table_name

Název tabulky, která se má změnit. Pokud tabulka není v aktuální databázi nebo obsahuje schéma vlastněné aktuálním uživatelem, musíte explicitně zadat databázi a schéma.

ALTER COLUMN

Určuje, že pojmenovaný sloupec se má změnit nebo změnit.

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

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

  • ROWGUIDCOL pro tabulku.

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

  • Používá se ve statistikách vygenerovaných příkazem CREATE STATISTICS. Uživatelé musí spouštět DROP STATISTICS, aby statistiky vyhodili, než může funkce ALTER COLUMN proběhnout úspěšně. Spuštěním tohoto dotazu získáte 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>');
    

    Poznámka

    Statistiky, které jsou automaticky generovány optimalizátorem dotazů, se automaticky vyřadí pomocí příkazu ALTER COLUMN.

  • Používá se v omezení PRIMÁRNÍ KLÍČ nebo [CIZÍ KLÍČ] ODKAZY.

  • Používá se v omezení CHECK nebo UNIQUE. Změna délky sloupce proměnné použitého v omezení CHECK nebo UNIQUE je ale povolená.

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

Datový typ text, ntexta obrázku sloupce lze 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 nchar nebo nvarchar sloupec může způsobit převod rozšířených znaků například na char nebo varchar. Další informace naleznete v tématu CAST a CONVERT. Snížení přesnosti nebo měřítka sloupce může způsobit zkrácení dat.

Poznámka

Datový typ sloupce dělené tabulky nelze změnit.

Datový typ sloupců zahrnutých v indexu nelze změnit, pokud není sloupec varchar, nvarcharnebo varbinární datový typ a nová velikost se rovná nebo větší než stará velikost.

Sloupec, který je součástí omezení primárního klíče, nelze změnit z NOT NULL na NULL.

Pokud používáte funkci Always Encrypted (bez zabezpečených enkláv), pokud je změněný sloupec šifrovaný pomocí funkce 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 jakékoli nastavení šifrování, pokud šifrovací klíč sloupce chrání sloupec (a nový šifrovací klíč sloupce, pokud měníte klíč), podporují výpočty enklávy (zašifrované hlavními klíči sloupců s podporou enklávy). Podrobnosti najdete v tématu Always Encrypted se zabezpečenými enklávy.

Když upravíte sloupec, databázový stroj sleduje každou změnu přidáním řádku do systémové tabulky 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 databázový stroj dosáhnout limitu velikosti záznamu. V takovém případě se zobrazí chyba 511 nebo 1708. Abyste těmto chybám předešli, znovu sestavte clusterovaný index v tabulce pravidelně nebo snižte počet úprav sloupců.

column_name

Název sloupce, který se má změnit, přidat nebo vynechat. 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.

Poznámka

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

  • Systémový datový typ SYSTÉMU SQL Server.
  • Datový typ aliasu založený na systémovém datovém typu SQL Serveru. Datové typy aliasů vytvoříte pomocí příkazu CREATE TYPE před použitím v definici tabulky.
  • Uživatelem definovaný typ rozhraní .NET Framework a schéma, do kterého patří. Typy definované uživatelem vytvoříte pomocí příkazu CREATE TYPE před použitím v definici tabulky.

Níže jsou uvedená kritéria pro type_name změněného sloupce:

  • 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é pro ALTER COLUMN; pokud není zadaný, sloupec má hodnotu null.
  • ANSI_PADDING odsazení je vždy ZAPNUTO 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í pro SET ARITHABORT je ignorováno. FUNKCE ALTER TABLE funguje tak, jako by byla vlastnost ARITHABORT nastavená na HODNOTU ON.

Poznámka

Pokud není zadaná klauzule COLLATE, 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 naleznete v tématu Přesnost, Měřítko a Délka.

škálování

Měřítko pro zadaný datový typ. Další informace o platných hodnotách měřítka naleznete v tématu Přesnost, Měřítko a Délka.

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

platí pro: SQL Server (SQL Server 2008 (10.0.x) a novější) 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ématu nejprve vytvoříte kolekci schématu v databázi pomocí CREATE XML SCHEMA COLLECTION.

< COLLATION_NAME> COLLATE

Určuje novou kolaci pro změněný sloupec. Pokud není zadaný, přiřadí se sloupci výchozí kolace databáze. Název kolace může být buď název kolace Systému Windows, nebo název kolace SQL. Seznam a další informace naleznete v tématu Název kolace systému Windows a název kolace SYSTÉMU SQL Server.

Klauzule COLLATE změní kolace pouze sloupců znakových, varchar, nchara nvarchar datových typů. Chcete-li změnit kolaci sloupce datového typu aliasu definovaného uživatelem, použijte samostatné příkazy ALTER TABLE ke změně sloupce na systémový datový typ SYSTÉMU SQL Serveru. 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:

  • Pokud se změnilo omezení CHECK, omezení CIZÍ KLÍČ nebo počítané sloupce odkazují na sloupec.
  • Pokud se ve sloupci vytvoří index, statistika nebo fulltextový index. Pokud se změní kolace sloupce, statistika vytvořená automaticky u sloupce se zahodí.
  • Pokud zobrazení vázané na schéma nebo funkce odkazuje na sloupec.

Další informace naleznete v tématu COLLATE.

NULL | NOT NULL

Určuje, jestli sloupec může přijímat hodnoty null. Sloupce, které nepovolují hodnoty null, se přidají pomocí příkazu ALTER TABLE pouze v případě, že mají zadanou výchozí hodnotu nebo pokud je tabulka prázdná. Pro počítané sloupce můžete zadat HODNOTU NOT NULL pouze v případě, že jste zadali také FUNKCI PERSISTED. 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 pomocí funkce WITH VALUES uložit výchozí hodnotu 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 výchozí definici. A nový sloupec se automaticky načte s výchozí hodnotou v nových sloupcích v každém existujícím řádku.

V alter COLUMN můžete zadat hodnotu NULL, která vynutí, aby sloupec NOT NULL povolil hodnoty null s výjimkou sloupců v omezeníCH PRIMÁRNÍHO KLÍČE. Hodnotu NOT NULL lze zadat pouze v případě, že sloupec neobsahuje žádné hodnoty null. Hodnoty null musí být aktualizovány na určitou hodnotu, než je povolená hodnota ALTER COLUMN NOT NULL, například:

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

Když vytvoříte nebo změníte tabulku pomocí příkazů CREATE TABLE nebo ALTER TABLE, ovlivní nastavení databáze a relace hodnotu null datového typu, který se používá v definici sloupce. Ujistěte se, že vždy explicitně definujete sloupec jako NULL nebo NOT NULL pro nekomputované 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 naleznete v tématu CREATE TABLE.

Poznámka

Je-li zadána hodnota NULL nebo NOT NULL pomocí příkazu ALTER COLUMN, musí být zadána také new_data_type [(přesnost [, měřítko ])]. Pokud se datový typ, přesnost a měřítko nezmění, zadejte hodnoty aktuálního sloupce.

[ {ADD | DROP} ROWGUIDCOL ]

platí pro: SQL Server (SQL Server 2008 (10.0.x) a novější) 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 ROWGUIDCOL můžete nastavit pouze jeden uniqueidentifier sloupec na tabulku. A vlastnost ROWGUIDCOL můžete přiřadit pouze uniqueidentifier sloupci. Ke sloupci uživatelem definovaného datového typu nemůžete přiřadit ROWGUIDCOL.

ROWGUIDCOL nevynucuje jedinečnost hodnot uložených ve sloupci a negeneruje automaticky hodnoty pro nové řádky, které se vloží do tabulky. K vygenerování jedinečných hodnot pro každý sloupec použijte funkci NEWID nebo NEWSEQUENTIALID u příkazů INSERT. Nebo jako výchozí hodnotu sloupce zadejte funkci NEWID nebo NEWSEQUENTIALID.

[ {ADD | DROP} TRVALÉ ]

Určuje, že vlastnost PERSISTED 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 databázový stroj fyzicky ukládá vypočítané hodnoty v tabulce a aktualizuje hodnoty, když se aktualizují všechny další sloupce, na kterých je vypočítaný sloupec závislý. Když označíte počítaný sloupec jako PERSISTED, můžete vytvořit indexy u počítaných sloupců definovaných ve výrazech, které jsou deterministické, ale nejsou přesné. Další informace najdete v tématu Indexy vypočítaných sloupců.

SET QUOTED_IDENTIFIER musí být zapnuté, když vytváříte nebo měníte indexy ve vypočítaných sloupcích nebo indexovaných zobrazeních. Další informace naleznete 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ý FUNKCÍ PERSISTED.

DROP NOT FOR REPLICATION

platí pro: SQL Server (SQL Server 2008 (10.0.x) a novější) 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.

ŘÍDKÝ

Označuje, že sloupec je řídký sloupec. Úložiště řídkých sloupců je optimalizované pro hodnoty null. Řídké sloupce nemůžete nastavit jako HODNOTU 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. K uvolnění úspory místa možná budete muset použít klauzuli REBUILD. Další omezení a další informace o řídkých sloupcích najdete v tématu Použití řídkých sloupců.

ADD MASKED WITH ( FUNCTION = ' mask_function ')

platí pro: SQL Server (SQL Server 2016 (13.x) a novější) 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 oprávnění ALTER ANY MASK.

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

Přidání a odstranění masky vyžaduje OPRÁVNĚNÍ ALTER ANY MASK.

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

platí pro: SQL Server (SQL Server 2016 (13.x) a novější) 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 VYPNUTÁ. 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í operace ALTER COLUMN, která 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 provést operaci změny sloupce.

  • Zatímco je online operace alter column spuštěna, všechny operace, které by mohly záviset na sloupci (index, zobrazení atd.) blokují nebo selžou 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 HODNOTY NOT NULL na NULL není podporována jako online operace, pokud se na změněný sloupec odkazuje neclusterované indexy.
  • Funkce ALTER online není podporována, pokud je sloupec odkazován omezením kontroly a operace ALTER omezuje přesnost sloupce (číselná hodnota nebo datum a čas).
  • Možnost WAIT_AT_LOW_PRIORITY nelze použít s online změnou sloupce.
  • ALTER COLUMN ... ADD/DROP PERSISTED se nepodporuje pro online změnu sloupce.
  • ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION není ovlivněný sloupcem online změn.
  • Online alter column nepodporuje změnu tabulky, kde je povolené sledování změn nebo které je vydavatelem replikace sloučení.
  • Online alter column nepodporuje změny datových typů CLR nebo 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 nezmenšuje omezení, kdy je možné sloupec změnit. Odkazy podle indexů a statistik atd. můžou způsobit selhání změny.
  • Online alter column nepodporuje souběžné změny více než jednoho sloupce.
  • Sloupec online změn nemá žádný vliv na dočasnou tabulku s verzí systému. Sloupec ALTER se nespustí jako online bez ohledu na to, jakou hodnotu jste zadali pro možnost ONLINE.

Online alter column má podobné požadavky, omezení a funkce jako online opětovné sestavení 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 jsou data v tabulce nebo nejsou ověřená proti nově přidanému nebo znovu povolenému omezení CIZÍ KLÍČ nebo CHECK. Pokud nezadáte, předpokládá se u nových omezení funkce WITH CHECK a u znovu povolených omezení se předpokládá použití FUNKCE NOCHECK.

Pokud nechcete ověřovat nová omezení CHECK nebo FOREIGN KEY u existujících dat, použijte FUNKCI NOCHECK. Nedoporučujeme to dělat, s výjimkou výjimečných případů. Nové omezení se vyhodnotí ve všech pozdějších aktualizacích dat. Všechna porušení omezení potlačovaná pomocí funkce 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í definovaná nástrojem NOCHECK. Tato omezení se ignorují, dokud nebudou povolena pomocí ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL. Další informace naleznete v tématu Zakázat omezení cizího klíče 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 ... FUNKCE ADD/DROP/ALTER INDEX je podporována pouze pro tabulky optimalizované pro paměť.

Důležitý

Bez použití příkazu ALTER TABLE příkazy CREATE INDEX, DROP INDEX, ALTER INDEXa PAD_INDEX nejsou podporovány pro indexy v tabulkách optimalizovaných pro paměť.

PŘIDAT

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.

Poznámka

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

Důležitý

Bez použití příkazu ALTER TABLE příkazy CREATE INDEX, DROP INDEX, ALTER INDEXa PAD_INDEX nejsou podporovány pro indexy v tabulkách optimalizovaných pro paměť.

OBDOBÍ PRO SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )

platí pro: SQL Server (SQL Server 2017 (14.x) a novější) 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ý. Můžete zadat existující sloupce nebo vytvořit nové sloupce jako součást argumentu ADD PERIOD FOR SYSTEM_TIME argument. Nastavte sloupce s datovým typem datetime2 a definujte je jako NOT NULL. Pokud definujete sloupec tečky jako NULL, zobrazí se chybová zpráva. Můžete definovat column_constraint nebo Zadat výchozí hodnoty pro sloupce pro system_start_time a system_end_time sloupce. 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 použijte s argumentem SET SYSTEM_VERSIONING k vytvoření existující tabulky jako dočasné tabulky. Další informace najdete v tématu dočasné tabulky a Začínáme s dočasnými tabulkami ve službě Azure SQL Database.

Od SQL Serveru 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> nevracela 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.

KAPKA

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.

Poznámka

Sloupce vynechané v tabulkách registru jsou odstraněny pouze obnovitelné odstranění. Vynechaný sloupec zůstane v tabulce registru, ale je označený jako vynechaný sloupec nastavením sloupce dropped_ledger_table v sys.tables na 1. 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.

Omezení PRIMÁRNÍHO KLÍČE nelze vynechat, pokud v tabulce existuje index XML.

INDEX index_name

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

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

Důležitý

Bez použití příkazu ALTER TABLE příkazy CREATE INDEX, DROP INDEX, ALTER INDEXa PAD_INDEX nejsou podporovány pro indexy v tabulkách optimalizovaných 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 omezení CHECK, FOREIGN KEY, UNIQUE nebo PRIMARY KEY.
  • Přidruženo k výchozímu, které je definováno s výchozím klíčovým slovem DEFAULT nebo vázáno na výchozí objekt.
  • Svázané s pravidlem

Poznámka

Vyřazení sloupce neodebere místo na disku sloupce. Pokud je velikost řádku tabulky blízko 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. Informace o dopadu vyřazení datových typů LOB naleznete v tomto blogový záznam CSS.

OBDOBÍ PRO SYSTEM_TIME

platí pro: SQL Server (SQL Server 2016 (13.x) a novější) a Azure SQL Database.

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

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

platí pro: SQL Server (SQL Server 2008 (10.0.x) a novější) a Azure SQL Database.

Přepíše maximální stupeň paralelismu možnost konfigurace pouze po dobu trvání operace. Další informace najdete v tématu Konfigurace maximálního stupně paralelismu Možnosti konfigurace serveru.

Pomocí možnosti MAXDOP 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 operací paralelního indexu.

Poznámka

Paralelní operace indexu nejsou k dispozici v každé edici SQL Serveru. Další informace naleznete v tématu Edice 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 VYPNUTÁ. Funkci REBUILD můžete spustit jako operaci ONLINE.

NA
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. Při vytváření indexu v místní dočasné tabulce není možné nastavit hodnotu ON.ONLINE. Je povolena pouze operace opětovného sestavení haldy s jedním vláknem.

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

PRYČ
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 jsou příkazy SELECT. Operace opětovného sestavení haldy s více vlákny jsou povolené.

Další informace najdete v tématu Fungování operací indexu online.

Poznámka

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

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

platí pro: SQL Server (SQL Server 2008 (10.0.x) a novější) 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.

Poznámka

V tomto kontextu není výchozí klíčové slovo. Jedná se o identifikátor výchozí skupiny souborů a musí být oddělený, stejně jako v příkazu MOVE TO "výchozí" nebo MOVE TO [výchozí]. Pokud je zadán "výchozí", musí být pro aktuální relaci zapnutá možnost QUOTED_IDENTIFIER. Toto je výchozí nastavení. Další informace naleznete v tématu SET QUOTED_IDENTIFIER.

{ CHECK | NOCHECK } CONSTRAINT

Určuje, že constraint_name je povolená nebo zakázaná. Tuto možnost lze použít pouze s omezeními CIZÍ KLÍČ a CHECK. Pokud je zadána funkce NOCHECK, omezení se zakáže a budoucí vložení nebo aktualizace sloupce nebudou ověřeny proti podmínkám omezení. Výchozí omezení, PRIMÁRNÍ KLÍČ a UNIQUE nelze zakázat.

VŠICHNI
Určuje, že všechna omezení jsou zakázána pomocí možnosti NOCHECK nebo povolena s možností CHECK.

{ 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 se však příkazy INSERT, UPDATE nebo DELETE spustí v tabulce, akce v triggeru se neprovedou, dokud se aktivační událost znovu nepovolí.

VŠICHNI
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 | DISABLE } CHANGE_TRACKING

platí pro: SQL Server (SQL Server 2008 (10.0.x) a novější) 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 naleznete v tématu ALTER DATABASE SET Options.

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

WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )

platí pro: SQL Server (SQL Server 2008 (10.0.x) a novější) a Azure SQL Database.

Určuje, zda byly aktualizovány stopy databázového stroje, které změnily sledované sloupce. Výchozí hodnota je VYPNUTÁ.

SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name. ] target_table [ ODDÍL target_partition_number_expression ]

platí pro: SQL Server (SQL Server 2008 (10.0.x) a novější) 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.

Informace o 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 Serverem 2016 (13.x) a pro SQL Database před verzí V12. Před spuštěním jakýchkoli operací PARTITION je nutné znovu sestavit neclusterované indexy columnstore do aktuálního formátu (který je aktualizovatelný).

omezení

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

platí pro: SQL Server (SQL Server 2008 (10.0.x) a novější). Azure SQL Database nepodporuje FILESTREAM.

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

ALTER TABLE s klauzulí SET FILESTREAM_ON uspěje pouze v případě, že tabulka neobsahuje žádné sloupce FILESTREAM. Sloupce FILESTREAM můžete přidat pomocí druhého příkazu ALTER TABLE.

Pokud zadáte partition_scheme_name, použijí se pravidla pro CREATE TABLE. 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 PŘÍKAZU ALTER DATABASE nebo chybových výsledků.

"výchozí" určuje filegroup FILESTREAM s nastavenou vlastností DEFAULT. Pokud neexistuje žádná skupina souborů FILESTREAM, dojde k chybě.

"NULL" určuje, že všechny odkazy na filegroups filegroups pro tabulku jsou odebrány. Nejprve je nutné vynechat všechny sloupce FILESTREAM. Pomocí příkazu SET FILESTREAM_ON = "NULL" odstraňte všechna data FILESTREAM přidružená k tabulce.

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

platí pro: SQL Server (SQL Server 2016 (13.x) a novější) 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á historii každého záznamu v tabulce se systémovou verzí v samostatné tabulce historie. Pokud se argument HISTORY_TABLE nepoužívá, název této tabulky historie bude 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 tématu dočasné tabulky.

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

platí pro: 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

platí pro: Azure SQL Edge pouze

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.

  • Rande
  • DateTime
  • DateTime2
  • SmallDateTime
  • DateTimeOffset

RETENTION_PERIOD = { INFINITE | číslo {DEN | DNY | TÝDEN | TÝDNY | MĚSÍC | MĚSÍCE | ROK | ROKY }}
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 } )

platí pro: SQL Server (SQL Server 2008 (10.0.x) a novější) a Azure SQL Database.

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

AUTO
Tato možnost umožňuje databázovému stroji SQL Serveru vybrat členitost eskalace zámku, která je vhodná pro schéma tabulky.

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

STŮL
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.

VYPNOUT
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, databázový stroj musí kvůli ochraně integrity dat vzít zámek tabulky.

PŘESTAVĚT

Pomocí syntaxe REBUILD WITH znovu sestavte celou tabulku včetně všech oddílů v dělené tabulce. Pokud tabulka obsahuje clusterovaný index, možnost REBUILD znovu sestaví clusterovaný index. FUNKCI REBUILD lze spustit jako online operaci.

Pomocí syntaxe REBUILD PARTITION znovu sestavte jeden oddíl v dělené tabulce.

PARTITION = ALL

platí pro: SQL Server (SQL Server 2008 (10.0.x) a novější) a Azure SQL Database.

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

REBUILD WITH ( <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 není zadané konkrétní nastavení komprese pomocí operace REBUILD, 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.

DATA_COMPRESSION

platí pro: SQL Server (SQL Server 2008 (10.0.x) a novější) 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í:

Žádná tabulka nebo zadané oddíly nejsou komprimované. Tato možnost se nevztahuje na tabulky columnstore.

Tabulka ŘÁDKŮ nebo zadané oddíly jsou komprimovány pomocí komprese řádků. Tato možnost se nevztahuje na tabulky columnstore.

Tabulka PAGE nebo zadané oddíly jsou komprimovány pomocí komprese stránky. Tato možnost se nevztahuje na tabulky columnstore.

COLUMNSTORE
platí pro: SQL Server (SQL Server 2014 (12.x) a novější) a Azure SQL Database.

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

COLUMNSTORE_ARCHIVE
platí pro: SQL Server (SQL Server 2014 (12.x) a novější) 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í pro databázi SQL v Microsoft Fabric povolená.

XML_COMPRESSION

platí pro: 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í:

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

PRYČ
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 VYPNUTÁ. Funkci REBUILD můžete spustit jako operaci ONLINE.

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

Poznámka

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

PRYČ
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 XML COLUMN_SET FOR ALL_SPARSE_COLUMNS

platí pro: SQL Server (SQL Server 2008 (10.0.x) a novější) 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 | DISABLE } FILETABLE_NAMESPACE

platí pro: SQL Server (SQL Server 2012 (11.x) a novější).

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

SET ( FILETABLE_DIRECTORY = directory_name )

platí pro: SQL Server (SQL Server 2012 (11.x) a novější). 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

platí pro: SQL Server (SQL Server 2017 (14.x) a novější).

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

Důležitý

Funkce Stretch Database je v SQL Serveru 2022 (16.x) a Azure SQL Database zastaralá. Tato funkce bude odebrána v budoucí verzi databázového stroje. 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.

požadavky. 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.

oprávnění. Povolení funkce Stretch pro databázi nebo tabulku vyžaduje db_owner oprávnění. Povolení funkce Stretch pro tabulku také vyžaduje oprávnění ALTER v 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 na 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 Serveru 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, můžete ji odstranit pomocí webu Azure Portal.

[ FILTER_PREDICATE = { null | predikát } ]

platí pro: SQL Server (SQL Server 2017 (14.x) a novější).

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.

Důležitý

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 }

platí pro: SQL Server (SQL Server 2017 (14.x) a novější).

WAIT_AT_LOW_PRIORITY

platí pro: SQL Server (SQL Server 2014 (12.x) a novější) a Azure SQL Database.

Opětovné sestavení online indexu musí čekat na blokující operace v této tabulce. WAIT_AT_LOW_PRIORITY indikuje, že operace opětovného sestavení online indexu čeká na zámky s nízkou prioritou, což umožňuje provádění dalších operací během čekání operace sestavení online indexu. Vynechání možnosti WAIT AT LOW PRIORITY je stejná jako WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).

MAX_DURATION = čas [MINUTES ]
platí pro: SQL Server (SQL Server 2014 (12.x) a novější) a Azure SQL Database.

Doba čekání, což je celočíselná hodnota zadaná v minutách, že SWITCH nebo online index opětovné sestavení čeká při spuštění příkazu DDL s nízkou prioritou. Pokud je operace zablokovaná pro MAX_DURATION čas, 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 } ]

platí pro: SQL Server (SQL Server 2014 (12.x) a novější) a Azure SQL Database.

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


Ukončete operaci SWITCH nebo online opětovné sestavení indexu DDL, která se právě spouští bez provedení jakékoli akce.

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

Vyžaduje OPRÁVNĚNÍ ALTER ANY CONNECTION.

POKUD EXISTUJE

platí pro: SQL Server (SQL Server 2016 (13.x) a novější) a Azure SQL Database.

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

RESUMABLE = { ON | VYPNUTO}

platí pro: SQL Server 2022 (16.x) a novější.

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 v ALTER TABLE table_constraint.

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 omezení pro přidání. Pokud není zadáno, operace pokračuje až do dokončení.

Další informace o povolení a používání operací ALTER TABLE ADD CONSTRAINT, které lze obnovit, najdete v tématu Obnovitelná tabulka přidává omezení.

Poznámky

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

Pokud jsou v mezipaměti procedur nějaké plány provádění, které odkazují na tabulku, alter TABLE označí, že se mají znovu zkompilovat při dalším spuštění.

V databázi SQL v Microsoft Fabric lze vytvořit některé funkce tabulky, ale nebudou zrcadlené do fabric OneLake. Další informace naleznete v tématu Omezení zrcadlení databáze Fabric SQL.

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. Sloupec v indexu také nemůžete definovat, pokud není sloupec varchar, nvarcharnebo varbinární datový typ a index není výsledkem omezení PRIMÁRNÍHO KLÍČE. 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 v alter TABLE implementujte okamžitě. Pokud změny vyžadují úpravy řádků v tabulce, příkaz ALTER TABLE aktualizuje řádky. ALTER TABLE na tabulce získá zámek změny schématu (SCH-M), 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ý zámek SCH-M 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 Serveru, 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 příkazy ALTER TABLE se stejnou opatrností jako všechny příkazy INSERT, UPDATE nebo DELETE, které ovlivňují mnoho řádků.

platí pro Warehouse v Microsoft Fabric.

ALTER TABLE nemůže být součástí explicitní transakce.

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

Počínaje SQL Serverem 2012 (11.x) Enterprise Edition je přidání sloupce NOT NULL s výchozí hodnotou online operace, pokud je výchozí hodnota konstantou modulu runtime . To znamená, že operace je dokončena 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 rámec syntaxe ADD COLUMN 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 "Moje dočasná 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. Přidání sloupce NOT NULL s výchozí hodnotou, která není konstantou modulu runtime, se vždy spustí offline a po dobu trvání operace se získá exkluzivní 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ž skutečný sloupec není zadaný v příkazu UPDATE) nebo pokud je tabulka nebo clusterovaný index znovu sestaven.

Sloupce typu varchar(max), nvarchar(max), varbinary(max), xml, text, n text, obrázek, hierarchyid , geometry, geographynebo CLR UDTS, nejde přidat do online operace. Sloupec nejde přidat online, pokud tak učiníte, způsobí, ž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 edici SQL Server 2012 (11.x) Enterprise a novějších verzích je počet procesorů používaných ke spuštění jednoho příkazu CONSTRAINT nebo DROP (indexované indexy) ALTER TABLE ADD nebo DROP (clusterovaný index) limitu určen maximálním stupněm paralelismu možnost konfigurace a aktuální úlohy. Pokud databázový stroj zjistí, že systém je zaneprázdněn, stupeň paralelismu operace se automaticky sníží před spuštěním příkazu. Zadáním možnosti MAXDOP můžete ručně nakonfigurovat počet procesorů, které se používají ke spuštění příkazu. Další informace najdete v tématu Konfigurace maximálního stupně paralelismu Možnosti konfigurace serveru.

Dělené tabulky

Kromě provádění operací SWITCH, které zahrnují dělené tabulky, můžete pomocí příkazu ALTER TABLE změnit stav sloupců, omezení a triggerů dělené tabulky stejně jako u tabulek, které nejsou rozdělené do oddílů. Tento příkaz se ale nedá použít ke změně způsobu dělení samotné tabulky. Pokud chcete předělit dělenou tabulku, použijte ALTER PARTITION SCHEME a ALTER PARTITION FUNCTION. 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 příkazy ALTER TABLE u tabulek se zobrazeními vázaných schématem, jsou stejná jako omezení, která se aktuálně používají při úpravách tabulek pomocí jednoduchého indexu. Přidání sloupce je povolené. Odebrání nebo změna sloupce, který se účastní jakéhokoli zobrazení vázaného na schéma, ale není povolené. Pokud příkaz ALTER TABLE vyžaduje změnu sloupce použitého v zobrazení vázaném na schéma, příkaz ALTER TABLE selže a databázový stroj vyvolá chybovou zprávu. Další informace o vazbě schématu a indexovaných zobrazeních naleznete v tématu CREATE VIEW.

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í. Indexy vytvořené pomocí příkazu CREATE INDEX musí být vyřazeny pomocí funkce DROP INDEX. Použití příkazu ALTER INDEX k opětovnému sestavení indexu části definice omezení; omezení nemusí být vyřazeno a znovu přidáno pomocí ALTER TABLE.

Před odebráním sloupce je nutné odebrat všechny indexy a omezení na základě sloupce.

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 možnosti PŘESUNOUT DO. Možnost PŘESUNOUT DO má následující omezení:

  • Funkce MOVE TO není platná pro indexovaná zobrazení nebo neclusterované indexy.
  • Schéma oddílů nebo skupina souborů již musí existovat.
  • Pokud není zadán příkaz MOVE TO, tabulka se nachází ve stejném schématu oddílů nebo ve skupině souborů, jako byla definovaná pro clusterovaný index.

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

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

  • ONLINE = ZAPNUTO není platné pro clusterované indexy, které jsou také zakázané. Zakázané indexy musí být vyřazeny pomocí funkce ONLINE = VYPNUTO.
  • Současně lze vynechat pouze jeden index.
  • 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.

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

Poznámka

Možnosti uvedené v části <drop_clustered_constraint_option> se vztahují na clusterované indexy v tabulkách a nelze je použít u clusterovaných indexů v zobrazeních nebo neclusterovaných indexech.

Replikace změn schématu

Při spuštění příkazu ALTER TABLE v publikované tabulce v aplikaci SQL Server Publisher se ve výchozím nastavení tato změna rozšíří na všechny předplatitele SQL Serveru. 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

Systémové tabulky nelze povolit pro kompresi. Pokud je tabulka haldou, operace opětovného sestavení pro režim ONLINE bude jedno vlákno. Režim OFFLINE použijte 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 ovlivní 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í sloupců NTEXT

Při vyřazení sloupců pomocí zastaralého datového typu NTEXTdojde k vyčištění odstraněných dat jako serializovaná operace na všech řádcích. Vyčištění může vyžadovat velké množství času. Při vyřazení sloupce NTEXT v tabulce s velkým množstvím řádků nejprve aktualizujte sloupec NTEXT na hodnotu NULL a pak sloupec vypusťte. Tuto možnost můžete spustit s paralelními operacemi a zrychlit ji.

Online index REBUILD

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. I když 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. To může způsobit zpomalení úlohy nebo vypršení časového limitu a výrazně omezit přístup k podkladové tabulce. Možnost WAIT_AT_LOW_PRIORITY umožňuje dbA spravovat zámky S a Sch-M zámky vyžadované pro opětovné sestavení online indexu. Ve všech třechpřípadech (MAX_DURATION =n [minutes]) ch

Podpora kompatibility

Příkaz ALTER TABLE podporuje pouze názvy tabulek se dvěma částmi (schema.object). V SQL Serveru zadáním názvu tabulky pomocí následujících formátů v době kompilace selže 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.

Dovolení

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

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

Pokud jste v příkazu ALTER TABLE definovali nějaké sloupce, které mají být uživatelem definovaným typem nebo datovým typem aliasu CLR (Common Language Runtime), vyžaduje se oprávnění REFERENCE k 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í sloupce NOT NULL s výchozí hodnotou nebo přidáním sloupce identity, pokud tabulka není prázdná.

Příklady

Kategorie Doporučené prvky syntaxe
Přidání sloupců a omezení ADD * PRIMARY KEY with index options * sparse columns and column sets *
vyřazení sloupců a omezení KAPKA
změna definice sloupce změna datového typu * změna velikosti sloupce * kolace
změna definice tabulky DATA_COMPRESSION * PŘEPÍNAČ ODDÍLu * ESKALACE ZÁMKU * sledování změn
Zakázání a povolení omezení a triggerů CHECK * NO CHECK * ENABLE TRIGGER * DISABLE TRIGGER
online operace ONLINE
správy 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 nemá žádné hodnoty zadané prostřednictvím výchozí definice. V novém sloupci bude mít každý řádek NULL.

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
EXEC 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 WITH NOCHECK slouží k zabránění ověření omezení u existujících řádků 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
EXEC 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 a druhý sloupec zůstane NULL. Do druhého sloupce se pak přidá omezení DEFAULT. Pokud chcete ověřit, že se použije výchozí hodnota, vloží se do prvního sloupce další hodnota a tabulka se dotazuje.

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

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

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

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

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

F. 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 se funkce WITH VALUES nepoužívá, má každý řádek 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 NULL
CONSTRAINT AddDateDflt
DEFAULT GETDATE() WITH VALUES ;
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ří omezení PRIMÁRNÍ KLÍČ PK_TransactionHistoryArchive_TransactionID a nastaví možnosti FILLFACTOR, ONLINEa PAD_INDEX. Výsledný clusterovaný index bude mít stejný název jako omezení.

platí pro: SQL Server 2008 (10.0.x) a novější a Azure SQL Database.

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

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

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

Já. Přidání sady sloupců

Následující příklady ukazují přidání sloupce do tabulky T2. Sadu sloupců nelze přidat do tabulky, která už obsahuje řídké sloupce. Kód pro vytvoření tabulky T2 je následující.

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í vyřazení sloupců 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í omezení PRIMÁRNÍHO KLÍČE s možností ONLINE nastavenou 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 potom změní tabulku, nejprve přidáním FOREIGN KEY omezení, které odkazuje na tabulku Person.Person, a potom přetažením omezení 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. Vzhledem k tomu, že sloupce obsahují data, je možné velikost sloupce zvětšit pouze. Všimněte si také, že col_a je definován v jedinečném indexu. Velikost col_a může být stále zvýšena, protože datový typ je varchar a index není výsledkem omezení PRIMÁRNÍHO KLÍČE.

-- 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 se vytvoří tabulka s výchozí kolací uživatele.

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

V dalším kroku se kolace sloupce C2 změní na Latin1_General_BIN. Datový typ je povinný, 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í Always Encrypted se zabezpečenými enklávy.

Nejprve se vytvoří tabulka bez šifrovaných sloupců.

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

Dále se sloupec C2 zašifruje šifrovacím klíčem 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. To znamená, že musí být šifrované pomocí hlavního klíče sloupce, který umožňuje výpočty enklávy.
  • Cílová instance SQL Serveru 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 hlavnímu klíči sloupce 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 budou znovu sestaveny.

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.

platí pro: SQL Server 2008 (10.0.x) a novější a Azure SQL Database.

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

platí pro: SQL Server 2008 (10.0.x) a novější a Azure SQL Database.

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í. To je užitečné pro archivaci nebo v situacích, které vyžadují méně místa a mohou si dovolit více času pro ukládání a načítání.

platí pro: SQL Server 2014 (12.x) a novější 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 možností COLUMNSTORE_ARCHIVE. Po obnovení se data budou dál komprimovat pomocí komprese columnstore, která se používá pro všechny tabulky columnstore.

platí pro: SQL Server 2014 (12.x) a novější 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á na úrovni TABLE.

platí pro: SQL Server 2008 (10.0.x) a novější 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.

platí pro: SQL Server 2008 (10.0.x) a novější a Azure SQL Database.

USE AdventureWorks;
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.

platí pro: SQL Server 2008 (10.0.x) a novější.

USE AdventureWorks;
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.

platí pro: SQL Server 2008 (10.0.x) a novější a Azure SQL Database.

USE AdventureWorks;
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 se používá s ALTER TABLE k zakázání omezení a povolení vložení, které by obvykle porušovalo omezení. CHECK CONSTRAINT omezení znovu povolí.

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

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

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

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

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

B. 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. ENABLE TRIGGER se pak použije 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 TRANSACTION
END ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (1,'Pat Smith',100001) ;
GO
-- Disable the trigger.
ALTER TABLE dbo.trig_example DISABLE TRIGGER trig1 ;
GO
-- Try an insert that would typically violate the trigger.
INSERT INTO dbo.trig_example VALUES (2,'Chuck Jones',100001) ;
GO
-- Re-enable the trigger.
ALTER TABLE dbo.trig_example ENABLE TRIGGER trig1 ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (3,'Mary Booth',100001) ;
GO

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.

platí pro: SQL Server 2014 (12.x) a novější 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 alter column

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

platí pro: SQL Server 2016 (13.x) a novější 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
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 s System-Versioned dočasnými tabulkami.

platí pro: SQL Server 2016 (13.x) a novější 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. Tento příklad používá klauzuli HIDDEN k zajištění žádného dopadu na stávající aplikace pracující s aktuální tabulkou. Používá také HISTORY_RETENTION_PERIOD, které jsou k dispozici pouze ve službě SQL Database.

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

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

B. 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. V příkladu se předpokládá, že existuje existující řešení, které používá tabulku ProjectTask a tabulku ProjectTaskHistory pro stávající řešení, která používá sloupce Changed Date a Revised Date pro období, že tyto sloupce období nepoužívají datový typ datetime2 a že tabulka ProjectTask 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 Analytický platformový systém (PDW)

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, nebudou vráceny žádné řádky.

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

B. 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
JOIN sys.indexes AS i
    ON t.object_id = i.object_id
JOIN sys.partitions AS p
    ON i.object_id = p.object_id AND i.index_id = p.index_id
JOIN  sys.partition_schemes AS s
    ON i.data_space_id = s.data_space_id
JOIN sys.partition_functions AS f
    ON s.function_id = f.function_id
LEFT JOIN sys.partition_range_values AS r
    ON f.function_id = r.function_id and r.boundary_id = p.partition_number
WHERE t.name = 'FactResellerSales' AND i.type <= 1
ORDER BY p.partition_number ;

C. 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
JOIN sys.indexes AS i
    ON t.object_id = i.object_id
JOIN sys.columns AS c
    ON t.object_id = c.object_id
JOIN sys.partition_schemes AS ps
    ON ps.data_space_id = i.data_space_id
JOIN sys.index_columns AS ic
    ON ic.object_id = i.object_id
    AND ic.index_id = i.index_id AND ic.partition_ordinal > 0
WHERE t.name = 'FactResellerSales'
AND i.type <= 1
AND c.column_id = ic.column_id ;

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

Oddíl Obsahuje data? Rozsah hranic
1 Ano OrderDate < '2004-01-01'
2 Ano '2004-01-01' <= OrderDate < '2005-01-01'
3 Ano '2005-01-01' <= OrderDate< '2006-01-01'
4 Ano '2006-01-01'<= OrderDate < '2007-01-01'
5 Ano '2007-01-01' <= OrderDate
  • Oddíl 1 (obsahuje data): Datumobjednávky < '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): Datumobjednávky < '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ý): Datumobjednávky < '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): Datumobjednávky < '2004-01-01'
  • Oddíl 2 (prázdný): 2004-01-01 <= OrderDate

Pokud chcete vyčistit tabulku 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): Datumobjednávky < '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): Datumobjednávky < '2004-01-01'
  • Oddíl 2 (prázdný): 2004-01-01 < '2005-01-01'
  • Oddíl 3 (prázdný): 2005-01-01 <= OrderDate