ALTER TABLE (Transact-SQL)ALTER TABLE (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL AzureдаХранилище данных SQL AzureдаParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Изменяет определение таблицы путем изменения, добавления или удаления столбцов и ограничений.Modifies a table definition by altering, adding, or dropping columns and constraints. Также ALTER TABLE переназначает и перестраивает секции или отключает и включает ограничения и триггеры.ALTER TABLE also reassigns and rebuilds partitions, or disables and enables constraints and triggers.

Дополнительные сведения о соглашениях о синтаксисе см. в статье Соглашения о синтаксисе в Transact-SQL.For more information about the syntax conventions, see Transact-SQL Syntax Conventions.

Важно!

Инструкция ALTER TABLE имеет разный синтаксис для таблиц на диске и таблиц, оптимизированных для памяти.The syntax for ALTER TABLE is different for disk-based tables and memory-optimized tables. Воспользуйтесь ссылками ниже, которые ведут непосредственно к описаниям соответствующих синтаксических блоков для ваших типов таблиц и соответствующим примерам:Use the following links to take you directly to the appropriate syntax block for your table types and to the appropriate syntax examples:

Синтаксис для таблиц на дискеSyntax for disk-based tables

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

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

Синтаксис для таблиц, оптимизированных для памятиSyntax for memory-optimized tables

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 ]
      | [ 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] ,
         ]
       PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )

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

    | SET
        (
            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 }
                          }
                          ]
                        )
                      ]
                  }
          )

    | <table_option>
}
[ ; ]

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

<table_option> ::=
{
    MEMORY_OPTIMIZED = ON
  | DURABILITY = {SCHEMA_ONLY | SCHEMA_AND_DATA}
  | SYSTEM_VERSIONING = ON [ ( HISTORY_TABLE = schema_name . history_table_name
        [, DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ]
}

-- Syntax for Azure SQL Data Warehouse and Analytics Platform System

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

<rebuild_option > ::=
{
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
        [ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]
}

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

АргументыArguments

database_namedatabase_name
Имя базы данных, в которой создана таблица.The name of the database in which the table was created.

schema_nameschema_name
Имя схемы, которой принадлежит таблица.The name of the schema to which the table belongs.

table_nametable_name
Имя изменяемой таблицы.The name of the table to be altered. Если такой таблицы нет в текущей базе данных или схеме, которой владеет текущий пользователь, их следует явным образом указать.If the table isn't in the current database or contained by the schema owned by the current user, you must explicitly specify the database and schema.

ALTER COLUMNALTER COLUMN
Указывает, что именованный столбец подлежит изменению.Specifies that the named column is to be changed or altered.

Не поддерживается изменение столбцов следующих типов:The modified column can't be:

  • Столбец типа данных timestamp.A column with a timestamp data type.

  • Свойство ROWGUIDCOL для таблицы.The ROWGUIDCOL for the table.

  • Вычисляемый столбец или используемый в вычисляемом столбце.A computed column or used in a computed column.

  • Используемый в статистике, созданной с помощью инструкции CREATE STATISTICS.Used in statistics generated by the CREATE STATISTICS statement. Если тип столбца отличается от varchar, nvarchar и varbinary, тип данных не изменяется.Unless the column is a varchar, nvarchar, or varbinary data type, the data type isn't changed. При этом новый размер больше старого или равен ему.And, the new size is equal to or greater than the old size. Или же для столбца добавляется возможность иметь значения NULL.Or, if the column is changed from not null to null. Во-первых, удалите статистику, используя инструкцию DROP STATISTICS.First, remove the statistics using the DROP STATISTICS statement.

    Примечание

    Статистика, автоматически сформированная оптимизатором запросов, автоматически удаляется инструкцией ALTER COLUMN.Statistics that are automatically generated by the query optimizer are automatically dropped by ALTER COLUMN.

  • Используется в ограничении PRIMARY KEY или [FOREIGN KEY] REFERENCES.Used in a PRIMARY KEY or [FOREIGN KEY] REFERENCES constraint.

  • Используется в ограничениях CHECK или UNIQUE.Used in a CHECK or UNIQUE constraint. При этом допускается изменение длины столбца изменяемой длины, используемого в ограничении CHECK или UNIQUE.But, changing the length of a variable-length column used in a CHECK or UNIQUE constraint is allowed.

  • Связано с определением по умолчанию.Associated with a default definition. Если же тип данных не изменяется, можно изменить длину, точность или масштаб столбца.However, the length, precision, or scale of a column can be changed if the data type isn't changed.

Тип данных в столбцах text, ntext и image может быть изменен только следующими способами:The data type of text, ntext, and image columns can be changed only in the following ways:

  • text на varchar(max) , nvarchar(max) или xml;text to varchar(max), nvarchar(max), or xml
  • ntext наvarchar(max) , nvarchar(max) или xml;ntext to varchar(max), nvarchar(max), or xml
  • image на varbinary(max) .image to varbinary(max)

Некоторые изменения типов данных могут повлечь за собой изменения в данных.Some data type changes may cause a change in the data. Например, преобразование столбца типа nchar или nvarchar в столбец типа char или varchar может привести к преобразованию расширенных символов.For example, changing a nchar or nvarchar column, to char or varchar, might cause the conversion of extended characters. См. описание CAST и CONVERT.For more information, see CAST and CONVERT. Снижение точности или масштаба столбца может привести к усечению данных.Reducing the precision or scale of a column can cause data truncation.

Примечание

Нельзя изменить тип данных для столбца секционированной таблицы.The data type of a column of a partitioned table can't be changed.

Нельзя изменить тип данных для столбцов, включенных в индекс, кроме столбцов с типами данных varchar, nvarchar или varbinary, если новый размер больше старого или равен ему.The data type of columns included in an index can't be changed unless the column is a varchar, nvarchar, or varbinary data type, and the new size is equal to or larger than the old size.

Для столбцов, включенных в ограничение первичного ключа, нельзя изменить условие NOT NULL на NULL.A column included in a primary key constraint, can't be changed from NOT NULL to NULL.

Если при использовании функции Always Encrypted (без безопасных анклавов) изменяемый столбец зашифрован с помощью ENCRYPTED WITH, тип данных можно изменить на совместимый (например, INT на BIGINT), но нельзя изменить параметры шифрования.When using Always Encrypted (without secure enclaves), if the column being modified is encrypted with 'ENCRYPTED WITH', you can change the datatype to a compatible datatype (such as INT to BIGINT), but you can't change any encryption settings.

При использовании функции Always Encrypted с безопасными анклавами вы можете изменять любой параметр шифрования, если используемый для защиты столбца ключ шифрования (и новый ключ шифрования столбца, если вы изменяете его) поддерживает анклавные вычисления (то есть зашифрован главными ключами столбца с поддержкой анклава).When using Always Encrypted with secure enclaves, you can change any encryption setting, if the column encryption key protecting the column (and the new column encryption key, if you're changing the key) support enclave computations (encrypted with enclave-enabled column master keys). Дополнительные сведения см. в статье Always Encrypted с безопасными анклавами.For details, see Always Encrypted with secure enclaves.

column_namecolumn_name
Имя столбца, который требуется изменить, добавить или удалить.The name of the column to be altered, added, or dropped. Длина имени column_name не может превышать 128 символов.The column_name maximum is 128 characters. Для новых столбцов, созданных с типом данных timestamp, аргумент column_name можно опустить.For new columns, you can omit column_name for columns created with a timestamp data type. Если для столбца типа timestamp не указан аргумент column_name, используется имя timestamp.The name timestamp is used if you don't specify column_name for a timestamp data type column.

[ type_schema_name .[ type_schema_name. ] type_name] type_name
Новый тип данных для изменяемого столбца либо тип данных для добавляемого столбца.The new data type for the altered column, or the data type for the added column. Значение type_name нельзя задать для существующих столбцов секционированных таблиц.You can't specify type_name for existing columns of partitioned tables. Тип type_name может иметь любое из следующих значений:type_name can be any one of the following types:

  • Системным типом данных SQL ServerSQL Server.A SQL ServerSQL Server system data type.
  • Псевдонимом типа данных, основанным на системном типе данных SQL ServerSQL Server.An alias data type based on a SQL ServerSQL Server system data type. Прежде чем использовать псевдонимы типов данных в определении таблицы, их нужно создать с помощью инструкции CREATE TYPE.You create alias data types with the CREATE TYPE statement before they can be used in a table definition.
  • Определяемый пользователем тип .NET Framework.NET Framework и схема, к которой он принадлежит.A .NET Framework.NET Framework user-defined type, and the schema to which it belongs. Прежде чем использовать пользовательские типы в определении таблицы, их нужно создать с помощью инструкции CREATE TYPE.You create user-defined types with the CREATE TYPE statement before they can be used in a table definition.

Далее приведены критерии для аргумента type_name изменяемого столбца.The following are criteria for type_name of an altered column:

  • Предыдущие типы данных должны быть неявно преобразуемыми в новый тип данных.The previous data type must be implicitly convertible to the new data type.
  • Аргумент type_name не может иметь значение timestamp.type_name can't be timestamp.
  • По умолчанию для аргумента ANSI_NULL инструкции ALTER COLUMN всегда установлено значение ON; если не указано иное, столбец может содержать значения NULL.ANSI_NULL defaults are always on for ALTER COLUMN; if not specified, the column is nullable.
  • Аргумент заполнения ANSI_PADDING для инструкции ALTER COLUMN всегда принимает значение ON.ANSI_PADDING padding is always ON for ALTER COLUMN.
  • Если изменяемый столбец является столбцом идентификаторов, то аргумент new_data_type должен иметь тип данных, который поддерживает свойство идентификатора.If the modified column is an identity column, new_data_type must be a data type that supports the identity property.
  • Текущая установка для аргумента SET ARITHABORT пропускается.The current setting for SET ARITHABORT is ignored. Инструкция ALTER TABLE функционирует аналогично случаю, когда для аргумента ARITHABORT установлено значение ON.ALTER TABLE operates as if ARITHABORT is set to ON.

Примечание

Если предложение COLLATE не указывается, изменение типа данных для столбца приведет к изменению параметров сортировки на те, которые установлены для базы данных по умолчанию.If the COLLATE clause isn't specified, changing the data type of a column causes a collation change to the default collation of the database.

precisionprecision
Точность указанного типа данных.The precision for the specified data type. Дополнительные сведения о допустимых значениях точности см. в разделе Точность, масштаб и длина.For more information about valid precision values, see Precision, Scale, and Length.

масштабscale
Масштаб указанного типа данных.The scale for the specified data type. Дополнительные сведения о допустимых значениях масштаба см. в разделе Точность, масштаб и длина.For more information about valid scale values, see Precision, Scale, and Length.

maxmax
Применяется только к типам данных varchar, nvarchar и varbinary для хранения 2^31-1 байт символьных, двоичных данных и данных в Юникоде.Applies only to the varchar, nvarchar, and varbinary data types for storing 2^31-1 bytes of character, binary data, and of Unicode data.

xml_schema_collectionxml_schema_collection
Применимо к: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Применяется только к данным типа xml для связывания схемы XML с этим типом.Applies only to the xml data type for associating an XML schema with the type. Прежде чем включать столбец xml в коллекцию схемы, необходимо создать коллекцию схемы в базе данных с помощью инструкции CREATE XML SCHEMA COLLECTION.Before typing an xml column to a schema collection, you first create the schema collection in the database by using CREATE XML SCHEMA COLLECTION.

COLLATE < collation_name >COLLATE < collation_name >
Задает новые параметры сортировки для изменяемого столбца.Specifies the new collation for the altered column. Если не указано, столбцу назначаются параметры сортировки, принятые в базе данных по умолчанию.If not specified, the column is assigned the default collation of the database. Именем параметров сортировки может быть либо имя параметров сортировки Windows, либо имя параметров сортировки SQL.Collation name can be either a Windows collation name or a SQL collation name. Список и дополнительные сведения см. в статьях Имя параметра сортировки Windows (Transact-SQL) и Имя параметра сортировки SQL Server (Transact-SQL).For a list and more information, see Windows Collation Name and SQL Server Collation Name.

Предложение COLLATE изменяет параметры сортировки только для столбцов с типами данных char, varchar, nchar и nvarchar.The COLLATE clause changes the collations only of columns of the char, varchar, nchar, and nvarchar data types. Чтобы изменить параметры сортировки для столбца с пользовательским псевдонимом типа данных, с помощью отдельных инструкций ALTER TABLE преобразуйте этот столбец в системный тип данных SQL ServerSQL Server.To change the collation of a user-defined alias data type column, use separate ALTER TABLE statements to change the column to a SQL ServerSQL Server system data type. Затем измените параметры сортировки и снова преобразуйте столбец в прежний тип данных.Then, change its collation and change the column back to an alias data type.

Инструкция ALTER COLUMN не может изменить параметры сортировки, если выполняется одно или несколько из следующих условий:ALTER COLUMN can't have a collation change if one or more of the following conditions exist:

  • Если на изменяемый столбец ссылается ограничение CHECK, ограничение FOREIGN KEY или вычисляемые столбцы.If a CHECK constraint, FOREIGN KEY constraint, or computed columns reference the column changed.
  • Если на базе столбца создан какой-нибудь индекс, статистика или полнотекстовый индекс.If any index, statistics, or full-text index are created on the column. Статистика, автоматически созданная на базе изменяемого столбца, удаляется, если изменяются параметры сортировки столбца.Statistics created automatically on the column changed are dropped if the column collation is changed.
  • Если связанное со схемой представление или функция ссылаются на столбец.If a schema-bound view or function references the column.

Дополнительные сведения см. в описании COLLATE.For more information, see COLLATE.

NULL | NOT NULLNULL | NOT NULL
Указывает, может ли столбец принимать значения NULL.Specifies whether the column can accept null values. Столбцы, не допускающие значения NULL, могут быть добавлены инструкцией ALTER TABLE, только если для них указаны значения по умолчанию или если таблица пуста.Columns that don't allow null values are added with ALTER TABLE only if they have a default specified or if the table is empty. Ограничение NOT NULL можно указать для вычисляемых столбцов только вместе с аргументом PERSISTED.You can specify NOT NULL for computed columns only if you've also specified PERSISTED. Если новый столбец допускает значения NULL, а значение по умолчанию не задано, новый столбец получает значение NULL для каждой строки в таблице.If the new column allows null values and you don't specify a default, the new column contains a null value for each row in the table. Если новый столбец допускает значение NULL и с новым столбцом добавляется определение по умолчанию, вы можете поместить в новый столбец значения по умолчанию для каждой строки в таблице с помощью аргумента WITH VALUES.If the new column allows null values and you add a default definition with the new column, you can use WITH VALUES to store the default value in the new column for each existing row in the table.

Если новый столбец не допускает значения NULL и таблица не пуста, вместе с новым столбцом необходимо добавить определение DEFAULT.If the new column doesn't allow null values and the table isn't empty, you have to add a DEFAULT definition with the new column. В этом случае новый столбец автоматически получит значение по умолчанию для каждой существующей строки.And, the new column automatically loads with the default value in the new columns in each existing row.

Вы можете указать значение NULL в инструкции ALTER COLUMN, чтобы столбец NOT NULL мог принимать значения NULL, если он не включен в ограничения PRIMARY KEY.You can specify NULL in ALTER COLUMN to force a NOT NULL column to allow null values, except for columns in PRIMARY KEY constraints. Условие NOT NULL можно указывать в инструкции ALTER COLUMN только для тех столбцов, которые не содержат значения NULL.You can specify NOT NULL in ALTER COLUMN only if the column contains no null values. Значения NULL следует обновить, присвоив некоторые значения, прежде чем разрешить инструкцию ALTER COLUMN NOT NULL, например:The null values must be updated to some value before the ALTER COLUMN NOT NULL is allowed, for example:

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

Когда вы создаете или изменяете таблицу с помощью инструкций CREATE TABLE или ALTER TABLE, допустимость значений NULL для типа данных, указанного в определении столбца, зависит от параметров базы данных и сеанса или даже переопределяется ими.When you create or alter a table with the CREATE TABLE or ALTER TABLE statements, the database and session settings influence and possibly override the nullability of the data type that's used in a column definition. Для всех невычисляемых столбцов явно указывайте атрибут NULL или NOT NULL.Be sure that you always explicitly define a column as NULL or NOT NULL for noncomputed columns.

Добавляя столбец с пользовательским типом данных, обязательно определите для этого столбца допустимость значений NULL, как указано в соответствующем пользовательском типе данных.If you add a column with a user-defined data type, be sure to define the column with the same nullability as the user-defined data type. Кроме того, укажите значение по умолчанию для этого столбца.And, specify a default value for the column. Дополнительные сведения см. в разделе CREATE TABLE.For more information, see CREATE TABLE.

Примечание

Если в инструкции ALTER COLUMN указано значение NULL или NOT NULL, то необходимо также указать параметры new_data_type [(precision [, scale ])].If NULL or NOT NULL is specified with ALTER COLUMN, new_data_type [(precision [, scale ])] must also be specified. Если тип данных, точность или масштаб не изменялись, укажите текущие значения столбца.If the data type, precision, and scale are not changed, specify the current column values.

[ {ADD | DROP} ROWGUIDCOL ][ {ADD | DROP} ROWGUIDCOL ]
Применимо к: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Указывает, что свойство ROWGUIDCOL добавляется к указанному столбцу или удаляется из него.Specifies that the ROWGUIDCOL property is added to or dropped from the specified column. Свойство ROWGUIDCOL указывает, что данный столбец является столбцом идентификатора GUID строки.ROWGUIDCOL indicates that the column is a row GUID column. В каждой таблице только один столбец типа uniqueidentifier может иметь свойство ROWGUIDCOL.You can set only one uniqueidentifier column per table as the ROWGUIDCOL column. Кроме того, свойство ROWGUIDCOL можно присвоить только столбцу типа uniqueidentifier.And, you can only assign the ROWGUIDCOL property to a uniqueidentifier column. Вы не можете присвоить свойство ROWGUIDCOL столбцу с пользовательским типом данных.You can't assign ROWGUIDCOL to a column of a user-defined data type.

Свойство ROWGUIDCOL не обеспечивает уникальность значений, хранимых в столбце, и не формирует автоматически значения для новых строк, вставляемых в таблицу.ROWGUIDCOL doesn't enforce uniqueness of the values stored in the column and doesn't automatically generate values for new rows that are inserted into the table. Чтобы создавать уникальные значения для каждого столбца, примените функцию NEWID или NEWSEQUENTIALID в инструкции INSERT.To generate unique values for each column, either use the NEWID or NEWSEQUENTIALID function on INSERT statements. Также вы можете указать функцию NEWID или NEWSEQUENTIALID как значение по умолчанию для столбца.Or, specify the NEWID or NEWSEQUENTIALID function as the default for the column.

[ {ADD | DROP} PERSISTED ][ {ADD | DROP} PERSISTED ]
Указывает, что свойство PERSISTED добавлено к указанному столбцу или удалено из него.Specifies that the PERSISTED property is added to or dropped from the specified column. Этот столбец должен быть вычисляемым столбцом, который заполняется детерминированным выражением.The column must be a computed column that's defined with a deterministic expression. Для столбцов, указанных как PERSISTED, компонент Компонент Database EngineDatabase Engine физически хранит вычисляемые значения в таблице и обновляет значения при обновлении любого столбца, от которого зависит вычисляемый столбец.For columns specified as PERSISTED, the Компонент Database EngineDatabase Engine physically stores the computed values in the table and updates the values when any other columns on which the computed column depends are updated. Если пометить вычисляемый столбец как PERSISTED, можно создавать индексы по вычисляемым столбцам, которые заданы, являются детерминированными, но не точными выражениями.By marking a computed column as PERSISTED, you can create indexes on computed columns defined on expressions that are deterministic, but not precise. Дополнительные сведения см. в разделе Индексы вычисляемых столбцов.For more information, see Indexes on Computed Columns.

Любой вычисляемый столбец, который используется как столбец секционирования для секционированной таблицы, должен быть явно помечен с помощью атрибута PERSISTED.Any computed column that's used as a partitioning column of a partitioned table must be explicitly marked PERSISTED.

DROP NOT FOR REPLICATIONDROP NOT FOR REPLICATION
Применимо к: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Указывает, что значения в столбцах идентификаторов увеличиваются при выполнении агентами репликации операций по вставке строк.Specifies that values are incremented in identity columns when replication agents carry out insert operations. Вы можете указать это предложение, только если column_name является столбцом идентификаторов.You can specify this clause only if column_name is an identity column.

SPARSESPARSE
Указывает, что столбец является разреженным столбцом.Indicates that the column is a sparse column. Хранилище разреженных столбцов оптимизируется для значений NULL.The storage of sparse columns is optimized for null values. Разреженные столбцы не могут иметь свойство NOT NULL.You can't set sparse columns as NOT NULL. При преобразовании столбцов из разреженных в неразреженные или наоборот таблица блокируется на время выполнения этой команды.Converting a column from sparse to nonsparse or from nonsparse to sparse, locks the table for the duration of the command execution. Возможно, потребуется использование предложения REBUILD для освобождения пространства.You may need to use the REBUILD clause to reclaim any space savings. Дополнительные ограничения и сведения о разреженных столбцах см. в разделе Разреженные столбцы.For additional restrictions and more information about sparse columns, see Use Sparse Columns.

ADD MASKED WITH ( FUNCTION = ' mask_function ')ADD MASKED WITH ( FUNCTION = ' mask_function ')
Применимо к: SQL ServerSQL ServerSQL Server 2016 (13.x)SQL Server 2016 (13.x) по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Указывает маску для динамического маскирования данных.Specifies a dynamic data mask. mask_function — это имя функции маскирования с соответствующими параметрами.mask_function is the name of the masking function with the appropriate parameters. Доступны три функции:Three functions are available:

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

Чтобы удалить маску, используйте DROP MASKED.To drop a mask, use DROP MASKED. Параметры функции см. в разделе Динамическое маскирование данных.For function parameters, see Dynamic Data Masking.

WITH ( ONLINE = ON | OFF) <применительно к изменению столбца>WITH ( ONLINE = ON | OFF) <as applies to altering a column>
Применимо к: SQL ServerSQL ServerSQL Server 2016 (13.x)SQL Server 2016 (13.x) по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Позволяет выполнять разные действия по изменению столбцов с сохранением доступности таблицы.Allows many alter column actions to be carried out while the table remains available. По умолчанию — OFF.Default is OFF. Изменение столбцов можно выполнять в оперативном режиме, если эти изменения связаны с типом данных, длиной или точностью столбцов, допустимостью значений NULL, разреженностью и параметрами сортировки.You can run alter column online for column changes related to data type, column length or precision, nullability, sparseness, and collation.

Изменение столбцов в оперативном режиме позволяет использовать изменяемые столбцы в пользовательской и автоматической статистике на всем протяжении операции ALTER COLUMN, то есть не влияет на обычный режим выполнения запросов.Online alter column allows user created and autostatistics to reference the altered column for the duration of the ALTER COLUMN operation, which allows queries to run as usual. В конце операции автоматическая статистика, которая ссылается на эти столбцы, удаляется, а созданная пользователем статистика становится недействительной.At the end of the operation, autostats that reference the column are dropped and user-created stats are invalidated. Пользователь должен вручную обновить созданную пользователем статистику после завершения операции.The user must manually update user-generated statistics after the operation is completed. Если столбцы являются частью выражения фильтра для статистических данных или индексов, изменить такие столбцы нельзя.If the column is part of a filter expression for any statistics or indexes then you can't perform an alter column operation.

  • Во время изменения столбцов в оперативном режиме все операции, имеющие зависимость от этих столбцов (индексирование, представления и т. д.), будут блокироваться или завершаться с соответствующей ошибкой.While the online alter column operation is running, all operations that could take a dependency on the column (index, views, and so on.) block or fail with an appropriate error. Такое поведение гарантирует, что изменение столбцов в оперативном режиме не завершится сбоем из-за появления новых зависимостей во время выполнения этой операции.This behavior guarantees that online alter column won't fail because of dependencies introduced while the operation was running.
  • Изменение для столбцов свойства NOT NULL на NULL в оперативном режиме не поддерживается, если изменяемые столбцы используются в некластеризованных индексах.Altering a column from NOT NULL to NULL isn't supported as an online operation when the altered column is referenced by nonclustered indexes.
  • Изменение в оперативном режиме не поддерживается для столбцов, которые указаны в ограничении CHECK, если такая операция изменения ограничит точность этих столбцов (содержащего число или дату и время).Online alter isn't supported when the column is referenced by a check constraint and the alter operation is restricting the precision of the column (numeric or datetime).
  • При изменении столбцов в оперативном режиме нельзя использовать параметр WAIT_AT_LOW_PRIORITY.The WAIT_AT_LOW_PRIORITY option can't be used with online alter column.
  • При изменении столбцов в оперативном режиме ALTER COLUMN ... ADD/DROP PERSISTED не поддерживается.ALTER COLUMN ... ADD/DROP PERSISTED isn't supported for online alter column.
  • Изменение столбцов в оперативном режиме не влияет на ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION.ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION isn't affected by online alter column.
  • Изменение столбцов в оперативном режиме не позволяет изменить таблицу, для которой включено отслеживание изменений или которая является издателем репликации слиянием.Online alter column doesn't support altering a table where change tracking is enabled or that's a publisher of merge replication.
  • Изменение столбцов в оперативном режиме не поддерживает изменение типа данных CLR на другой тип данных, или наоборот.Online alter column doesn't support altering from or to CLR data types.
  • Изменение столбцов в оперативном режиме не поддерживает изменение на тип данных XML, у которого коллекция схем отличается от текущей коллекции схем.Online alter column doesn't support altering to an XML data type that has a schema collection different than the current schema collection.
  • Изменение столбцов в оперативном режиме не снижает другие ограничения, существующие для этой операции.Online alter column doesn't reduce the restrictions on when a column can be altered. Ссылки из индексов, статистических данных и т. п. могут привести к сбою изменения.References by index/stats, and so on, might cause the alter to fail.
  • Изменение в оперативном режиме для нескольких столбцов одновременно не поддерживается.Online alter column doesn't support altering more than one column concurrently.
  • Изменение столбцов в оперативном режиме никак не влияет на темпоральные таблицы с системным управлением версиями.Online alter column has no effect in a system-versioned temporal table. Операция ALTER COLUMN никогда не выполняется в оперативном режиме, независимо от значения параметра ONLINE.ALTER column isn't run as online regardless of which value was specified for ONLINE option.

Для изменения столбцов в оперативном режиме действуют такие же ограничения и функции, что и для перестроения индекса в оперативном режиме. Среди прочего, сюда относится следующее:Online alter column has similar requirements, restrictions, and functionality as online index rebuild, which includes:

  • Перестроение индекса в оперативном режиме не поддерживается, если таблица содержит устаревшие столбцы с типом LOB или FILESTREAM или имеет индекс columnstore.Online index rebuild isn't supported when the table contains legacy LOB or filestream columns or when the table has a columnstore index. Эти же ограничения действуют при изменении столбца в режиме «в сети».The same limitations apply for online alter column.
  • Для изменения существующих столбцов требуется удвоенный объем выделенного пространства — для исходного столбца и для создаваемого скрытого столбца.An existing column being altered requires twice the space allocation, for the original column and for the newly created hidden column.
  • Стратегия блокировки во время операции изменения столбца в режиме «в сети» использует ту же модель блокировки, что и при перестроении индекса в режиме «в сети».The locking strategy during an alter column online operation follows the same locking pattern used for online index build.

WITH CHECK | WITH NOCHECKWITH CHECK | WITH NOCHECK
Указывает, удовлетворяют ли данные в таблице недавно добавленному или повторно включенному ограничению FOREIGN KEY или CHECK.Specifies whether the data in the table is or isn't validated against a newly added or re-enabled FOREIGN KEY or CHECK constraint. Если не указано иное, для новых ограничений предполагается условие WITH CHECK, а для повторно включенных ограничений — WITH NOCHECK.If you don't specify, WITH CHECK is assumed for new constraints, and WITH NOCHECK is assumed for re-enabled constraints.

Если вам не нужна проверка существующих данных по новым ограничениям CHECK или FOREIGN KEY, укажите WITH NOCHECK.If you don't want to verify new CHECK or FOREIGN KEY constraints against existing data, use WITH NOCHECK. Мы не рекомендуем применять этот вариант, за некоторыми редкими исключениями.We don't recommend doing this, except in rare cases. Новое ограничение всегда проверяется при любых последующих обновлениях данных.The new constraint is evaluated in all later data updates. Любые нарушения ограничения, подавленные условием WITH NOCHECK во время добавления ограничения, могут привести к сбою будущих обновлений, если новые значения строк не соответствуют этому ограничению.Any constraint violations that are suppressed by WITH NOCHECK when the constraint is added may cause future updates to fail if they update rows with data that doesn't follow the constraint.

Примечание

Оптимизатор запросов не рассматривает ограничения, для которых определено условие WITH NOCHECK.The query optimizer doesn't consider constraints that are defined WITH NOCHECK. Такие ограничения не учитываются до тех пор, пока они не будут повторно включены инструкцией ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL.Such constraints are ignored until they are re-enabled by using ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL.

ALTER INDEX index_nameALTER INDEX index_name
Указывает, что число контейнеров для index_name должно быть изменено.Specifies that the bucket count for index_name is to be changed or altered.

Синтаксис инструкции ALTER TABLE ADD/DROP/ALTER INDEX поддерживается только для таблиц, оптимизированных для памяти.The syntax ALTER TABLE ... ADD/DROP/ALTER INDEX is supported only for memory-optimized tables.

Важно!

Инструкции CREATE INDEX, DROP INDEX, ALTER INDEX и PAD_INDEX не будут работать с индексами в таблицах, оптимизированных для памяти, если не используется инструкция ALTER TABLE.Without using an ALTER TABLE statement, the statements CREATE INDEX, DROP INDEX, ALTER INDEX, and PAD_INDEX are not supported for indexes on memory-optimized tables.

ADDADD
Указывает, что добавляется одно или несколько определений столбца, определений вычисляемого столбца или ограничений таблиц.Specifies that one or more column definitions, computed column definitions, or table constraints are added. Или же добавляются столбцы, которые система использует для системного управления версиями.Or, the columns that the system uses for system versioning are added. Для таблиц, оптимизированных для памяти, можно добавить индекс.For memory-optimized tables, you can add an index.

Важно!

Инструкции CREATE INDEX, DROP INDEX, ALTER INDEX и PAD_INDEX не будут работать с индексами в таблицах, оптимизированных для памяти, если не применить инструкцию ALTER TABLE.Without using an ALTER TABLE statement, the statements CREATE INDEX, DROP INDEX, ALTER INDEX, and PAD_INDEX aren't supported for indexes on memory-optimized tables.

PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )
Поддержка: SQL ServerSQL ServerSQL Server 2017 (14.x)SQL Server 2017 (14.x) до SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Указывает имена столбцов, которые система использует для обозначения периода действия записи.Specifies the names of the columns that the system uses to record the period of time for which a record is valid. Можно указать существующие столбцы или создать новые столбцы как часть аргумента ADD PERIOD FOR SYSTEM_TIME.You can specify existing columns or create new columns as part of the ADD PERIOD FOR SYSTEM_TIME argument. Настройте столбцы с типом данных datetime2 и определите для них условие NOT NULL.Set up the columns with the datatype of datetime2 and define them as NOT NULL. Если для столбца периода указать условие NULL, возвращается ошибка.If you define a period column as NULL, an error results. Вы можете определить column_constraint и (или) указать значения по умолчанию для столбцов system_start_time и system_end_time.You can define a column_constraint and/or Specify Default Values for Columns for the system_start_time and system_end_time columns. См. пример A в разделе Системное управление версиями ниже, где показано использование значения по умолчанию для столбца system_end_time.See Example A in the following System Versioning examples that demonstrates using a default value for the system_end_time column.

Используйте этот аргумент вместе с аргументом SYSTEM_VERSIONING, чтобы включить системное управление версиями для существующей таблицы.Use this argument with the SET SYSTEM_VERSIONING argument to enable system versioning on an existing table. Дополнительные сведения см. в разделах Темпоральные таблицы и Приступая к работе с темпоральными таблицами в базе данных SQL Azure.For more information, see Temporal Tables and Getting Started with Temporal Tables in Azure SQL Database.

В версии SQL Server 2017 (14.x)SQL Server 2017 (14.x) пользователи могут пометить один или оба столбца периода флагом HIDDEN, чтобы эти столбцы были неявно скрыты, и инструкция SELECT * FROM <table_name> не возвращала значения этих столбцов.As of SQL Server 2017 (14.x)SQL Server 2017 (14.x), users can mark one or both period columns with HIDDEN flag to implicitly hide these columns such that SELECT * FROM <table_name> doesn't return a value for the columns. По умолчанию столбцы периода не скрываются.By default, period columns aren't hidden. Чтобы использовать скрытые столбцы, их необходимо явно указывать во всех запросах, обращающихся к темпоральной таблице.In order to be used, hidden columns must be explicitly included in all queries that directly reference the temporal table.

DROPDROP
Указывает, что удаляется одно или несколько определений столбца, определений вычисляемого столбца или ограничений таблиц либо удаляется спецификация столбцов, которые будут использоваться для системного управления версиями.Specifies that one or more column definitions, computed column definitions, or table constraints are dropped, or to drop the specification for the columns that the system uses for system versioning.

CONSTRAINT constraint_nameCONSTRAINT constraint_name
Указывает, что из таблицы удалено ограничение constraint_name.Specifies that constraint_name is removed from the table. Может быть перечислено несколько ограничений.Multiple constraints can be listed.

Вы можете выяснить имя ограничения, присвоенное пользователем или системой, с помощью запросов к представлениям каталога sys.check_constraint, sys.default_constraints, sys.key_constraints и sys.foreign_keys.You can determine the user-defined or system-supplied name of the constraint by querying the sys.check_constraint, sys.default_constraints, sys.key_constraints, and sys.foreign_keys catalog views.

Невозможно удалить ограничение PRIMARY KEY, если для таблицы существует XML-индекс.A PRIMARY KEY constraint can't be dropped if an XML index exists on the table.

INDEX index_nameINDEX index_name
Указывает, что index_name удалено из таблицы.Specifies that index_name is removed from the table.

Синтаксис инструкции ALTER TABLE ADD/DROP/ALTER INDEX поддерживается только для таблиц, оптимизированных для памяти.The syntax ALTER TABLE ... ADD/DROP/ALTER INDEX is supported only for memory-optimized tables.

Важно!

Инструкции CREATE INDEX, DROP INDEX, ALTER INDEX и PAD_INDEX не будут работать с индексами в таблицах, оптимизированных для памяти, если не используется инструкция ALTER TABLE.Without using an ALTER TABLE statement, the statements CREATE INDEX, DROP INDEX, ALTER INDEX, and PAD_INDEX are not supported for indexes on memory-optimized tables.

COLUMN column_nameCOLUMN column_name
Указывает, что constraint_name или column_name удаляется из таблицы.Specifies that constraint_name or column_name is removed from the table. Можно перечислить несколько столбцов.Multiple columns can be listed.

Столбец невозможно удалить, если для него справедливо любое из следующих условий:A column can't be dropped when it's:

  • Используется в индексе — как ключевой столбец или как INCLUDE.Used in an index, whether as a key column or as an INCLUDE
  • используется в ограничениях CHECK, FOREIGN KEY, UNIQUE или PRIMARY KEY;Used in a CHECK, FOREIGN KEY, UNIQUE, or PRIMARY KEY constraint.
  • связан со значением по умолчанию, которое определено с ключевым словом DEFAULT или привязано к объекту по умолчанию;Associated with a default that's defined with the DEFAULT keyword, or bound to a default object.
  • привязан к правилу.Bound to a rule.

Примечание

При удалении столбца занимаемое им место на диске не освобождается.Dropping a column doesn't reclaim the disk space of the column. В том случае, если размер строк таблицы приближается к пределу или превышает его, возможен возврат места, занятого на диске удаленным столбцом.You may have to reclaim the disk space of a dropped column when the row size of a table is near, or has exceeded, its limit. Возврат пространства осуществляется путем создания кластеризованного индекса в таблице или перестроения существующего кластеризованного индекса при помощи инструкции ALTER INDEX.Reclaim space by creating a clustered index on the table or rebuilding an existing clustered index by using ALTER INDEX. Дополнительные сведения о последствиях удаления типов данных больших двоичных объектов см. в этой записи в блоге CSS.For information about the impact of dropping LOB data types, see this CSS blog entry.

PERIOD FOR SYSTEM_TIMEPERIOD FOR SYSTEM_TIME
Применимо к: SQL ServerSQL ServerSQL Server 2016 (13.x)SQL Server 2016 (13.x) по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Удаляет спецификацию для столбцов, которые будут использоваться для системного управления версиями.Drops the specification for the columns that the system will use for system versioning.

WITH <drop_clustered_constraint_option>WITH <drop_clustered_constraint_option>
Указывает, что установлен один или несколько параметров удаления кластеризованного ограничения.Specifies that one or more drop clustered constraint options are set.

MAXDOP = max_degree_of_parallelismMAXDOP = max_degree_of_parallelism
Применимо к: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Переопределяет параметр конфигурации max degree of parallelism только на время выполнения операции.Overrides the max degree of parallelism configuration option only for the duration of the operation. Дополнительные сведения см. в разделе Настройка параметра конфигурации сервера max degree of parallelism.For more information, see Configure the max degree of parallelism Server Configuration Option.

Используйте параметр MAXDOP для ограничения числа процессоров, применяемых при выполнении параллельных планов.Use the MAXDOP option to limit the number of processors used in parallel plan execution. Максимальное число процессоров — 64.The maximum is 64 processors.

max_degree_of_parallelism может принимать одно из следующих значений:max_degree_of_parallelism can be one of the following values:

11
Подавляет формирование параллельных планов.Suppresses parallel plan generation.

>1>1
Ограничивает указанным значением максимальное число процессоров, используемых для параллельных операций с индексами.Restricts the maximum number of processors used in a parallel index operation to the specified number.

0 (по умолчанию)0 (default)
В зависимости от текущей рабочей нагрузки системы использует реальное или меньшее число процессоров.Uses the actual number of processors or fewer based on the current system workload.

Дополнительные сведения см. в статье Настройка параллельных операций с индексами.For more information, see Configure Parallel Index Operations.

Примечание

Параллельные операции с индексами доступны не во всех выпусках SQL ServerSQL Server.Parallel index operations aren't available in every edition of SQL ServerSQL Server. Дополнительные сведения см. в разделах Выпуски и поддерживаемые функции SQL Server 2016 и Выпуски и поддерживаемые функции SQL Server 2017.For more information, see Editions and Supported Features for SQL Server 2016, and Editions and Supported Features for SQL Server 2017.

ONLINE = { ON | OFF } <применительно к drop_clustered_constraint_option>ONLINE = { ON | OFF } <as applies to drop_clustered_constraint_option>
Определяет, будут ли базовые таблицы и связанные индексы доступны для запросов и изменения данных во время операций с индексами.Specifies whether underlying tables and associated indexes are available for queries and data modification during the index operation. Значение по умолчанию — OFF.The default is OFF. Операцию REBUILD можно выполнять в оперативном режиме (ONLINE).You can run REBUILD as an ONLINE operation.

ONON
Долгосрочные блокировки таблицы не сохраняются на время операций с индексами.Long-term table locks aren't held for the duration of the index operation. Во время главной фазы операций с индексами только блокировка с намерением совмещаемого доступа (IS) удерживается в исходной таблице.During the main phase of the index operation, only an Intent Share (IS) lock is held on the source table. Такое поведение позволит продолжить выполнение запросов или обновлений для базовых таблиц и индексов.This behavior enables queries or updates to the underlying table and indexes to continue. В начале операции на короткое время выполняется совмещаемая блокировка (S) исходного объекта.At the start of the operation, a Shared (S) lock is held on the source object for a short time. Если создается некластеризованный индекс, в конце операции на короткое время выполняется совмещаемая блокировка (S) для исходного объекта.At the end of the operation, for a short time, an S (Shared) lock is acquired on the source if a nonclustered index is being created. Если в оперативном режиме создается или удаляется кластеризованный индекс либо перестраивается кластеризованный или некластеризованный индекс, запрашивается блокировка SCH-M (изменение схемы).Or, an SCH-M (Schema Modification) lock is acquired when a clustered index is created or dropped online and when a clustered or nonclustered index is being rebuilt. При создании индекса для временной локальной таблицы параметр ONLINE не может принимать значение ON.ONLINE can't be set to ON when an index is being created on a local temporary table. Допустима только однопотоковая операция перестроения кучи.Only single-threaded heap rebuild operation is allowed.

Чтобы выполнить инструкцию DDL для операции SWITCH или перестроения индекса в оперативном режиме, должны быть завершены все активные блокирующие транзакции для соответствующей таблицы.To run the DDL for SWITCH or online index rebuild, all active blocking transactions running on a particular table must be completed. Пока выполняется операция SWITCH или перестроение индекса, блокируется запуск новых транзакций, что может существенно повлиять на пропускную способность рабочей нагрузки и временно замедлить доступ к базовой таблице.When executing, the SWITCH or rebuild operation prevents new transactions from starting and might significantly affect the workload throughput and temporarily delay access to the underlying table.

OFFOFF
Блокировки таблиц применяются на время выполнения операций с индексами.Table locks apply for the duration of the index operation. Блокировку изменения схемы (Sch-M) в таблице получает операция с индексами вне сети, которая создает, перестраивает или удаляет кластеризованный индекс либо перестраивает или удаляет некластеризованный индекс.An offline index operation that creates, rebuilds, or drops a clustered index, or rebuilds or drops a nonclustered index, acquires a Schema modification (Sch-M) lock on the table. Эта блокировка предотвращает любой доступ пользователей к базовой таблице на время операции.This lock prevents all user access to the underlying table for the duration of the operation. Операция с индексами вне сети, создающая некластеризованный индекс, получает совмещаемую блокировку (S) в таблице.An offline index operation that creates a nonclustered index acquires a Shared (S) lock on the table. Эта блокировка предотвращает обновления базовой таблицы, но разрешает операции чтения, например инструкции SELECT.This lock prevents updates to the underlying table but allows read operations, such as SELECT statements. Многопотоковые операции перестроения кучи разрешены.Multi-threaded heap rebuild operations are allowed.

Дополнительные сведения см. в разделе Об операциях с индексами в режиме "в сети".For more information, see How Online Index Operations Work.

Примечание

Операции с индексами в сети доступны не во всех выпусках SQL ServerSQL Server.Online index operations are not available in every edition of SQL ServerSQL Server. Дополнительные сведения см. в разделах Выпуски и поддерживаемые функции SQL Server 2016 и Выпуски и поддерживаемые функции SQL Server 2017.For more information, see Editions and Supported Features for SQL Server 2016, and Editions and Supported Features for SQL Server 2017.

MOVE TO { partition_scheme_name ( column_name [ 1 , ...n] ) | filegroup | " default " }MOVE TO { partition_scheme_name(column_name [ 1 , ... n] ) | filegroup | " default " }
Применимо к: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Указывает местоположение для перемещения строк данных, находящихся в настоящее время на конечном уровне кластеризованного индекса.Specifies a location to move the data rows currently in the leaf level of the clustered index. Таблица перемещается на новое место.The table is moved to the new location. Этот параметр применяется только ограничениям, образующим кластеризованный индекс.This option applies only to constraints that create a clustered index.

Примечание

В этом контексте default не является ключевым словом.In this context, default isn't a keyword. Это идентификатор файловой группы по умолчанию, и поэтому он должен быть заключен в разделители, например: MOVE TO " default " или MOVE TO [ default ] .It is an identifier for the default filegroup and must be delimited, as in MOVE TO " default " or MOVE TO [ default ]. Если указано значение " default " , то параметру QUOTED_IDENTIFIER для текущего сеанса должно быть присвоено значение ON.If " default " is specified, the QUOTED_IDENTIFIER option must be ON for the current session. Это параметр по умолчанию.This is the default setting. Дополнительные сведения см. в описании SET QUOTED_IDENTIFIER.For more information, see SET QUOTED_IDENTIFIER.

{ CHECK | NOCHECK } CONSTRAINT{ CHECK | NOCHECK } CONSTRAINT
Указывает, включено или отключено ограничение constraint_name.Specifies that constraint_name is enabled or disabled. Данный параметр может использоваться только с ограничениями FOREIGN KEY и CHECK.This option can only be used with FOREIGN KEY and CHECK constraints. Если указан параметр NOCHECK, то ограничение отключено и будущие вставки или обновления столбца не проверяются относительно условий ограничений.When NOCHECK is specified, the constraint is disabled and future inserts or updates to the column are not validated against the constraint conditions. Отключить ограничения DEFAULT, PRIMARY KEY и UNIQUE нельзя.DEFAULT, PRIMARY KEY, and UNIQUE constraints can't be disabled.

ALLALL
Указывает, что все ограничения отключаются при помощи параметра NOCHECK или включаются при помощи параметра CHECK.Specifies that all constraints are either disabled with the NOCHECK option or enabled with the CHECK option.

{ ENABLE | DISABLE } TRIGGER{ ENABLE | DISABLE } TRIGGER
Указывает, включено или отключено ограничение trigger_name.Specifies that trigger_name is enabled or disabled. Отключенный триггер остается определенным для таблицы.When a trigger is disabled, it's still defined for the table. Но действия триггера не будут выполняться при выполнении инструкций INSERT, UPDATE или DELETE для этой таблицы, пока триггер не будет снова включен.However, when INSERT, UPDATE, or DELETE statements run against the table, the actions in the trigger aren't carried out until the trigger is re-enabled.

ALLALL
Указывает, что все триггеры в таблице включены или отключены.Specifies that all triggers in the table are enabled or disabled.

trigger_nametrigger_name
Указывает имя триггера, подлежащего включению или отключению.Specifies the name of the trigger to disable or enable.

{ ENABLE | DISABLE } CHANGE_TRACKING{ ENABLE | DISABLE } CHANGE_TRACKING
Применимо к: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Указывает, разрешено или запрещено отслеживание изменений для этой таблицы.Specifies whether change tracking is enabled disabled for the table. По умолчанию отслеживание изменений запрещено.By default, change tracking is disabled.

Этот параметр доступен только в том случае, если отслеживание изменений разрешено для базы данных.This option is available only when change tracking is enabled for the database. Дополнительные сведения см. в описании параметров ALTER DATABASE SET.For more information, see ALTER DATABASE SET Options.

Чтобы разрешить отслеживание изменений, в таблице должен содержаться первичный ключ.To enable change tracking, the table must have a primary key.

WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )
Применимо к: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Указывает, отслеживает ли компонент Компонент Database EngineDatabase Engine обновления столбцов.Specifies whether the Компонент Database EngineDatabase Engine tracks, which change tracked columns were updated. Значение по умолчанию — OFF.The default value is OFF.

SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name .SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name. ] target_table [ PARTITION target_partition_number_expression ]] target_table [ PARTITION target_partition_number_expression ]
Применимо к: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Переключает блок данных одним из следующих способов.Switches a block of data in one of the following ways:

  • Переназначает все табличные данные как секцию в уже существующей секционированной таблице.Reassigns all data of a table as a partition to an already-existing partitioned table.
  • Переключает секции из одной секционированной таблицы в другую.Switches a partition from one partitioned table to another.
  • Переназначает все данные одной секции секционированной таблицы в уже существующую несекционированную таблицу.Reassigns all data in one partition of a partitioned table to an existing non-partitioned table.

Если таблица table секционирована, следует указать source_partition_number_expression.If table is a partitioned table, you must specify source_partition_number_expression. Если таблица target_table секционирована, следует указать target_partition_number_expression.If target_table is partitioned, you must specify target_partition_number_expression. Если происходит переназначение данных таблицы в секцию уже существующей секционированной таблицы или переключение секции из одной секционированной таблицы в другую, целевая секция должна существовать и быть пустой.When reassigning a table's data as a partition to an already-existing partitioned table, or switching a partition from one partitioned table to another, the target partition must exist and it must be empty.

Если происходит переназначение данных из одной секции в новую отдельную таблицу, целевая таблица должна уже существовать и быть пустой.When reassigning one partition's data to form a single table, the target table must already exist and it must be empty. Как исходные, так и целевые таблицы или секции во всех случаях должны располагаться в одной файловой группе.Both the source table or partition, and the target table or partition, must be located in the same filegroup. Соответствующие индексы или секции индексов также должны располагаться в той же файловой группе.The corresponding indexes, or index partitions, must also be located in the same filegroup. К переключаемым секциям применяются многие дополнительные ограничения.Many additional restrictions apply to switching partitions. Значения table и target_table не могут совпадать.table and target_table can't be the same. Значение target_table может быть идентификатором, состоящим из нескольких частей.target_table can be a multi-part identifier.

source_partition_number_expression и target_partition_number_expression являются константными выражениями, которые могут ссылаться на переменные и функции.source_partition_number_expression and target_partition_number_expression are constant expressions that can reference variables and functions. В их число входят переменные определяемого пользователем типа и определяемые пользователем функции.These include user-defined type variables and user-defined functions. Они не могут ссылаться на выражения Transact-SQLTransact-SQL.They can't reference Transact-SQLTransact-SQL expressions.

Секционированная таблица с кластеризованным индексом columstore ведет себя как секционированная куча.A partitioned table with a clustered columstore index behaves like a partitioned heap:

  • Первичный ключ должен содержать ключ секции.The primary key must include the partition key.
  • Уникальный индекс должен содержать ключ секции.A unique index must include the partition key. Но при этом включение ключа секции в существующий уникальный индекс может повлиять на его уникальность.But, including the partition key with an existing unique index can change the uniqueness.
  • Для переключения секций все некластеризованные индексы должны содержать ключ секции.To switch partitions, all nonclustered indexes must include the partition key.

Сведения об ограничении SWITCH при использовании репликации см. в разделе Репликация секционированных таблиц и индексов.For SWITCH restriction when using replication, see Replicate Partitioned Tables and Indexes.

Некластеризованные индексы columnstore, созданные для SQL ServerSQL Server 2016 CTP1 и для Базы данных SQL до версии 12, поддерживали формат только для чтения.Nonclustered columnstore indexes built for SQL ServerSQL Server 2016 CTP1, and for SQL Database before version V12 were in a read-only format. Перед выполнением операций PARTITION необходимо перестроить некластеризованные индексы columnstore в текущий формат (с поддержкой обновления).You must rebuild Nonclustered columnstore indexes to the current format (which is updatable) before any PARTITION operations can be run.

SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | " default " | " NULL " } )SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | " default " | " NULL " })
Применимо к: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017).Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017). База данных SQL AzureAzure SQL Database не поддерживает FILESTREAM.doesn't support FILESTREAM.

Указывает местоположения хранения данных FILESTREAM.Specifies where FILESTREAM data is stored.

Инструкция ALTER TABLE с предложением SET FILESTREAM_ON будет выполнена успешно, только если в таблице отсутствуют столбцы FILESTREAM.ALTER TABLE with the SET FILESTREAM_ON clause succeeds only if the table has no FILESTREAM columns. Чтобы добавить столбцы FILESTREAM, можно создать вторую инструкцию ALTER TABLE.You can add FILESTREAM columns by using a second ALTER TABLE statement.

Если указан аргумент partition_scheme_name, применяются правила для CREATE TABLE.If you specify partition_scheme_name, the rules for CREATE TABLE apply. Таблица должна быть уже секционирована для строк данных, а схема секционирования должна использовать те же функции секционирования и столбцы, которые используются в схеме секционирования FILESTREAM.Be sure the table is already partitioned for row data, and its partition scheme uses the same partition function and columns as the FILESTREAM partition scheme.

Аргумент filestream_filegroup_name указывает имя файловой группы FILESTREAM.filestream_filegroup_name specifies the name of a FILESTREAM filegroup. В файловой группе следует определить один файл для файловой группы с помощью инструкции CREATE DATABASE или ALTER DATABASE, иначе возникает ошибка.The filegroup must have one file that's defined for the filegroup by using a CREATE DATABASE or ALTER DATABASE statement, or an error results.

" default " указывает файловую группу FILESTREAM с заданным свойством DEFAULT." default " specifies the FILESTREAM filegroup with the DEFAULT property set. При отсутствии файловой группы FILESTREAM возникает ошибка.If there's no FILESTREAM filegroup, an error results.

Значение " NULL " указывает на удаление всех ссылок на файловые группы FILESTREAM для таблицы." NULL " specifies that all references to FILESTREAM filegroups for the table are removed. Сначала должны быть удалены все столбцы FILESTREAM.All FILESTREAM columns must be dropped first. Используйте инструкцию SET FILESTREAM_ON =" NULL " , чтобы удалить все данные FILESTREAM, связанные с таблицей.Use SET FILESTREAM_ON =" NULL " to delete all FILESTREAM data that's associated with a table.

SET ( SYSTEM_VERSIONING = { OFF | ON [ ( HISTORY_TABLE = schema_name .SET ( SYSTEM_VERSIONING = { OFF | ON [ ( HISTORY_TABLE = schema_name . history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ]) ] } )history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ]) ] } )
Применимо к: SQL ServerSQL ServerSQL Server 2016 (13.x)SQL Server 2016 (13.x) по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Отключает или включает для таблицы системное управление версиями.Either disables or enables system versioning of a table. Чтобы включить системное управление версиями в таблице, система проверяет соблюдение требований к типам данных, ограничениям допустимости значений NULL и ограничениям первичного ключа.To enable system versioning of a table, the system verifies that the datatype, nullability constraint, and primary key constraint requirements for system versioning are met. Если аргумент HISTORY_TABLE не используется, система создает новую таблицу журнала по схеме текущей таблицы, а затем создает между ними связь и настраивает сохранение в таблице журнала истории каждой записи текущей таблицы.If you don't use the HISTORY_TABLE argument, the system generates a new history table matching the schema of the current table, creates a link between the two tables, and enables the system to record the history of each record in the current table in the history table. Таблица журнала будет называться MSSQL_TemporalHistoryFor<primary_table_object_id>.The name of this history table will be MSSQL_TemporalHistoryFor<primary_table_object_id>. Если вы укажете аргумент HISTORY_TABLE, чтобы создать связь с уже существующей таблицей журнала, система создает связь между текущей таблицей и указанной в этом аргументе таблицей.If you use the HISTORY_TABLE argument to create a link to and use an existing history table, the system creates a link between the current table and the specified table. При создании связи с существующей таблицей журнала вы можете настроить проверку согласованности данных.When creating a link to an existing history table, you can choose to do a data consistency check. Проверка согласованности данных гарантирует, что существующие записи не перекрываются.This data consistency check ensures that existing records don't overlap. Выполнение проверки согласованности данных считается вариантом по умолчанию.Running the data consistency check is the default. Дополнительные сведения см. в разделе Temporal Tables.For more information, see Temporal Tables.

HISTORY_RETENTION_PERIOD = { INFINITE | number {DAY | DAYS | WEEK | WEEKS | MONTH | MONTHS | YEAR | YEARS} }HISTORY_RETENTION_PERIOD = { INFINITE | number {DAY | DAYS | WEEK | WEEKS | MONTH | MONTHS | YEAR | YEARS} }
Применимо к: SQL Server 2017 (14.x)SQL Server 2017 (14.x) и База данных SQL AzureAzure SQL Database.Applies to: SQL Server 2017 (14.x)SQL Server 2017 (14.x) and База данных SQL AzureAzure SQL Database.

Определяет ограничение срока хранения данных журнала в темпоральной таблице или отсутствие такого ограничения.Specifies finite or infinite retention for historical data in a temporal table. Если не указано, подразумевается неограниченный срок хранения.If omitted, infinite retention is assumed.

SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
Применимо к: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Указывает разрешенные методы укрупнения блокировки для таблицы.Specifies the allowed methods of lock escalation for a table.

AUTOAUTO
Этот параметр позволяет Компонент SQL Server Database EngineSQL Server Database Engine выбрать гранулярность укрупнения блокировки, подходящую для схемы конкретной таблицы.This option allows Компонент SQL Server Database EngineSQL Server Database Engine to select the lock escalation granularity that's appropriate for the table schema.

  • В секционированных таблицах допускается укрупнение блокировки до секций.If the table is partitioned, lock escalation is allowed to partition. После укрупнения блокировки до уровня секции дальнейшее укрупнение до гранулярности TABLE выполняться не будет.After the lock is escalated to the partition level, the lock won't be escalated later to TABLE granularity.
  • Если таблица не секционирована, блокировка укрупняется до гранулярности TABLE.If the table isn't partitioned, the lock escalation is done to the TABLE granularity.

TABLETABLE
Блокировка укрупняется до уровня гранулярности таблицы независимо от того, секционирована таблица или нет.Lock escalation is done at table-level granularity whether the table is partitioned or not partitioned. Значение по умолчанию равно TABLE.TABLE is the default value.

DISABLEDISABLE
В большинстве случаев предотвращает укрупнение блокировки.Prevents lock escalation in most cases. Блокировки уровня таблицы нельзя запретить полностью.Table-level locks aren't completely disallowed. Например, при сканировании таблицы, которая не имеет кластеризованного индекса на уровне изоляции SERIALIZABLE, Компонент Database EngineDatabase Engine всегда устанавливает блокировку таблицы для защиты целостности данных.For example, when you're scanning a table that has no clustered index under the serializable isolation level, Компонент Database EngineDatabase Engine must take a table lock to protect data integrity.

REBUILDREBUILD
Используйте синтаксис REBUILD WITH для перестроения всей таблицы, включая все секции в секционированную таблицу.Use the REBUILD WITH syntax to rebuild an entire table including all the partitions in a partitioned table. Если в таблице содержится кластеризованный индекс, то параметр REBUILD перестраивает его.If the table has a clustered index, the REBUILD option rebuilds the clustered index. Операция REBUILD может выполняться в рамках операции ONLINE.REBUILD can be run as an ONLINE operation.

Используйте синтаксис REBUILD PARTITION для перестроения одной секции в секционированной таблице.Use the REBUILD PARTITION syntax to rebuild a single partition in a partitioned table.

PARTITION = ALLPARTITION = ALL
Применимо к: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Перестраивает все секции при изменении настройки сжатия секций.Rebuilds all partitions when changing the partition compression settings.

REBUILD WITH ( <rebuild_option> )REBUILD WITH ( <rebuild_option> )
Все параметры применяются к таблице с кластеризованным индексом.All options apply to a table with a clustered index. Если в таблице нет кластеризованного индекса, на структуру кучи влияют не все параметры.If the table doesn't have a clustered index, the heap structure is only affected by some of the options.

Если для операции REBUILD не указан конкретный параметр сжатия, для секции используется текущий режим сжатия.When a specific compression setting isn't specified with the REBUILD operation, the current compression setting for the partition is used. Для возврата текущего параметра выполните запрос к столбцу data_compression из представления каталога sys.partitions.To return the current setting, query the data_compression column in the sys.partitions catalog view.

Полное описание параметров перестроения см. в описании index_option.For complete descriptions of the rebuild options, see index_option.

DATA_COMPRESSIONDATA_COMPRESSION
Применимо к: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Задает режим сжатия данных для указанной таблицы, номера секции или диапазона секций.Specifies the data compression option for the specified table, partition number, or range of partitions. Существуют следующие варианты выбора.The options are as follows:

NONE — таблица или указанные секции не сжимаются.NONE Table or specified partitions aren't compressed. Этот вариант не применим к таблицам columnstore.This option doesn't apply to columnstore tables.

ROW — таблицы или указанные секции сжимаются, используется сжатие строк.ROW Table or specified partitions are compressed by using row compression. Этот вариант не применим к таблицам columnstore.This option doesn't apply to columnstore tables.

PAGE — таблицы или указанные секции сжимаются, используется сжатие страниц.PAGE Table or specified partitions are compressed by using page compression. Этот вариант не применим к таблицам columnstore.This option doesn't apply to columnstore tables.

COLUMNSTORECOLUMNSTORE
Применимо к: SQL ServerSQL ServerSQL Server 2014 (12.x)SQL Server 2014 (12.x) по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Применяется только к таблицам columnstore.Applies only to columnstore tables. COLUMNSTORE указывает, что должна быть распакована секция, которая была упакована с помощью параметра COLUMNSTORE_ARCHIVE.COLUMNSTORE specifies to decompress a partition that was compressed with the COLUMNSTORE_ARCHIVE option. При восстановлении данных сохраняется режим сжатия columnstore, который используется для всех таблиц columnstore.When the data is restored, it continues to be compressed with the columnstore compression that's used for all columnstore tables.

COLUMNSTORE_ARCHIVECOLUMNSTORE_ARCHIVE
Применимо к: SQL ServerSQL ServerSQL Server 2014 (12.x)SQL Server 2014 (12.x) по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Применяется только к таблицам columnstore, представляющим собой таблицы, которые хранятся с кластеризованным индексом columnstore.Applies only to columnstore tables, which are tables stored with a clustered columnstore index. Параметр COLUMNSTORE_ARCHIVE обеспечивает дальнейшее сжатие указанной секции до еще меньшего размера.COLUMNSTORE_ARCHIVE will further compress the specified partition to a smaller size. Этот параметр можно использовать для архивации или в других ситуациях, когда требуется уменьшить объем пространства и допускается замедлять операции сохранения и извлечения.Use this option for archival or other situations that require less storage and can afford more time for storage and retrieval.

Чтобы перестроить несколько секций одновременно, воспользуйтесь описанием index_option.To rebuild multiple partitions at the same time, see index_option. Если в таблице отсутствует кластеризованный индекс, при изменении сжатия данных перестраиваются некластеризованные индексы и куча.If the table doesn't have a clustered index, changing the data compression rebuilds the heap and the nonclustered indexes. Дополнительные сведения о сжатии см. в разделе Сжатие данных.For more information about compression, see Data Compression.

ONLINE = { ON | OFF } <применительно к single_partition_rebuild_option>ONLINE = { ON | OFF } <as applies to single_partition_rebuild_option>
Определяет, доступна ли отдельная секция базовой таблицы и связанные индексы для запросов и изменения данных во время операций с индексами.Specifies whether a single partition of the underlying tables and associated indexes is available for queries and data modification during the index operation. Значение по умолчанию — OFF.The default is OFF. Операцию REBUILD можно выполнять в оперативном режиме (ONLINE).You can run REBUILD as an ONLINE operation.

ONON
Долгосрочные блокировки таблицы не сохраняются на время операций с индексами.Long-term table locks aren't held for the duration of the index operation. В начале перестройки индекса требуется S-блокировка таблицы, а в конце перестроения индекса в оперативном режиме — блокировка Sch-M.S-lock on the table is required in the beginning of the index rebuild and a Sch-M lock on the table at the end of the online index rebuild. Обе они являются короткими блокировками метаданных, но блокировка изменения схемы (Sch-M) дополнительно ожидает завершения всех блокирующих транзакций.Although both locks are short metadata locks, the Sch-M lock must wait for all blocking transactions to be completed. В этот период ожидания блокировка Sch-M блокирует все другие транзакции, которые получат доступ к этой таблице только после завершения блокировки.During the wait time,, the Sch-M lock blocks all other transactions that wait behind this lock when accessing the same table.

Примечание

Перестроение индекса в режиме "в сети" может задать параметры low_priority_lock_wait, описанные ниже в этом разделе.Online index rebuild can set the low_priority_lock_wait options described later in this section.

OFFOFF
Блокировки таблиц применяются во время выполнения операций с индексами.Table locks are applied for the duration of the index operation. Это предотвращает доступ к базовой таблице всех пользователей во время операции.This prevents all user access to the underlying table for the duration of the operation.

column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNScolumn_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
Применимо к: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Имя набора столбцов.The name of the column set. Набор столбцов представляет собой нетипизированное XML-представление, в котором все разреженные столбцы таблицы объединены в структурированные выходные данные.A column set is an untyped XML representation that combines all of the sparse columns of a table into a structured output. Набор столбцов не может быть добавлен в таблицу, если в ней содержатся разреженные столбцы.A column set can't be added to a table that contains sparse columns. Дополнительные сведения о наборах столбцов см. в разделе Использование наборов столбцов.For more information about column sets, see Use Column Sets.

{ ENABLE | DISABLE } FILETABLE_NAMESPACE{ ENABLE | DISABLE } FILETABLE_NAMESPACE
Применимо к: SQL ServerSQL ServerSQL Server 2012 (11.x)SQL Server 2012 (11.x) по SQL Server 2017SQL Server 2017).Applies to: SQL ServerSQL Server ( SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017).

Включает или выключает ограничения для таблицы FileTable, заданные системой.Enables or disables the system-defined constraints on a FileTable. Может использоваться только для таблицы FileTable.Can only be used with a FileTable.

SET ( FILETABLE_DIRECTORY = directory_name )SET ( FILETABLE_DIRECTORY = directory_name )
Применимо к: SQL ServerSQL ServerSQL Server 2012 (11.x)SQL Server 2012 (11.x) по SQL Server 2017SQL Server 2017).Applies to: SQL ServerSQL Server ) SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017. База данных SQL AzureAzure SQL Database не поддерживает FILETABLE.doesn't support FILETABLE.

Указывает имя каталога таблицы FileTable, совместимое с Windows.Specifies the Windows-compatible FileTable directory name. Это имя должно быть уникальным среди всех имен каталогов FileTable в базе данных.This name should be unique among all the FileTable directory names in the database. Проверка уникальности не учитывает регистр символов независимо от параметров сортировки SQL.Uniqueness comparison is case-insensitive, despite the SQL collation settings. Может использоваться только для таблицы FileTable.Can only be used with a FileTable.

 SET (
        REMOTE_DATA_ARCHIVE
        {
            = ON (<table_stretch_options> )
          | = OFF_WITHOUT_DATA_RECOVERY
          ( MIGRATION_STATE = PAUSED ) | ( <table_stretch_options> [, ...n] )
        } )

Область применения: SQL ServerSQL ServerSQL Server 2017 (14.x)SQL Server 2017 (14.x) по SQL Server 2017SQL Server 2017).Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through SQL Server 2017SQL Server 2017).

Включает или отключает Stretch Database для таблицы.Enables or disables Stretch Database for a table. Дополнительные сведения см. в разделе Stretch Database.For more information, see Stretch Database.

Включение Stretch Database для таблицыEnabling Stretch Database for a table

Если вы включаете Stretch для таблицы, указывая ON, также нужно указать MIGRATION_STATE = OUTBOUND, чтобы сразу же приступить к миграции данных, или MIGRATION_STATE = PAUSED, чтобы отложить миграцию.When you enable Stretch for a table by specifying ON, you also have to specify MIGRATION_STATE = OUTBOUND to begin migrating data immediately, or MIGRATION_STATE = PAUSED to postpone data migration. Значение по умолчанию — MIGRATION_STATE = OUTBOUND.The default value is MIGRATION_STATE = OUTBOUND. Более подробную информацию о включении Stretch для таблицы см. в статье Включение Stretch Database для таблицы.For more information about enabling Stretch for a table, see Enable Stretch Database for a table.

Предварительные требования.Prerequisites. Прежде чем включить Stretch для таблицы, необходимо включить Stretch на сервере и в базе данных.Before you enable Stretch for a table, you have to enable Stretch on the server and on the database. Дополнительные сведения см. в статье Включение Stretch Database для базы данных.For more information, see Enable Stretch Database for a database.

Разрешения.Permissions. Чтобы включить Stretch для таблицы или базы данных, требуются права db_owner.Enabling Stretch for a database or a table requires db_owner permissions. Чтобы включить Stretch для таблицы, нужно иметь разрешения ALTER для таблицы.Enabling Stretch for a table also requires ALTER permissions on the table.

Отключение Stretch Database для таблицыDisabling Stretch Database for a table

При отключении Stretch для таблицы у вас есть два варианта управления удаленными данными, уже перенесенными в Azure.When you disable Stretch for a table, you have two options for the remote data that's already been migrated to Azure. Дополнительные сведения см. в статье Отключение Stretch Database и возврат удаленных данных.For more information, see Disable Stretch Database and bring back remote data.

  • Чтобы отключить базу данных Stretch для таблицы и скопировать удаленные данные из Azure обратно в SQL Server, запустите следующую команду.To disable Stretch for a table and copy the remote data for the table from Azure back to SQL Server, run the following command. Эту команду нельзя отменить.This command can't be canceled.

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

Эта операция предусматривает расходы на передачу данных и не может быть отменена.This operation incurs data transfer costs, and it can't be canceled. Дополнительные сведения см. на странице сведений о ценах на передачу данных.For more information, see Data Transfers Pricing Details.

После копирования всех удаленных данных из Azure в SQL Server база данных Stretch для таблицы будет отключена.After all the remote data has been copied from Azure back to SQL Server, Stretch is disabled for the table.

  • Чтобы отключить растяжение для таблицы и отказаться от удаленных данных, выполните следующую команду.To disable Stretch for a table and abandon the remote data, run the following command.

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

Когда вы отключите Stretch Database для таблицы, перенос данных остановится, а результаты запроса больше не будут включать результаты из удаленной таблицы.After you disable Stretch Database for a table, data migration stops and query results no longer include results from the remote table.

Отключение Stretch Database не приводит к стиранию удаленной таблицы.Disabling Stretch doesn't remove the remote table. Если вам нужно стереть удаленную таблицу, воспользуйтесь порталом Azure.If you want to delete the remote table, you drop it by using the Azure portal.

[ FILTER_PREDICATE = { null | predicate } ][ FILTER_PREDICATE = { null | predicate } ]
Область применения: SQL ServerSQL ServerSQL Server 2017 (14.x)SQL Server 2017 (14.x) по SQL Server 2017SQL Server 2017).Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through SQL Server 2017SQL Server 2017).

Дополнительно указывает предикат фильтра для выбора строк для миграции из таблицы, которая содержит данные журнала и текущие данные.Optionally specifies a filter predicate to select rows to migrate from a table that contains both historical and current data. Этот предикат должен вызывать детерминированную встроенную функцию с табличным значением.The predicate must call a deterministic inline table-valued function. Дополнительные сведения см. в статьях Включение Stretch Database для таблицы и Выбор строк для миграции с использованием функции фильтров (Stretch Database).For more information, see Enable Stretch Database for a table and Select rows to migrate by using a filter function - Stretch Database.

Важно!

Если указать плохо оптимизированный предикат фильтра, перенос данных будет выполняться медленно.If you provide a filter predicate that performs poorly, data migration also performs poorly. Stretch Database применяет предикат фильтра к таблице при помощи оператора CROSS APPLY.Stretch Database applies the filter predicate to the table by using the CROSS APPLY operator.

Если предикат фильтра не указан, переносится вся таблица.If you don't specify a filter predicate, the entire table is migrated.

Если вы указываете предикат фильтра, необходимо также указать MIGRATION_STATE.When you specify a filter predicate, you also have to specify MIGRATION_STATE.

MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }
Область применения: SQL ServerSQL ServerSQL Server 2017 (14.x)SQL Server 2017 (14.x) по SQL Server 2017SQL Server 2017).Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through SQL Server 2017SQL Server 2017).

WAIT_AT_LOW_PRIORITYWAIT_AT_LOW_PRIORITY
Применимо к: SQL ServerSQL ServerSQL Server 2014 (12.x)SQL Server 2014 (12.x) по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Перестроение индекса в режиме «в сети» должно ожидать операции блокировки в этой таблице.An online index rebuild has to wait for blocking operations on this table. WAIT_AT_LOW_PRIORITY указывает, что операция перестроения индекса в оперативном режиме будет ожидать блокировки с низким приоритетом. Другие операции могут выполняться, пока операция перестроения индекса в оперативном режиме находится в состоянии ожидания.WAIT_AT_LOW_PRIORITY indicates that the online index rebuild operation waits for low-priority locks, allowing other operations to carry on while the online index build operation is waiting. Отсутствие параметра WAIT AT LOW PRIORITY эквивалентно варианту WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).Omitting the WAIT AT LOW PRIORITY option is the same as WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).

MAX_DURATION = time [MINUTES ]MAX_DURATION = time [MINUTES ]
Применимо к: SQL ServerSQL ServerSQL Server 2014 (12.x)SQL Server 2014 (12.x) по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Время ожидания (целочисленное значение в минутах), в течение которого операция SWITCH или перестроение индекса в оперативном режиме поддерживают низкоприоритетную блокировку при выполнении команды DDL.The wait time, which is an integer value specified in minutes, that the SWITCH or online index rebuild locks wait with low priority when running the DDL command. Если операция будет заблокирована на время MAX_DURATION, будет выполнено одно из действий ABORT_AFTER_WAIT.If the operation is blocked for the MAX_DURATION time, one of the ABORT_AFTER_WAIT actions will run. Время MAX_DURATION всегда указывается в минутах, поэтому слово MINUTES можно опустить.MAX_DURATION time is always in minutes, and you can omit the word MINUTES.

ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]
Применимо к: SQL ServerSQL ServerSQL Server 2014 (12.x)SQL Server 2014 (12.x) по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

NoneNONE
Продолжить ожидание блокировки с обычным приоритетом.Continue waiting for the lock with normal (regular) priority.

SELFSELF
Выход из операции SWITCH или операции DDL по перестроению индекса в оперативном режиме, которая выполняется в данный момент, без дополнительных действий.Exit the SWITCH or online index rebuild DDL operation currently being run without taking any action.

BLOCKERSBLOCKERS
Остановка всех пользовательских транзакций, которые в данный момент блокируют операцию SWITCH или операцию DDL по перестроению индекса в оперативном режиме, чтобы эта операция могла продолжить работу.Kill all user transactions that currently block the SWITCH or online index rebuild DDL operation so that the operation can continue.

Необходимо разрешение ALTER ANY CONNECTION.Requires ALTER ANY CONNECTION permission.

IF EXISTSIF EXISTS
Применимо к: SQL ServerSQL ServerSQL Server 2016 (13.x)SQL Server 2016 (13.x) по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database.

Условное удаление столбца или ограничения в том случае, если они существуют.Conditionally drops the column or constraint only if it already exists.

RemarksRemarks

Чтобы добавить новые строки данных, используйте INSERT.To add new rows of data, use INSERT. Чтобы удалить строки данных, используйте DELETE или TRUNCATE TABLE.To remove rows of data, use DELETE or TRUNCATE TABLE. Чтобы изменить значения в существующих строках, используйте UPDATE.To change the values in existing rows, use UPDATE.

При наличии в кэше процедур каких-либо планов выполнения, ссылающихся на таблицу, инструкция ALTER TABLE помечает их как подлежащие перекомпиляции в их следующем выполнении.If there are any execution plans in the procedure cache that reference the table, ALTER TABLE marks them to be recompiled on their next execution.

Изменение размера столбцаChanging the Size of a Column

Длину, точность и масштаб столбца можно изменить, указав новый размер для типа данных столбца.You can change the length, precision, or scale of a column by specifying a new size for the column data type. Используйте для этого предложение ALTER COLUMN.Use the ALTER COLUMN clause. Если в столбце содержатся данные, новый размер не может быть меньше максимального значения данных.If data exists in the column, the new size can't be smaller than the maximum size of the data. Кроме того, вы не сможете определить столбец в индексе, если его тип данных не является varchar, nvarchar или varbinary, а сам индекс не является результатом ограничения PRIMARY KEY.Also, you can't define the column in an index, unless the column is a varchar, nvarchar, or varbinary data type and the index isn't the result of a PRIMARY KEY constraint. См. пример в кратком разделе Изменение определения столбца.See the example in the short section titled Altering a Column Definition.

Блокировки и инструкция ALTER TABLELocks and ALTER TABLE

Указанные в инструкции ALTER TABLE изменения применяются немедленно.Changes you specify in ALTER TABLE implement immediately. Если для изменений требуется модификация строк таблицы, то инструкция ALTER TABLE обновляет эти строки.If the changes require modifications of the rows in the table, ALTER TABLE updates the rows. Инструкция ALTER TABLE получает для таблицы блокировку модификации схемы (SCH-M), чтобы в процессе изменения другие подключения не использовали даже метаданные этой таблицы, за исключением операций с индексами в оперативном режиме, в конце которых требуется короткая блокировка SCH-M.ALTER TABLE acquires a schema modify (SCH-M) lock on the table to make sure that no other connections reference even the metadata for the table during the change, except online index operations that require a short SCH-M lock at the end. В операции ALTER TABLE...SWITCH запрашивается блокировка и исходной, и целевой таблиц.In an ALTER TABLE...SWITCH operation, the lock is acquired on both the source and target tables. Изменения, сделанные в таблице, регистрируются в журнале и полностью обратимы.The modifications made to the table are logged and fully recoverable. Изменения, затрагивающие все строки в больших таблицах, например удаление столбца или (в некоторых выпусках SQL ServerSQL Server) добавление столбца со свойством NOT NULL и значением по умолчанию, могут занимать длительное время и создавать много записей в журнале.Changes that affect all the rows in large tables, such as dropping a column or, on some editions of SQL ServerSQL Server, adding a NOT NULL column with a default value, can take a long time to complete and generate many log records. Выполняйте такие инструкции ALTER TABLE с осторожностью, как и любые инструкции INSERT, UPDATE или DELETE, влияющие на большое количество строк.Run these ALTER TABLE statements with the same care as any INSERT, UPDATE, or DELETE statement that affects many rows.

Добавление столбцов NOT NULL в качестве операции в сетиAdding NOT NULL Columns as an Online Operation

Начиная с SQL Server 2012 (11.x)SQL Server 2012 (11.x) Enterprise Edition, добавление столбца NOT NULL со значением по умолчанию является операцией в сети, если значение по умолчанию является константой времени выполнения.Starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x) Enterprise Edition, adding a NOT NULL column with a default value is an online operation when the default value is a runtime constant. Это значит, что операция выполняется почти мгновенно, независимо от количества строк в таблице.This means that the operation is completed almost instantaneously despite the number of rows in the table. Дело в том, что существующие в таблице строки при такой операции не обновляются.Because, the existing rows in the table aren't updated during the operation. Вместо этого значение по умолчанию сохраняется в метаданных таблицы и применяется по мере необходимости в запросах, обращающихся к этим строкам.Instead, the default value is stored only in the metadata of the table and the value is looked up, as needed, in queries that access these rows. Такое поведение реализуется автоматически.This behavior is automatic. Вам не нужно использовать дополнительные предложения, кроме базового синтаксиса операции ADD COLUMN.No additional syntax is required to implement the online operation beyond the ADD COLUMN syntax. Константой времени выполнения считается любое выражение, которое сохраняет во время выполнения одинаковое значение для каждой строки в таблице, независимо от ее детерминизма.A runtime constant is an expression that produces the same value at runtime for each row in the table despite its determinism. Например, выражение константы «Временные данные» и системная функция GETUTCDATETIME() являются константами времени выполнения.For example, the constant expression "My temporary data", or the system function GETUTCDATETIME() are runtime constants. Функции NEWID() и NEWSEQUENTIALID(), напротив, не являются константами времени выполнения, так как для каждой строки в таблице создается уникальное значение.In contrast, the functions NEWID() or NEWSEQUENTIALID() aren't runtime constants, because a unique value is produced for each row in the table. Добавление столбца NOT NULL со значением по умолчанию, которое не является константой времени выполнения, всегда выполняется с прекращением работы и монопольной блокировкой (SCH-M) на весь период ее выполнения.Adding a NOT NULL column with a default value that's not a runtime constant is always run offline and an exclusive (SCH-M) lock is acquired for the duration of the operation.

Для существующих строк используется ссылка на значение, хранящееся в метаданных, но это же значение сохраняется напрямую в каждой новой строке, которая вставляется без указания значения для этого столбца.While the existing rows reference the value stored in metadata, the default value is stored on the row for any new rows that are inserted and don't specify another value for the column. Значение по умолчанию, хранящееся в метаданных, будет перемещено в существующую строку при ее обновлении (даже если в инструкции UPDATE не указан этот столбец), а также при перестроении таблицы или кластеризованного индекса.The default value stored in metadata moves to an existing row when the row is updated (even if the actual column isn't specified in the UPDATE statement), or if the table or clustered index is rebuilt.

Столбцы типов varchar(max) , nvarchar(max) , varbinary(max) , xml, text, ntext, image, hierarchyid, geometry, geography или с пользовательским типом среды CLR нельзя добавлять в оперативном режиме.Columns of type varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography, or CLR UDTS, can't be added in an online operation. Столбец нельзя добавить в оперативном режиме, если после этой операции максимально возможный размер строки превысит ограничение в 8060 байт.A column can't be added online if doing so causes the maximum possible row size to exceed the 8,060-byte limit. В этом случае столбец добавляется в рамках операции вне сети.The column is added as an offline operation in this case.

Выполнение параллельного планаParallel Plan Execution

В версии Microsoft SQL Server 2012 EnterpriseMicrosoft SQL Server 2012 Enterprise и выше количество процессоров, задействованных в выполнении одной инструкции ALTER TABLE ADD (на базе индекса) CONSTRAINT или DROP (кластеризованный индекс) CONSTRAINT, определяется по параметру конфигурации max degree of parallelism и характеристикам текущей рабочей нагрузки.In Microsoft SQL Server 2012 EnterpriseMicrosoft SQL Server 2012 Enterprise and higher, the number of processors employed to run a single ALTER TABLE ADD (index-based) CONSTRAINT or DROP (clustered index) CONSTRAINT statement is determined by the max degree of parallelism configuration option and the current workload. Если компонент Компонент Database EngineDatabase Engine определяет, что система занята, то перед началом выполнения инструкции степень параллелизма операции автоматически понижается.If the Компонент Database EngineDatabase Engine detects that the system is busy, the degree of parallelism of the operation is automatically reduced before statement execution starts. Можно вручную настроить число процессоров, применяемых для запуска инструкции, указав параметр MAXDOP.You can manually configure the number of processors that are used to run the statement by specifying the MAXDOP option. Дополнительные сведения см. в разделе Настройка параметра конфигурации сервера max degree of parallelism.For more information, see Configure the max degree of parallelism Server Configuration Option.

Секционированные таблицыPartitioned Tables

Кроме выполнения операций SWITCH, затрагивающих секционированные таблицы, инструкция ALTER TABLE позволяет изменять состояния столбцов, ограничений и триггеров секционированной таблицы точно так же, как и для несекционированных таблиц.In addition to performing SWITCH operations that involve partitioned tables, use ALTER TABLE to change the state of the columns, constraints, and triggers of a partitioned table just like it's used for nonpartitioned tables. Но эта инструкция не может изменить способ секционирования таблицы.However, this statement can't be used to change the way the table itself is partitioned. Чтобы заново секционировать секционированную таблицу, используйте ALTER PARTITION SCHEME и ALTER PARTITION FUNCTION.To repartition a partitioned table, use ALTER PARTITION SCHEME and ALTER PARTITION FUNCTION. Кроме того, невозможно изменить тип данных для столбца секционированной таблицы.Additionally, you can't change the data type of a column of a partitioned table.

Ограничения в таблицах с представлениями, привязанными к схемамRestrictions on Tables with Schema-Bound Views

К инструкциям ALTER TABLE в таблицах с представлениями, привязанными к схемам, применяются те же ограничения, которые применяются в текущем времени для изменения таблиц с простым индексом.The restrictions that apply to ALTER TABLE statements on tables with schema-bound views are the same as the restrictions currently applied when modifying tables with a simple index. Добавление столбца разрешено.Adding a column is allowed. Но не разрешается удаление или изменение столбца, участвующего в любом из представлений, привязанных к схемам.However, removing or changing a column that participates in any schema-bound view isn't allowed. Если инструкция ALTER TABLE требует изменения столбца, используемого в привязанном к схеме представлении, то происходит сбой инструкции ALTER TABLE и компонент Компонент Database EngineDatabase Engine выдает сообщение об ошибке.If the ALTER TABLE statement requires changing a column used in a schema-bound view, ALTER TABLE fails and the Компонент Database EngineDatabase Engine raises an error message. Дополнительные сведения о привязке к схеме и индексированных представлениях см. в описании CREATE VIEW.For more information about schema binding and indexed views, see CREATE VIEW.

Создание или удаление триггеров для базовых таблиц не зависит от создания привязанного к схеме представления, в котором указаны эти таблицы.Adding or removing triggers on base tables isn't affected by creating a schema-bound view that references the tables.

Индексы и инструкция ALTER TABLEIndexes and ALTER TABLE

При удалении ограничений индексы, создаваемые как часть ограничения, удаляются.Indexes created as part of a constraint are dropped when the constraint is dropped. Индексы, создаваемые при помощи инструкции CREATE INDEX, должны удаляться при помощи инструкции DROP INDEX.Indexes that were created with CREATE INDEX must be dropped with DROP INDEX. Используйте инструкцию ALTER INDEX, чтобы перестроить индексную часть определения ограничения. Не обязательно удалять и заново добавлять ограничение с помощью инструкции ALTER TABLE.Use The ALTER INDEX statement to rebuild an index part of a constraint definition; the constraint doesn't have to be dropped and added again with ALTER TABLE.

Перед удалением столбца необходимо удалить все индексы и ограничения, основанные на столбце.All indexes and constraints based on a column must be removed before the column can be removed.

После удаления ограничения, создавшего кластеризованный индекс, строки данных, хранившиеся на конечном уровне кластеризованного индекса, хранятся в некластеризованной таблице.When you delete a constraint that created a clustered index, the data rows that were stored in the leaf level of the clustered index are stored in a nonclustered table. Можно удалить кластеризованный индекс и переместить полученную в результате таблицу в другую файловую группу или схему секционирования в одной транзакции, указав параметр MOVE TO.You can drop the clustered index and move the resulting table to another filegroup or partition scheme in a single transaction by specifying the MOVE TO option. Параметр MOVE TO обладает следующими ограничениями.The MOVE TO option has the following restrictions:

  • Параметр MOVE TO недопустим для индексированных представлений и некластеризованных индексов.MOVE TO isn't valid for indexed views or nonclustered indexes.
  • Схема секционирования или файловая группа уже должна существовать.The partition scheme or filegroup must already exist.
  • Если не указан аргумент MOVE TO, таблица будет размещена в той же схеме секционирования или файловой группе, которая была определена для кластеризованного индекса.If MOVE TO isn't specified, the table is located in the same partition scheme or filegroup as was defined for the clustered index.

При удалении кластеризованного индекса укажите параметр ONLINE = ON, чтобы транзакция DROP INDEX не блокировала запросы и изменения в отношении базовых данных и связанных с ними некластеризованных индексов.When you drop a clustered index, specify the ONLINE = ON option so the DROP INDEX transaction doesn't block queries and modifications to the underlying data and associated nonclustered indexes.

Параметр ONLINE = ON имеет следующие ограничения.ONLINE = ON has the following restrictions:

  • Параметр ONLINE = ON неприменим для кластеризованных индексов, которые отключены.ONLINE = ON isn't valid for clustered indexes that are also disabled. Отключенные индексы должны удаляться при помощи параметра ONLINE = OFF.Disabled indexes must be dropped by using ONLINE = OFF.
  • Только один индекс может удаляться единовременно.Only one index at a time can be dropped.
  • Параметр ONLINE = ON неприменим для индексированных представлений, некластеризованных индексов или индексов в локальных временных таблицах.ONLINE = ON isn't valid for indexed views, nonclustered indexes, or indexes on local temp tables.
  • Параметр ONLINE = ON неприменим для индексов columnstore.ONLINE = ON isn't valid for columnstore indexes.

Для удаления кластеризованного индекса временно требуется место на диске, равное размеру существующего кластеризованного индекса.Temporary disk space equal to the size of the existing clustered index is required to drop a clustered index. Это дополнительное пространство освобождается сразу после завершения операции.This additional space is released as soon as the operation is completed.

Примечание

Параметры, перечисленные в <drop_clustered_constraint_option> , применяются к кластеризованным индексам по таблицам, но не по представлениям. Также они не применяются к некластеризованным индексам.The options listed under <drop_clustered_constraint_option> apply to clustered indexes on tables and can't be applied to clustered indexes on views or nonclustered indexes.

Репликация изменений схемыReplicating Schema Changes

Когда команда ALTER TABLE выполняется для таблицы, опубликованной в издателе SQL ServerSQL Server, все изменения по умолчанию распространяются для всех подписчиков SQL ServerSQL Server.When you run ALTER TABLE on a published table at a SQL ServerSQL Server Publisher, by default, that change propagates to all SQL ServerSQL Server Subscribers. Эта функция имеет ряд ограничений.This functionality has some restrictions. Вы можете отключить ее.You can disable it. Дополнительные сведения см. в статье Внесение изменений в схемы баз данных публикации.For more information, see Make Schema Changes on Publication Databases.

Сжатие данныхData Compression

В системных таблицах не может быть включено сжатие.System tables can't be enabled for compression. Если таблица является кучей, то операция перестроения в режиме ONLINE будет однопотоковой.If the table is a heap, the rebuild operation for ONLINE mode will be single threaded. Используйте режим OFFLINE для выполнения многопотоковых операций перестроения кучи.Use OFFLINE mode for a multi-threaded heap rebuild operation. Дополнительную информацию о сжатии данных см. в разделе Сжатие данных.For a more information about data compression, seeData Compression.

Оценить состояние сжатия таблицы, индекса или секции можно с помощью хранимой процедуры sp_estimate_data_compression_savings.To evaluate how changing the compression state will affect a table, an index, or a partition, use the sp_estimate_data_compression_savings stored procedure.

На секционированные таблицы налагаются следующие ограничения.The following restrictions apply to partitioned tables:

  • Если в таблице есть невыровненные индексы, настройку сжатия для отдельной секции изменить нельзя.You can't change the compression setting of a single partition if the table has nonaligned indexes.
  • Синтаксис ALTER TABLE <table> REBUILD PARTITION ... производит перестроение указанной секции.The ALTER TABLE <table> REBUILD PARTITION ... syntax rebuilds the specified partition.
  • Синтаксис ALTER TABLE <table> REBUILD WITH ... производит перестроение всех секций.The ALTER TABLE <table> REBUILD WITH ... syntax rebuilds all partitions.

Удаление столбцов NTEXTDropping NTEXT Columns

При удалении столбцов NTEXT очистка удаленных данных выполняется как сериализованная операция для всех строк.When dropping NTEXT columns, the cleanup of the deleted data occurs as a serialized operation on all rows. Очистка может занимать много времени.The cleanup can require a large amount of time. Перед удалением столбца NTEXT из таблицы с большим количеством строк сначала заполните столбец NTEXT значениями NULL.When dropping an NTEXT column in a table with lots of rows, update the NTEXT column to NULL value first, then drop the column. Это действие можно выполнять в параллельном режиме, чтобы значительно ускорить его.You can run this option with parallel operations and make it much faster.

Перестроение индексов в режиме «в сети».Online Index Rebuild

Чтобы выполнить инструкцию DDL для перестроения индекса в оперативном режиме, необходимо завершить все активные блокирующие транзакции, выполняемые для соответствующей таблицы.To run the DDL statement for an online index rebuild, all active blocking transactions running on a particular table must be completed. Запуск перестроения индекса в оперативном режиме блокирует все новые транзакции, которые готовы к выполнению для этой таблицы.When the online index rebuild launches, it blocks all new transactions that are ready to start running on this table. Хотя продолжительность блокировки для перестроения индекса в оперативном режиме очень невелика, ожидание завершения всех открытых транзакций по таблице и блокировка новых транзакций может заметно отразиться на пропускной способности.Although the duration of the lock for online index rebuild is short, waiting for all open transactions on a given table to complete and blocking the new transactions to start, might significantly affect the throughput. Это может замедлить выполнение рабочей нагрузки или привести к превышению времени ожидания, существенно ограничивая доступ к базовой таблице.This can cause a workload slow-down or timeout and significantly limit access to the underlying table. Параметр WAIT_AT_LOW_PRIORITY позволяет администратору базы данных управлять блокировками S и Sch-M, которые используются для перестроения индекса в оперативном режиме. Доступны три варианта.The WAIT_AT_LOW_PRIORITY option allows DBAs to manage the S-lock and Sch-M locks required for online index rebuilds and lets them to select one of three options. Во всех трех вариантах, если во время ожидания ((MAX_DURATION =n [minutes])) нет блокирующих действий, то перестроение индекса в оперативном режиме начинается немедленно и не ожидает завершения инструкции DDL.In all three cases, if during the wait time ( (MAX_DURATION =n [minutes]) ) there are no blocking activities, the online index rebuild is run immediately without waiting and the DDL statement is completed.

Поддержка совместимостиCompatibility Support

Инструкция ALTER TABLE позволяет использовать только имена таблиц, состоящие из двух частей — "схема.объект".The ALTER TABLE statement supports only two-part (schema.object) table names. В SQL Server 2017SQL Server 2017 при задании имени таблицы в приведенных далее форматах во время компиляции возникает ошибка 117.In SQL Server 2017SQL Server 2017, specifying a table name using the following formats fails at compile time with error 117.

  • «сервер.база_данных.схема.таблица»server.database.schema.table
  • «.база_данных.схема.таблица».database.schema.table
  • «..схема.таблица»..schema.table

В предыдущих версиях определение формата "сервер.база_данных.схема.таблица" приводило к ошибке 4902.In earlier versions, specifying the format server.database.schema.table returned error 4902. Формат «.база_данных.схема.таблица» или «..схема.таблица» обрабатывался успешно.Specifying the format .database.schema.table or the format ..schema.table succeeded.

Чтобы устранить эту проблему, откажитесь от использования четырехкомпонентного префикса.To resolve the problem, remove the use of a four-part prefix.

РазрешенияPermissions

Требуется разрешение ALTER на таблицу.Requires ALTER permission on the table.

Разрешения ALTER TABLE применяются к обеим таблицам, затронутым инструкцией ALTER TABLE SWITCH.ALTER TABLE permissions apply to both tables involved in an ALTER TABLE SWITCH statement. Любые переключенные данные наследуют защиту от целевой таблицы.Any data that's switched inherits the security of the target table.

Если вы определили какой-либо из столбцов в инструкции ALTER TABLE с пользовательским типом для среды CLR или с псевдонимом типа данных, вам потребуется разрешение REFERENCES для этого типа.If you've defined any columns in the ALTER TABLE statement to be of a common language runtime (CLR) user-defined type or alias data type, REFERENCES permission on the type is required.

Для добавления столбца, который обновляет строки таблицы, требуется разрешение UPDATE для этой таблицы.Adding a column that updates the rows of the table requires UPDATE permission on the table. Например, добавление столбца NOT NULL со значением по умолчанию или добавление столбца идентификаторов, если таблица не пуста.For example, adding a NOT NULL column with a default value or adding an identity column when the table isn't empty.

ПримерыExamples

КатегорияCategory Используемые элементы синтаксисаFeatured syntax elements
Добавление столбцов и ограниченийAdding columns and constraints ADD • PRIMARY KEY с параметрами индекса • разреженные столбцы и наборы столбцов •ADD • PRIMARY KEY with index options • sparse columns and column sets •
Удаление столбцов и ограниченийDropping columns and constraints DROPDROP
Изменение определения столбцаAltering a column definition изменение типа данных • изменение размера столбца • параметры сортировкиchange data type • change column size • collation
Изменение определения таблицыAltering a table definition DATA_COMPRESSION • SWITCH PARTITION • LOCK ESCALATION • отслеживание измененийDATA_COMPRESSION • SWITCH PARTITION • LOCK ESCALATION • change tracking
Отключение и включение ограничений и триггеровDisabling and enabling constraints and triggers CHECK • NO CHECK • ENABLE TRIGGER • DISABLE TRIGGERCHECK • NO CHECK • ENABLE TRIGGER • DISABLE TRIGGER
   

Добавление столбцов и ограниченийAdding Columns and Constraints

В примерах из этого раздела показано добавление в таблицу столбцов и ограничений.Examples in this section demonstrate adding columns and constraints to a table.

A.A. Добавление нового столбцаAdding a new column

Следующий пример показывает добавление столбца, который допускает значения NULL и не имеет значений, предоставленных через определение DEFAULT.The following example adds a column that allows null values and has no values provided through a DEFAULT definition. В новом столбце в каждой строке будет значение NULL.In the new column, each row will have NULL.

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

Б.B. Добавление столбца с ограничениемAdding a column with a constraint

В следующем примере показано добавление нового столбца с ограничением UNIQUE.The following example adds a new column with a UNIQUE constraint.

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. Добавление непроверяемого ограничения CHECK к существующему столбцуAdding an unverified CHECK constraint to an existing column

В следующем примере к существующему столбцу в таблице добавляется ограничение.The following example adds a constraint to an existing column in the table. Столбец имеет значение, нарушающее это ограничение.The column has a value that violates the constraint. Поэтому во избежание проверки ограничения относительно существующих строк, а также для того, чтобы разрешить добавление ограничения, применяется WITH NOCHECK.Therefore, WITH NOCHECK is used to prevent the constraint from being validated against existing rows, and to allow for the constraint to be added.

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. Добавление ограничения DEFAULT к существующему столбцуAdding a DEFAULT constraint to an existing column

Следующий пример показывает создание таблицы с двумя столбцами и заполнение значениями первого столбца; в другом столбце остается NULL.The following example creates a table with two columns and inserts a value into the first column, and the other column remains NULL. В таком случае во второй столбец добавляется ограничение DEFAULT.A DEFAULT constraint is then added to the second column. Чтобы проверить применение значения по умолчанию, в первый столбец вставляется другое значение и создается запрос к таблице.To verify that the default is applied, another value is inserted into the first column, and the table is queried.

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. Добавление нескольких столбцов с ограничениямиAdding several columns with constraints

Следующий пример показывает добавление нескольких столбцов с ограничениями, которые определяются с помощью нового столбца.The following example adds several columns with constraints defined with the new column. Первый новый столбец имеет свойство IDENTITY.The first new column has an IDENTITY property. Каждая строка таблицы имеет новые добавочные значения в столбце идентификаторов.Each row in the table has new incremental values in the identity column.

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. Добавление столбца, допускающего значения NULL, со значениями по умолчаниюAdding a nullable column with default values

Следующий пример показывает добавление столбца, допускающего значения NULL, с определением DEFAULT и использование WITH VALUES для предоставления значений каждой строке таблицы.The following example adds a nullable column with a DEFAULT definition, and uses WITH VALUES to provide values for each existing row in the table. Если аргумент WITH VALUES не используется, каждая строка имеет значение NULL в новом столбце.If WITH VALUES isn't used, each row has the value NULL in the new column.

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. Создание ограничения PRIMARY KEY с параметрами индекса или сжатия данныхCreating a PRIMARY KEY constraint with index or data compression options

Следующий пример показывает создание ограничения PRIMARY KEY PK_TransactionHistoryArchive_TransactionID и установку параметров FILLFACTOR, ONLINE и PAD_INDEX.The following example creates the PRIMARY KEY constraint PK_TransactionHistoryArchive_TransactionID and sets the options FILLFACTOR, ONLINE, and PAD_INDEX. Результирующий кластеризованный индекс будет иметь такое же имя, что и ограничение.The resulting clustered index will have the same name as the constraint.

Применимо к: с SQL Server 2008SQL Server 2008 до SQL Server 2017SQL Server 2017 и База данных SQL AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and База данных SQL AzureAzure 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

В этом аналогичном примере применяется сжатие страниц и кластеризованный первичный ключ.This similar example applies page compression while applying the clustered primary key.

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

З.H. Добавление разреженного столбцаAdding a sparse column

В следующих примерах показывается добавление и изменение разреженных столбцов в таблице T1.The following examples show adding and modifying sparse columns in table T1. Код для создания таблицы T1:The code to create table T1 is as follows.

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

Чтобы добавить дополнительный разреженный столбец C5, выполните следующую инструкцию.To add an additional sparse column C5, execute the following statement.

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

Чтобы преобразовать неразреженный столбец C4 в разреженный, выполните следующую инструкцию.To convert the C4 non-sparse column to a sparse column, execute the following statement.

ALTER TABLE T1
ALTER COLUMN C4 ADD SPARSE ;
GO

Чтобы преобразовать разреженный столбец C4в неразреженный, выполните следующую инструкцию.To convert the C4 sparse column to a nonsparse column, execute the following statement.

ALTER TABLE T1
ALTER COLUMN C4 DROP SPARSE;
GO

И.I. Добавление набора столбцовAdding a column set

В следующих примерах показано добавление столбца к таблице T2.The following examples show adding a column to table T2. Набор столбцов не может быть добавлен в таблицу, если в ней уже содержатся разреженные столбцы.A column set can't be added to a table that already contains sparse columns. Код для создания таблицы T2:The code to create table T2 is as follows.

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

В следующих трех инструкциях добавляется набор столбцов с именем CS, после чего изменяются столбцы C2 и C3 на SPARSE.The following three statements add a column set named CS, and then modify columns C2 and C3 to 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. Добавление зашифрованного столбцаAdding an encrypted column

Следующая инструкция добавляет зашифрованный столбец с именем PromotionCode.The following statement adds an encrypted column named 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') ;

Удаление столбцов и ограниченийDropping Columns and Constraints

Приведенные в этом разделе примеры демонстрируют удаление столбцов и ограничений.The examples in this section demonstrate dropping columns and constraints.

A.A. Удаление столбца или столбцовDropping a column or columns

В первом примере для удаления столбца изменяется таблица.The first example modifies a table to remove a column. Во втором примере удаляется несколько столбцов.The second example removes multiple columns.

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. Удаление ограничений и столбцовDropping constraints and columns

В первом примере из таблицы удаляется ограничение UNIQUE.The first example removes a UNIQUE constraint from a table. Во втором примере удаляется 2 ограничения и один столбец.The second example removes two constraints and a single column.

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. Удаление ограничения PRIMARY KEY в режиме ONLINEDropping a PRIMARY KEY constraint in the ONLINE mode

В следующем примере удаляется ограничение PRIMARY KEY с параметром ONLINE, имеющим значение ON.The following example deletes a PRIMARY KEY constraint with the ONLINE option set to ON.

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

Г.D. Добавление и удаление ограничения FOREIGN KEYAdding and dropping a FOREIGN KEY constraint

Следующий пример показывает создание таблицы ContactBackup, а затем ее изменение сначала добавлением ограничения FOREIGN KEY, ссылающегося на таблицу Person.Person, затем удалением ограничения FOREIGN KEY.The following example creates the table ContactBackup, and then alters the table, first by adding a FOREIGN KEY constraint that references the table Person.Person, then by dropping the FOREIGN KEY constraint.

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 ;

Значок стрелки, используемый для ссылки возврата в начало ПримерыArrow icon used with Back to Top link Examples

Изменение определения столбцаAltering a Column Definition

A.A. изменение типа данных столбца.Changing the data type of a column

В следующем примере столбец таблицы изменяется с INT на DECIMAL.The following example changes a column of a table from INT to 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. Изменение размера столбцаChanging the size of a column

В следующем примере выполняется увеличение размера столбца varchar, а также точности и масштаба столбца decimal.The following example increases the size of a varchar column and the precision and scale of a decimal column. Поскольку столбцы содержат данные, их размер можно только увеличить.Because the columns contain data, the column size can only be increased. Также обратите внимание, что столбец col_a определяется в уникальном индексе.Also notice that col_a is defined in a unique index. Размер столбца col_a можно дополнительно увеличить, так как он имеет тип данных varchar, а индекс не является результатом ограничения PRIMARY KEY.The size of col_a can still be increased because the data type is a varchar and the index isn't the result of a PRIMARY KEY constraint.

-- 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. Изменение параметров сортировки столбцаChanging column collation

В следующем примере демонстрируется изменение параметров сортировки столбца.The following example shows how to change the collation of a column. Сначала создается таблица с параметрами сортировки пользователей по умолчанию.First, a table is created table with the default user collation.

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

Затем параметры сортировки столбца C2 изменяются на Latin1_General_BIN.Next, column C2 collation is changed to Latin1_General_BIN. Тип данных обязательно нужно указать, хотя он не изменяется.The data type is required, even though it isn't changed.

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

Г.D. Шифрование столбцаEncrypting a column

В следующем примере показано, как зашифровать столбец с помощью Always Encrypted с безопасными анклавами.The following example shows how to encrypt a column using Always Encrypted with secure enclaves.

Первым делом создается таблица без зашифрованных столбцов.First, a table is created without any encrypted columns.

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

После этого столбец C2 шифруется с помощью ключа шифрования CEK1 методом случайного шифрования.Next, column 'C2' is encrypted with a column encryption key, named CEK1, and randomized encryption. Чтобы следующая инструкция была выполнена успешно, должны соблюдаться следующие условия:For the following statement to succeed:

  • Ключ шифрования столбцов должен поддерживать анклав.The column encryption key must be enclave-enabled. Это означает, что он должен быть зашифрован главным ключом столбца, который допускает анклавные вычисления.Meaning, it must be encrypted with a column master key that allows enclave computations.
  • Целевой экземпляр SQL Server должен поддерживать Always Encrypted с безопасными анклавами.The target SQL Server instance must support Always Encrypted with secure enclaves.
  • Оператор следует передавать через подключение, настроенное для Always Encrypted с безопасными анклавами и применяемое поддерживаемый драйвер клиента.The statement must be issued over a connection set up for Always Encrypted with secure enclaves, and using a supported client driver.
  • Вызывающему приложению нужен доступ к главному ключу столбца, который защищает ключ CEK1.The calling application must have access to the column master key, protecting 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

Изменение определения таблицыAltering a Table Definition

В приведенных в этом разделе примерах показано, как изменить определение таблицы.The examples in this section demonstrate how to alter the definition of a table.

A.A. Изменение таблицы для изменения режима сжатияModifying a table to change the compression

В следующем примере изменяется режим сжатия несекционированной таблицы.The following example changes the compression of a nonpartitioned table. Куча или кластеризованный индекс будет перестроен.The heap or clustered index will be rebuilt. Если таблица является кучей, то все некластеризованные индексы будут перестроены.If the table is a heap, all nonclustered indexes will be rebuilt.

ALTER TABLE T1
REBUILD WITH (DATA_COMPRESSION = PAGE);

В следующем примере изменяется режим сжатия секционированной таблицы.The following example changes the compression of a partitioned table. Инструкция REBUILD PARTITION = 1 вызывает перестройку только секции с номером 1.The REBUILD PARTITION = 1 syntax causes only partition number 1 to be rebuilt.

Применимо к: с SQL Server 2008SQL Server 2008 до SQL Server 2017SQL Server 2017 и База данных SQL AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and База данных SQL AzureAzure SQL Database.

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

Та же операция, использующая следующий альтернативный синтаксис, вызывает повторное построение всех секций в таблице.The same operation using the following alternate syntax causes all partitions in the table to be rebuilt.

Применимо к: с SQL Server 2008SQL Server 2008 до SQL Server 2017SQL Server 2017 и База данных SQL AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and База данных SQL AzureAzure SQL Database.

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

Дополнительные примеры сжатия данных см. в разделе Сжатие данных.For additional data compression examples, see Data Compression.

Б.B. Модификация таблицы columnstore для изменения архивного сжатияModifying a columnstore table to change archival compression

Следующий пример показывает, как дополнительно сжать секцию таблицы columnstore, применяя дополнительный алгоритм сжатия.The following example further compresses a columnstore table partition by applying an additional compression algorithm. Такое сжатие уменьшает размер таблицы, но при этом увеличивает время, требуемое для хранения и получения данных.This compression reduces the table to a smaller size, but also increases the time required for storage and retrieval. Это может использоваться для архивации или в тех ситуациях, где требуется уменьшение объема пространства и допускается увеличение затрат времени на сохранение и выборку.This is useful for archiving or for situations that require less space and can afford more time for storage and retrieval.

Применимо к: с SQL Server 2014 (12.x)SQL Server 2014 (12.x) до SQL Server 2017SQL Server 2017 и База данных SQL AzureAzure SQL Database.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and База данных SQL AzureAzure SQL Database.

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

В следующем примере показана распаковка секции таблицы columnstore, которая была упакована с параметром COLUMNSTORE_ARCHIVE.The following example decompresses a columnstore table partition that was compressed with COLUMNSTORE_ARCHIVE option. При восстановлении данных сохранится режим сжатия columnstore, который используется для всех таблиц columnstore.When the data is restored, it will continue to be compressed with the columnstore compression that's used for all columnstore tables.

Применимо к: с SQL Server 2014 (12.x)SQL Server 2014 (12.x) до SQL Server 2017SQL Server 2017 и База данных SQL AzureAzure SQL Database.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and База данных SQL AzureAzure SQL Database.

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

В.C. Переключение секций между таблицамиSwitching partitions between tables

В следующем примере демонстрируется создание секционированной таблицы, исходя из предположения, что схема секционирования myRangePS1 уже создана в базе данных.The following example creates a partitioned table, assuming that partition scheme myRangePS1 is already created in the database. Затем создается несекционированная таблица с такой же структурой, что и секционированная таблица, и в той же файловой группе, что и PARTITION 2 таблицы PartitionTable.Next, a non-partitioned table is created with the same structure as the partitioned table and on the same filegroup as PARTITION 2 of table PartitionTable. В таком случае данные PARTITION 2 таблицы PartitionTable переключаются в таблицу NonPartitionTable.The data of PARTITION 2 of table PartitionTable is then switched into table 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. Разрешение укрупнения блокировки для секционированных таблицAllowing lock escalation on partitioned tables

В следующем примере укрупнение блокировки разрешается на уровне секции в секционированной таблице.The following example enables lock escalation to the partition level on a partitioned table. Если таблица не секционирована, блокировка будет укрупняться до уровня TABLE.If the table isn't partitioned, lock escalation is set at the TABLE level.

Применимо к: с SQL Server 2008SQL Server 2008 до SQL Server 2017SQL Server 2017 и База данных SQL AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and База данных SQL AzureAzure SQL Database.

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

Д.E. Настройка отслеживания изменений для таблицыConfiguring change tracking on a table

В следующем примере в таблице Person.Person включается отслеживание изменений.The following example enables change tracking on the Person.Person table.

Применимо к: с SQL Server 2008SQL Server 2008 до SQL Server 2017SQL Server 2017 и База данных SQL AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and База данных SQL AzureAzure SQL Database.

USE AdventureWorks;
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING;

В следующем примере разрешается отслеживание изменений и отслеживание столбцов, которые обновляются при внесении изменений.The following example enables change tracking and enables the tracking of the columns that are updated during a change.

Применимо к: с SQL Server 2008SQL Server 2008 до SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

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

В следующем примере в таблице Person.Person отключается отслеживание изменений.The following example disables change tracking on the Person.Person table.

Применимо к: с SQL Server 2008SQL Server 2008 до SQL Server 2017SQL Server 2017 и База данных SQL AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and База данных SQL AzureAzure SQL Database.

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

Отключение и включение ограничений и триггеровDisabling and Enabling Constraints and Triggers

A.A. Отключение и повторное включение ограниченияDisabling and re-enabling a constraint

В следующем примере отключается ограничение на зарплату.The following example disables a constraint that limits the salaries accepted in the data. Параметр NOCHECK CONSTRAINT используется в инструкции ALTER TABLE для отключения ограничения и обеспечения возможности вставки, противоречащей указанному ограничению.NOCHECK CONSTRAINT is used with ALTER TABLE to disable the constraint and allow for an insert that would typically violate the constraint. CHECK CONSTRAINT повторно включает ограничение.CHECK CONSTRAINT re-enables the constraint.

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. Отключение и повторное включение триггераDisabling and re-enabling a trigger

В следующем примере показывается использование параметра DISABLE TRIGGER инструкции ALTER TABLE для отключения триггера и обеспечения возможности вставки, которая в обычных условиях нарушает триггер.The following example uses the DISABLE TRIGGER option of ALTER TABLE to disable the trigger and allow for an insert that would typically violate the trigger. Затем инструкция ENABLE TRIGGER используется для повторного включения триггера.ENABLE TRIGGER is then used to re-enable the trigger.

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 Operations

A.A. Перестроение индекса в оперативном режиме с низким приоритетом ожидания.Online index rebuild using low-priority wait options

В следующем примере показано, как выполнить перестроение индекса в оперативном режиме с низким приоритетом ожидания.The following example shows how to perform an online index rebuild specifying the low-priority wait options.

Применимо к: с SQL Server 2014 (12.x)SQL Server 2014 (12.x) до SQL Server 2017SQL Server 2017 и База данных SQL AzureAzure SQL Database.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and База данных SQL AzureAzure 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

В следующем примере показано, как выполнить операцию изменения столбца с параметром ONLINE.The following example shows how to run an alter column operation with the ONLINE option.

Применимо к: с SQL Server 2016 (13.x)SQL Server 2016 (13.x) до SQL Server 2017SQL Server 2017 и База данных SQL AzureAzure SQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and База данных SQL AzureAzure 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

Системное управление версиямиSystem Versioning

Следующие четыре примера помогут ознакомиться с синтаксисом использования системного управления версиями.The following four examples will help you become familiar with the syntax for using system versioning. Дополнительные сведения см. в разделе Приступая к работе c темпоральными таблицами с системным управлением версиями.For additional assistance, see Getting Started with System-Versioned Temporal Tables.

Применимо к: с SQL Server 2016 (13.x)SQL Server 2016 (13.x) до SQL Server 2017SQL Server 2017 и База данных SQL AzureAzure SQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and База данных SQL AzureAzure SQL Database.

A.A. Добавление системного управления версиями в существующие таблицыAdd System Versioning to Existing Tables

В следующем примере показано добавление системного управления версиями в существующую таблицу и создание будущей таблицы журнала.The following example shows how to add system versioning to an existing table and create a future history table. В этом примере допускается существование таблицы InsurancePolicy, для которой определен первичный ключ.This example assumes that there's an existing table called InsurancePolicy with a primary key defined. Этот пример заполняет только что созданные столбцы периода для системного управления версиями значениями по умолчанию для времени начала и окончания, так как эти значения не могут быть NULL.This example populates the newly created period columns for system versioning using default values for the start and end times because these values can't be null. В этом примере используется предложение HIDDEN, чтобы не затрагивать существующие приложения, взаимодействующие с текущей таблицей.This example uses the HIDDEN clause to ensure no impact on existing applications interacting with the current table. В нем также используется HISTORY_RETENTION_PERIOD, доступный только в База данных SQLSQL Database.It also uses HISTORY_RETENTION_PERIOD that's available on База данных SQLSQL Database only.

--Alter non-temporal table to define periods for system versioning
ALTER TABLE InsurancePolicy
ADD PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime),
SysStartTime datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL
    DEFAULT SYSUTCDATETIME(),
SysEndTime 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. Перенос существующего решения для использования системного управления версиямиMigrate An Existing Solution to Use System Versioning

В следующем примере показан переход на системное управление версиями из решения, использующего триггеры для имитации временной поддержкой.The following example shows how to migrate to system versioning from a solution that uses triggers to mimic temporal support. В примере предполагается, что есть решение, использующее таблицу ProjectTask, и таблица ProjectTaskHistory для существующего решения, в которой для периодов используются столбцы Changed Date и Revised Date, и эти столбцы не используют тип данных datetime2, а в таблице ProjectTask определен первичный ключ.The example assumes there's an existing solution that uses a ProjectTask table and a ProjectTaskHistory table for its existing solution, that's uses the Changed Date and Revised Date columns for its periods, that these period columns don't use the datetime2 datatype and that the ProjectTask table has a primary key defined.

-- 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. Отключение и повторное включение системного управления версиями для изменения схемы таблицыDisabling and Re-Enabling System Versioning to Change Table Schema

В этом примере показано, как отключить системное управление версиями в таблице Department, добавить столбец и повторно включить системное управление версиями.This example shows how to disable system versioning on the Department table, add a column, and re-enable system versioning. Для изменения схемы таблицы требуется отключение системного управления версиями.Disabling system versioning is required to modify the table schema. Выполняйте указанные действия в рамках транзакции, чтобы избежать применения обновлений к обеим таблицам во время обновления схемы таблицы. Это позволит администратору базы данных повысить производительность, пропустив проверки согласованности данных при возобновлении системного управления версиями.Do these steps within a transaction to prevent updates to both tables while updating the table schema, which enables the DBA to skip the data consistency check when re-enabling system versioning and gain a performance benefit. Для выполнения таких задач, как создание статистики, переключение секций или применение сжатия к одной или обеим таблицам, не требуется отключать системное управление версиями.Tasks such as creating statistics, switching partitions, or applying compression to one or both tables doesn't require disabling system versioning.

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. Удаление системного управления версиямиRemoving System Versioning

В этом примере показано, как полностью удалить системное управление версиями из таблицы Department и удалить таблицу DepartmentHistory.This example shows how to completely remove system versioning from the Department table and drop the DepartmentHistory table. При необходимости можно также удалить столбцы периода, используемые системой для записи сведений о системном управлении версиями.Optionally, you might also want to drop the period columns used by the system to record system versioning information. При включенном системном управлении версиями удалить таблицы Department и DepartmentHistory нельзя.You can't drop either the Department or the DepartmentHistory tables while system versioning is enabled.

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

Примеры: Хранилище данных SQL AzureAzure SQL Data Warehouse и Параллельное хранилище данныхParallel Data WarehouseExamples: Хранилище данных SQL AzureAzure SQL Data Warehouse and Параллельное хранилище данныхParallel Data Warehouse

Во всех последующих примерах с А по В используется таблица FactResellerSales базы данных AdventureWorksPDW2012AdventureWorksPDW2012.The following examples A through C use the FactResellerSales table in the AdventureWorksPDW2012AdventureWorksPDW2012 database.

A.A. Определение секционирования таблицыDetermining if a table is partitioned

Следующий запрос возвращает одну или несколько строк, если таблица FactResellerSales секционирована.The following query returns one or more rows if the table FactResellerSales is partitioned. Если таблица не секционирована, строки не возвращаются.If the table isn't partitioned, no rows are returned.

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. Определение граничных значений для секционированной таблицыDetermining boundary values for a partitioned table

Следующий запрос возвращает граничные значения для каждой секции в таблице FactResellerSales .The following query returns the boundary values for each partition in the FactResellerSales table.

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. Определение столбца секционирования секционированной таблицыDetermining the partition column for a partitioned table

Следующий запрос возвращает имя столбца секционирования таблицы.The following query returns the name of the partitioning column for table. FactResellerSales.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. Объединение двух секцийMerging two partitions

В следующем примере объединяются две секции в таблице.The following example merges two partitions on a table.

Таблица Customer имеет следующее определение:The Customer table has the following definition:

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

Следующая команда объединяет границы секций 10 и 25.The following command combines the 10 and 25 partition boundaries.

ALTER TABLE Customer MERGE RANGE (10);

Новый DDL для таблицы:The new DDL for the table is:

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. Разбиение секцииSplitting a partition

В следующем примере показано разбиение секции в таблице.The following example splits a partition on a table.

Таблица Customer имеет следующий DDL:The Customer table has the following 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 )));

Следующая команда создает новую секцию, ограниченную значением 75, от 50 до 100.The following command creates a new partition bound by the value 75, between 50 and 100.

ALTER TABLE Customer SPLIT RANGE (75);

Новый DDL для таблицы:The new DDL for the table is:

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. Перемещение секции в таблицу журнала с помощью SWITCHUsing SWITCH to move a partition to a history table

В следующем примере выполняется перемещение данных в секции таблицы Orders в секцию в таблице OrdersHistory.The following example moves the data in a partition of the Orders table to a partition in the OrdersHistory table.

Таблица Orders имеет следующий DDL:The Orders table has the following 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' )));

В этом примере таблица Orders содержит следующие разделы.In this example, the Orders table has the following partitions. Каждая секция содержит данные.Each partition contains data.

СекцияPartition Содержит данные?Has data? Диапазон границBoundary range
11 ДаYes OrderDate < '2004-01-01'OrderDate < '2004-01-01'
22 ДаYes '2004-01-01' <= OrderDate < '2005-01-01''2004-01-01' <= OrderDate < '2005-01-01'
33 ДаYes '2005-01-01' <= OrderDate< '2006-01-01''2005-01-01' <= OrderDate< '2006-01-01'
44 ДаYes '2006-01-01'<= OrderDate < '2007-01-01''2006-01-01'<= OrderDate < '2007-01-01'
55 ДаYes '2007-01-01' <= OrderDate'2007-01-01' <= OrderDate
     
  • Секция 1 (содержит данные): OrderDate < '2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'
  • Секция 2 (содержит данные): '2004-01-01' <= OrderDate < '2005-01-01'Partition 2 (has data): '2004-01-01' <= OrderDate < '2005-01-01'
  • Секция 3 (содержит данные): '2005-01-01' <= OrderDate< '2006-01-01'Partition 3 (has data): '2005-01-01' <= OrderDate< '2006-01-01'
  • Секция 4 (содержит данные): '2006-01-01'<= OrderDate < '2007-01-01'Partition 4 (has data): '2006-01-01'<= OrderDate < '2007-01-01'
  • Секция 5 (содержит данные): '2007-01-01' <= OrderDatePartition 5 (has data): '2007-01-01' <= OrderDate

Таблица OrdersHistory имеет следующий DDL со столбцами и именами столбцов, идентичными столбцам и именам столбцов в таблице Orders.The OrdersHistory table has the following DDL, which has identical columns and column names as the Orders table. Они имеют распределенный хэш в столбце id.Both are hash-distributed on the id column.

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

Хотя форматы и имена столбцов должны быть одинаковыми, границы секций могут не совпадать.Although the columns and column names must be the same, the partition boundaries don't need to be the same. В этом примере таблица OrdersHistory содержит следующие две секции, которые пусты:In this example, the OrdersHistory table has the following two partitions and both partitions are empty:

  • Секция 1 (не содержит данные): OrderDate < '2004-01-01'Partition 1 (no data): OrderDate < '2004-01-01'
  • Секция 2 (пустая): '2004-01-01' <= OrderDatePartition 2 (empty): '2004-01-01' <= OrderDate

Для предыдущих двух таблиц следующая команда перемещает все строки с OrderDate < '2004-01-01' из таблицы Orders в таблицу OrdersHistory.For the previous two tables, the following command moves all rows with OrderDate < '2004-01-01' from the Orders table to the OrdersHistory table.

ALTER TABLE Orders SWITCH PARTITION 1 TO OrdersHistory PARTITION 1;

В результате первая секция в Orders пуста, а первая секция в OrdersHistory содержит данные.As a result, the first partition in Orders is empty and the first partition in OrdersHistory contains data. Теперь таблицы отображаются следующим образом:The tables now appear as follows:

Таблица OrdersOrders table

  • Секция 1 (пустая): OrderDate < '2004-01-01'Partition 1 (empty): OrderDate < '2004-01-01'
  • Секция 2 (содержит данные): '2004-01-01' <= OrderDate < '2005-01-01'Partition 2 (has data): '2004-01-01' <= OrderDate < '2005-01-01'
  • Секция 3 (содержит данные): '2005-01-01' <= OrderDate< '2006-01-01'Partition 3 (has data): '2005-01-01' <= OrderDate< '2006-01-01'
  • Секция 4 (содержит данные): '2006-01-01'<= OrderDate < '2007-01-01'Partition 4 (has data): '2006-01-01'<= OrderDate < '2007-01-01'
  • Секция 5 (содержит данные): '2007-01-01' <= OrderDatePartition 5 (has data): '2007-01-01' <= OrderDate

Таблица OrdersHistoryOrdersHistory table

  • Секция 1 (содержит данные): OrderDate < '2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'
  • Секция 2 (пустая): '2004-01-01' <= OrderDatePartition 2 (empty): '2004-01-01' <= OrderDate

Чтобы очистить таблицу Orders, можно удалить пустую секцию, объединив секции 1 и 2 следующим образом:To clean up the Orders table, you can remove the empty partition by merging partitions 1 and 2 as follows:

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

После объединения таблица Orders содержит следующие разделы.After the merge, the Orders table has the following partitions:

Таблица OrdersOrders table

  • Секция 1 (содержит данные): OrderDate < '2005-01-01'Partition 1 (has data): OrderDate < '2005-01-01'
  • Секция 2 (содержит данные): '2005-01-01' <= OrderDate< '2006-01-01'Partition 2 (has data): '2005-01-01' <= OrderDate< '2006-01-01'
  • Секция 3 (содержит данные): '2006-01-01'<= OrderDate < '2007-01-01'Partition 3 (has data): '2006-01-01'<= OrderDate < '2007-01-01'
  • Секция 4 (содержит данные): '2007-01-01' <= OrderDatePartition 4 (has data): '2007-01-01' <= OrderDate

Проходит еще один год, и теперь вы готовы к архивации данных за 2005 г.Suppose another year passes and you're ready to archive the year 2005. Для 2005 года можно выделить пустую секцию в таблице OrdersHistory, разделив пустую секцию следующим образом:You can allocate an empty partition for the year 2005 in the OrdersHistory table by splitting the empty partition as follows:

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

После разделения таблица OrdersHistory содержит следующие секции.After the split, the OrdersHistory table has the following partitions:

Таблица OrdersHistoryOrdersHistory table

  • Секция 1 (содержит данные): OrderDate < '2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'
  • Секция 2 (пустая): '2004-01-01' < '2005-01-01'Partition 2 (empty): '2004-01-01' < '2005-01-01'
  • Секция 3 (пустая): '2005-01-01' <= OrderDatePartition 3 (empty): '2005-01-01' <= OrderDate

См. также:See Also