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

APLICA-SE A: simSQL Server (a partir do 2008) simBanco de Dados SQL do Azure simSQL Data Warehouse do Azure simParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Modifica uma definição de tabela alterando, adicionando ou descartando colunas e restrições.Modifies a table definition by altering, adding, or dropping columns and constraints. ALTER TABLE também reatribui e recompila partições ou desabilita e habilita restrições e gatilhos.ALTER TABLE also reassigns and rebuilds partitions, or disables and enables constraints and triggers.

Para obter mais informações sobre as convenções de sintaxe, consulte Convenções de sintaxe Transact-SQL.For more information about the syntax conventions, see Transact-SQL Syntax Conventions.

Importante

A sintaxe de ALTER TABLE é diferente para tabelas baseadas em disco e tabelas com otimização de memória.The syntax for ALTER TABLE is different for disk-based tables and memory-optimized tables. Use os links a seguir para acessar diretamente o bloco de sintaxe adequado para seus tipos de tabela e os exemplos de sintaxe adequados:Use the following links to take you directly to the appropriate syntax block for your table types and to the appropriate syntax examples:

Sintaxe para tabelas baseadas em discoSyntax for disk-based tables

ALTER TABLE [ database_name . [ schema_name ] . | schema_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 } )
}

Sintaxe para tabelas com otimização de memóriaSyntax for memory-optimized tables

ALTER TABLE [ database_name . [ schema_name ] . | schema_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 ] . | schema_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 }
}

ArgumentosArguments

database_name O nome do banco de dados no qual a tabela foi criada.database_name The name of the database in which the table was created.

schema_name O nome do esquema ao qual a tabela pertence.schema_name The name of the schema to which the table belongs.

table_name O nome da tabela a ser alterada.table_name The name of the table to be altered. Se a tabela não estiver no banco de dados atual ou não constar no esquema pertencente ao usuário atual, especifique explicitamente o banco de dados e o esquema.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 COLUMN Especifica que a coluna nomeada será alterada ou modificada.ALTER COLUMN Specifies that the named column is to be changed or altered.

A coluna modificada não pode ser:The modified column can't be:

  • Uma coluna com um tipo de dados timestamp.A column with a timestamp data type.

  • O ROWGUIDCOL para a tabela.The ROWGUIDCOL for the table.

  • Uma coluna computada ou usada em uma coluna computada.A computed column or used in a computed column.

  • Usada em estatísticas geradas pela instrução CREATE STATISTICS.Used in statistics generated by the CREATE STATISTICS statement. A menos que a coluna seja um tipo de dados varchar, nvarchar ou varbinary, o tipo de dados não será alterado.Unless the column is a varchar, nvarchar, or varbinary data type, the data type isn't changed. E que o novo tamanho seja igual ou maior que o tamanho anterior.And, the new size is equal to or greater than the old size. Ou que a coluna seja modificada de não nula para nula.Or, if the column is changed from not null to null. Primeiro, remova as estatísticas que usam a instrução DROP STATISTICS.First, remove the statistics using the DROP STATISTICS statement.

    Observação

    As estatísticas que são geradas automaticamente pelo otimizador de consulta são descartadas automaticamente por ALTER COLUMN.Statistics that are automatically generated by the query optimizer are automatically dropped by ALTER COLUMN.

  • Usada em uma restrição PRIMARY KEY ou [FOREIGN KEY] REFERENCES.Used in a PRIMARY KEY or [FOREIGN KEY] REFERENCES constraint.

  • Usada em uma restrição CHECK ou UNIQUE.Used in a CHECK or UNIQUE constraint. Porém, a alteração do comprimento de uma coluna de comprimento variável usada em uma restrição CHECK ou UNIQUE é permitida.But, changing the length of a variable-length column used in a CHECK or UNIQUE constraint is allowed.

  • Associada com uma definição padrão.Associated with a default definition. Entretanto, o comprimento, a precisão e a escala de uma coluna poderão ser alterados se o tipo de dados não for modificado.However, the length, precision, or scale of a column can be changed if the data type isn't changed.

O tipo de dados das colunas text, ntext e image pode ser alterado somente das seguintes maneiras:The data type of text, ntext, and image columns can be changed only in the following ways:

  • text a varchar(max), nvarchar(max) ou xmltext to varchar(max), nvarchar(max), or xml
  • ntext a varchar(max), nvarchar(max) ou xmlntext to varchar(max), nvarchar(max), or xml
  • image a varbinary(max)image to varbinary(max)

Algumas alterações de tipo de dados podem causar uma alteração nos dados.Some data type changes may cause a change in the data. Por exemplo, alterar uma coluna nchar ou nvarchar para char ou varchar pode levar à conversão de caracteres estendidos.For example, changing a nchar or nvarchar column, to char or varchar, might cause the conversion of extended characters. Para obter mais informações, veja CAST e CONVERT (Transact-SQL).For more information, see CAST and CONVERT. Reduzir a precisão ou escala de uma coluna pode causar o truncamento de dados.Reducing the precision or scale of a column can cause data truncation.

Observação

O tipo de dados de uma coluna em uma tabela particionada não pode ser alterado.The data type of a column of a partitioned table can't be changed.

O tipo de dados de colunas incluídos em um índice não poderá ser alterado, a menos que a coluna seja um tipo de dados varchar, nvarchar ou varbinary e o novo tamanho seja igual ou maior que o tamanho anterior.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.

Uma coluna incluída em uma restrição de chave primária não pode ser alterada de NOT NULL para NULL.A column included in a primary key constraint, can't be changed from NOT NULL to NULL.

Ao usar o Always Encrypted (sem enclaves seguros), se a coluna que está sendo modificada estiver criptografada com “ENCRYPTED WITH”, você poderá alterar o tipo de dados para um tipo de dados compatível (como INT para BIGINT), mas não poderá alterar as configurações de criptografia.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.

Ao usar o Always Encrypted com enclaves seguros, você poderá alterar qualquer configuração de criptografia, se a chave de criptografia de coluna que protege a coluna (e a nova chave de criptografia de coluna, se estiver alterando a chave) for compatível com cálculos de enclave (criptografada com chaves mestras de coluna habilitadas para enclave).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). Para conhecer detalhes, consulte Always Encrypted com enclaves seguros.For details, see Always Encrypted with secure enclaves.

nome_da_coluna O nome da coluna a ser alterada, adicionada ou removida.column_name The name of the column to be altered, added, or dropped. O máximo para nome_da_coluna é 128 caracteres.The column_name maximum is 128 characters. Para novas colunas, é possível omitir nome_da_coluna para colunas criadas com um tipo de dados timestamp.For new columns, you can omit column_name for columns created with a timestamp data type. O nome timestamp será usado se nenhum nome_da_coluna for especificado para uma coluna de tipo de dados 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 O novo tipo de dados da coluna alterada ou o tipo de dados da coluna adicionada.] type_name The new data type for the altered column, or the data type for the added column. Não é possível especificar type_name para colunas de tabelas particionadas existentes.You can't specify type_name for existing columns of partitioned tables. type_name pode ser qualquer um dos seguintes tipos:type_name can be any one of the following types:

  • Um tipo de dados de sistema SQL ServerSQL Server.A SQL ServerSQL Server system data type.
  • Um tipo de dados do alias com base em um tipo de dados de sistema SQL ServerSQL Server.An alias data type based on a SQL ServerSQL Server system data type. Crie tipos de dados do alias com a instrução CREATE TYPE antes que possam ser usados em uma definição de tabela.You create alias data types with the CREATE TYPE statement before they can be used in a table definition.
  • Um tipo definido pelo usuário .NET Framework.NET Framework e o esquema ao qual ele pertence.A .NET Framework.NET Framework user-defined type, and the schema to which it belongs. Crie tipos de dados definidos pelo usuário com a instrução CREATE TYPE antes que possam ser usados em uma definição de tabela.You create user-defined types with the CREATE TYPE statement before they can be used in a table definition.

Os seguintes são critérios para type_name de uma coluna alterada:The following are criteria for type_name of an altered column:

  • O tipo de dados anterior deve ser implicitamente conversível para o novo tipo de dados.The previous data type must be implicitly convertible to the new data type.
  • type_name não pode ser timestamp.type_name can't be timestamp.
  • Padrões ANSI_NULL estão sempre ativados para ALTER COLUMN; se não for especificado, a coluna permite valor nulo.ANSI_NULL defaults are always on for ALTER COLUMN; if not specified, the column is nullable.
  • O preenchimento ANSI_PADDING está sempre ON para ALTER COLUMN.ANSI_PADDING padding is always ON for ALTER COLUMN.
  • Se a coluna modificada for uma coluna de identidade, new_data_type deverá ser um tipo de dados compatível com a propriedade de identidade.If the modified column is an identity column, new_data_type must be a data type that supports the identity property.
  • A configuração atual para SET ARITHABORT é ignorada.The current setting for SET ARITHABORT is ignored. ALTER TABLE operará como se ARITHABORT estivesse definido como ON.ALTER TABLE operates as if ARITHABORT is set to ON.

Observação

Se a cláusula COLLATE não for especificada, a alteração do tipo de dados de uma coluna fará com que uma ordenação seja modificada para a ordenação padrão do banco de dados.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.

precisão A precisão do tipo de dados especificado.precision The precision for the specified data type. Para obter mais informações sobre valores de precisão válidos, veja Precisão, escala e comprimento.For more information about valid precision values, see Precision, Scale, and Length.

Escala The scale for the specified data type.scale The scale for the specified data type. Para obter mais informações sobre valores de escala válidos, veja Precisão, escala e comprimento.For more information about valid scale values, see Precision, Scale, and Length.

max Aplica-se apenas aos tipos de dados varchar, nvarchar e varbinary para armazenar 2^31-1 bytes de caractere, dados binários e dados Unicode.max 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_collection Aplica-se ao: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 por meio de SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.xml_schema_collection Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Aplica-se apenas ao tipo de dados xml para associar um esquema XML ao tipo.Applies only to the xml data type for associating an XML schema with the type. Antes de digitar uma coluna xml em uma coleção de esquema, crie primeiro a coleção de esquema no banco de dados usando 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 > especifica a nova ordenação para a coluna alterada.COLLATE < collation_name > Specifies the new collation for the altered column. Se não for especificado, à coluna será atribuída a ordenação padrão do banco de dados.If not specified, the column is assigned the default collation of the database. O nome da ordenação pode ser um nome de ordenação do Windows ou um nome de ordenação SQL.Collation name can be either a Windows collation name or a SQL collation name. Para obter uma lista e mais informações, veja Nome da ordenação do Windows e Nome de ordenação do SQL Server.For a list and more information, see Windows Collation Name and SQL Server Collation Name.

A cláusula COLLATE altera as ordenações somente de colunas dos tipos de dados char, varchar, nchar e nvarchar.The COLLATE clause changes the collations only of columns of the char, varchar, nchar, and nvarchar data types. Para alterar a ordenação de uma coluna de tipo de dados de alias definido pelo usuário, use instruções ALTER TABLE separadas para alterar a coluna para um tipo de dados de sistema 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. Depois, altere novamente a coluna e a ordenação para um tipo de dados de alias.Then, change its collation and change the column back to an alias data type.

ALTER COLUMN não poderá ter uma alteração de ordenação se ocorrer uma ou mais das condições a seguir:ALTER COLUMN can't have a collation change if one or more of the following conditions exist:

  • Se uma restrição CHECK, FOREIGN KEY ou colunas computadas referenciarem a coluna alterada.If a CHECK constraint, FOREIGN KEY constraint, or computed columns reference the column changed.
  • Se forem criados qualquer índice, estatísticas ou índice de texto completo na coluna.If any index, statistics, or full-text index are created on the column. As estatísticas criadas automaticamente na coluna alterada serão descartadas se a ordenação da coluna for alterada.Statistics created automatically on the column changed are dropped if the column collation is changed.
  • Se uma função ou exibição associada a esquema referenciar a coluna.If a schema-bound view or function references the column.

Para obter mais informações, consulte COLLATE.For more information, see COLLATE.

NULL | NOT NULL Especifica se a coluna pode aceitar valores nulos.NULL | NOT NULL Specifies whether the column can accept null values. As colunas que não permitem valores nulos podem ser adicionadas com ALTER TABLE apenas se tiverem um padrão especificado ou se a tabela estiver vazia.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. Será possível especificar NOT NULL para colunas computadas somente se PERSISTED também for especificado.You can specify NOT NULL for computed columns only if you've also specified PERSISTED. Se a nova coluna permitir valores nulos e você não especificar um padrão, a nova coluna conterá um valor nulo para cada linha da tabela.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. Se a nova coluna permitir valores nulos e uma definição padrão for adicionada com a nova coluna, você poderá usar WITH VALUES para armazenar o valor padrão na nova coluna para cada linha existente na tabela.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.

Se a nova coluna não permite valores nulos e a tabela não estiver vazia, será preciso adicionar uma definição DEFAULT com a nova coluna.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. E a nova coluna será carregada automaticamente com o valor padrão nas novas colunas em cada linha existente.And, the new column automatically loads with the default value in the new columns in each existing row.

É possível especificar NULL em ALTER COLUMN para forçar uma coluna NOT NULL a permitir valores nulos, exceto no caso de colunas nas restrições 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 poderá ser especificado em ALTER COLUMN apenas se a coluna não contiver nenhum valor nulo.You can specify NOT NULL in ALTER COLUMN only if the column contains no null values. Os valores nulos devem ser atualizados para algum valor antes que ALTER COLUMN NOT NULL seja permitido. Por exemplo: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;

Quando você cria ou altera uma tabela com a instrução CREATE TABLE ou ALTER TABLE, as configurações de banco de dados e de sessão influenciam e, possivelmente, substituem a nulidade do tipo de dados que é usado em uma definição de coluna.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. Certifique-se de sempre definir explicitamente uma coluna como NULL ou NOT NULL para colunas não computadas.Be sure that you always explicitly define a column as NULL or NOT NULL for noncomputed columns.

Se você adicionar uma coluna com um tipo de dados definido pelo usuário, defina a coluna com a mesma nulidade que o tipo de dados definido pelo usuário.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. Além disso, especifique um valor padrão para a coluna.And, specify a default value for the column. Para obter mais informações, confira CREATE TABLE.For more information, see CREATE TABLE.

Observação

Se NULL ou NOT NULL for especificado com ALTER COLUMN new_data_type [(precision [, scale ])] também deverá ser especificado.If NULL or NOT NULL is specified with ALTER COLUMN, new_data_type [(precision [, scale ])] must also be specified. Se o tipo de dados, a precisão e a escala não forem alterados, especifique os valores de coluna atuais.If the data type, precision, and scale are not changed, specify the current column values.

[{ADICIONAR |REMOVER} ROWGUIDCOL ] aplica-se ao: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 por meio do SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.[ {ADD | DROP} ROWGUIDCOL ] Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Especifica que a propriedade ROWGUIDCOL propriedade é adicionada ou descartada da coluna especificada.Specifies that the ROWGUIDCOL property is added to or dropped from the specified column. ROWGUIDCOL indica que a coluna é uma coluna GUID de linha.ROWGUIDCOL indicates that the column is a row GUID column. Só é possível definir uma coluna uniqueidentifier por tabela como a coluna ROWGUIDCOL.You can set only one uniqueidentifier column per table as the ROWGUIDCOL column. E você só pode atribuir a propriedade ROWGUIDCOL a uma coluna uniqueidentifier.And, you can only assign the ROWGUIDCOL property to a uniqueidentifier column. Não é possível atribuir ROWGUIDCOL a uma coluna de um tipo de dados definido pelo usuário.You can't assign ROWGUIDCOL to a column of a user-defined data type.

ROWGUIDCOL não impõe exclusividade para os valores armazenados na coluna e não gera valores automaticamente para novas linhas inseridas na tabela.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. Para gerar valores exclusivos para cada coluna, use a função NEWID ou NEWSEQUENTIALID em instruções INSERT.To generate unique values for each column, either use the NEWID or NEWSEQUENTIALID function on INSERT statements. Ou especifique a função NEWID ou NEWSEQUENTIALID como o padrão para a coluna.Or, specify the NEWID or NEWSEQUENTIALID function as the default for the column.

[ {ADICIONAR |REMOVER} PERSISTED ] Especifica que a propriedade PERSISTED é adicionada ou removida da coluna especificada.[ {ADD | DROP} PERSISTED ] Specifies that the PERSISTED property is added to or dropped from the specified column. A coluna deve ser uma coluna computada definida com uma expressão determinista.The column must be a computed column that's defined with a deterministic expression. No caso de colunas especificadas como PERSISTED, o Mecanismo de Banco de DadosDatabase Engine armazenará fisicamente os valores computados na tabela e os atualizará quando qualquer outra coluna, da qual depende a coluna computada, for atualizada.For columns specified as PERSISTED, the Mecanismo de Banco de DadosDatabase 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. Ao marcar uma coluna computada como PERSISTED, é possível criar índices em colunas computadas definidas em expressões que são determinísticas, mas não precisas.By marking a computed column as PERSISTED, you can create indexes on computed columns defined on expressions that are deterministic, but not precise. Para obter mais informações, consulte Indexes on Computed Columns.For more information, see Indexes on Computed Columns.

Qualquer coluna computada usada como coluna de particionamento de uma tabela particionada deve ser explicitamente marcada como PERSISTED.Any computed column that's used as a partitioning column of a partitioned table must be explicitly marked PERSISTED.

DROP NOT FOR REPLICATION Aplica-se ao: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 por meio do SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.DROP NOT FOR REPLICATION Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Especifica que os valores são incrementados em colunas de identidade quando os agentes de replicação executam operações de inserção.Specifies that values are incremented in identity columns when replication agents carry out insert operations. Será possível especificar essa cláusula somente se nome_da_coluna for uma coluna de identidade.You can specify this clause only if column_name is an identity column.

SPARSE Indica que a coluna é uma coluna esparsa.SPARSE Indicates that the column is a sparse column. O armazenamento de colunas esparsas é otimizado para obter valores nulos.The storage of sparse columns is optimized for null values. Não é possível definir as colunas esparsas como NOT NULL.You can't set sparse columns as NOT NULL. A conversão de uma coluna de esparsa para não esparsa, ou vice-versa, bloqueia a tabela durante a execução do comando.Converting a column from sparse to nonsparse or from nonsparse to sparse, locks the table for the duration of the command execution. Talvez você precise usar a cláusula REBUILD para reclamar qualquer economia de espaço.You may need to use the REBUILD clause to reclaim any space savings. Para obter restrições adicionais e mais informações sobre colunas esparsas, consulte Usar colunas esparsas.For additional restrictions and more information about sparse columns, see Use Sparse Columns.

ADD MASKED WITH ( FUNCTION = ' mask_function ') Aplica-se a: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) por meio de SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.ADD MASKED WITH ( FUNCTION = ' mask_function ') Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Especifica uma máscara de dados dinâmicos.Specifies a dynamic data mask. mask_function é o nome da função de mascaramento com os parâmetros apropriados.mask_function is the name of the masking function with the appropriate parameters. Três funções estão disponíveis:Three functions are available:

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

Para remover uma máscara, use DROP MASKED.To drop a mask, use DROP MASKED. Para parâmetros de função, consulte Máscara de Dados Dinâmicos.For function parameters, see Dynamic Data Masking.

WITH ( ONLINE = ON | OFF) <conforme se aplica a alterar uma coluna> Aplica-se a: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) por meio de SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.WITH ( ONLINE = ON | OFF) <as applies to altering a column> Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Permite que muitas ações de alteração de coluna sejam executadas enquanto a tabela permanece disponível.Allows many alter column actions to be carried out while the table remains available. O padrão é OFF.Default is OFF. É possível executar a alteração da coluna online para as alterações de coluna relacionadas ao tipo de dados, comprimento da coluna ou precisão, nulidade, dispersão e ordenação.You can run alter column online for column changes related to data type, column length or precision, nullability, sparseness, and collation.

A alteração online de coluna permite que as estatísticas automáticas e criadas pelo usuário usem como referência a coluna alterada durante a operação ALTER COLUMN, o que permite a execução normal de consultas.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. No final da operação, as estatísticas automáticas que fazem referência à coluna são descartadas e as estatísticas criadas pelo usuário são invalidadas.At the end of the operation, autostats that reference the column are dropped and user-created stats are invalidated. O usuário deve atualizar manualmente as estatísticas geradas pelo usuário após a conclusão da operação.The user must manually update user-generated statistics after the operation is completed. Se a coluna fizer parte de uma expressão de filtro para estatísticas ou índices, você não poderá executar uma operação de alteração de coluna.If the column is part of a filter expression for any statistics or indexes then you can't perform an alter column operation.

  • Enquanto a operação de alteração online de coluna estiver em execução, todas as operações que dependem da coluna (índice, exibições e assim por diante) serão bloqueadas ou falharão com um erro apropriado.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. Esse comportamento garante que a alteração online de coluna não falhe devido a dependências introduzidas enquanto a operação estiver em execução.This behavior guarantees that online alter column won't fail because of dependencies introduced while the operation was running.
  • A alteração de uma coluna de NOT NULL para NULL não tem suporte como uma operação online quando a coluna alterada é referenciada por índices não clusterizados.Altering a column from NOT NULL to NULL isn't supported as an online operation when the altered column is referenced by nonclustered indexes.
  • Não há suporte para alteração online quando a coluna é referenciada por uma restrição de verificação e a operação de alteração está restringindo a precisão da coluna (numérica ou de data e hora).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).
  • A opção WAIT_AT_LOW_PRIORITY não pode ser usada com a alteração online de coluna.The WAIT_AT_LOW_PRIORITY option can't be used with online alter column.
  • ALTER COLUMN ... ADD/DROP PERSISTED não é compatível para a coluna de alteração online.ALTER COLUMN ... ADD/DROP PERSISTED isn't supported for online alter column.
  • ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION não é afetado pela coluna de alteração online.ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION isn't affected by online alter column.
  • A alteração online de coluna não dá suporte à alteração de uma tabela em que o controle de alterações está habilitado ou é um publicador de replicação de mesclagem.Online alter column doesn't support altering a table where change tracking is enabled or that's a publisher of merge replication.
  • A alteração online de coluna não dá suporte à alteração de ou para tipos de dados CLR.Online alter column doesn't support altering from or to CLR data types.
  • A alteração online de coluna não dá suporte à alteração para um tipo de dados XML que tem uma coleção de esquema diferente da coleção de esquema atual.Online alter column doesn't support altering to an XML data type that has a schema collection different than the current schema collection.
  • A alteração online de coluna não reduz as restrições nem determina quando uma coluna pode ser alterada.Online alter column doesn't reduce the restrictions on when a column can be altered. Referências de índice/estatísticas e assim por diante podem causar falha na alteração.References by index/stats, and so on, might cause the alter to fail.
  • A alteração online de coluna não dá para suporte a alteração de mais de uma coluna simultaneamente.Online alter column doesn't support altering more than one column concurrently.
  • A alteração online de coluna não tem nenhum efeito no caso da tabela temporal com versão do sistema.Online alter column has no effect in a system-versioned temporal table. A coluna ALTER não é executada online, independentemente de qual valor tenha sido especificado para a opção ONLINE.ALTER column isn't run as online regardless of which value was specified for ONLINE option.

A alteração online de coluna tem requisitos, restrições e funcionalidades similares à recompilação de índice online, o que inclui:Online alter column has similar requirements, restrictions, and functionality as online index rebuild, which includes:

  • A recompilação de índice online não é compatível quando a tabela contém colunas LOB ou filestream herdadas ou quando a tabela tem um índice columnstore.Online index rebuild isn't supported when the table contains legacy LOB or filestream columns or when the table has a columnstore index. As mesmas limitações se aplicam à alteração de coluna online.The same limitations apply for online alter column.
  • Uma coluna existente que está sendo alterada requer duas vezes a alocação de espaço; para a coluna original e para a coluna oculta recém-criada.An existing column being altered requires twice the space allocation, for the original column and for the newly created hidden column.
  • A estratégia de bloqueio durante uma operação de alteração online de coluna segue o mesmo padrão de bloqueio usado para criação de índice online.The locking strategy during an alter column online operation follows the same locking pattern used for online index build.

WITH CHECK | WITH NOCHECK Especifica se os dados na tabela são ou não validados com relação à restrição FOREIGN KEY ou CHECK recentemente adicionada ou reabilitada.WITH CHECK | WITH NOCHECK Specifies whether the data in the table is or isn't validated against a newly added or re-enabled FOREIGN KEY or CHECK constraint. Se não especificado, WITH CHECK é considerado para novas restrições e WITH NOCHECK é considerado para restrições reabilitadas.If you don't specify, WITH CHECK is assumed for new constraints, and WITH NOCHECK is assumed for re-enabled constraints.

Se você não quiser verificar novas restrições CHECK ou FOREIGN KEY com relação aos dados existentes, use WITH NOCHECK.If you don't want to verify new CHECK or FOREIGN KEY constraints against existing data, use WITH NOCHECK. Não recomendamos fazer isso, com raríssimas exceções.We don't recommend doing this, except in rare cases. A nova restrição é avaliada em todas as atualizações de dados posteriores.The new constraint is evaluated in all later data updates. Qualquer violação que seja suprimida por WITH NOCHECK ao adicionar a restrição pode gerar falha em atualizações futuras caso elas atualizem as linhas com dados que não sigam a restrição.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.

Observação

O otimizador de consulta não considera restrições definidas WITH NOCHECK.The query optimizer doesn't consider constraints that are defined WITH NOCHECK. Tais restrições são ignoradas até que sejam reabilitadas, usando 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_name Especifica que o número de buckets para index_name foi alterado ou modificado.ALTER INDEX index_name Specifies that the bucket count for index_name is to be changed or altered.

A sintaxe ALTER TABLE... ADD/DROP/ALTER INDEX só tem suporte para tabelas com otimização de memória.The syntax ALTER TABLE ... ADD/DROP/ALTER INDEX is supported only for memory-optimized tables.

Importante

Sem o uso de uma instrução ALTER TABLE, não há suporte para as instruções CREATE INDEX, DROP INDEX, ALTER INDEX e PAD_INDEX para índices em tabelas com otimização de memória.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.

ADD Especifica que uma ou mais definições de coluna, definições de coluna computada ou restrições de tabela são adicionadas.ADD Specifies that one or more column definitions, computed column definitions, or table constraints are added. Ou as colunas que o sistema usa para controle de versão do sistema são adicionadas.Or, the columns that the system uses for system versioning are added. Para tabelas com otimização de memória, é possível adicionar um índice.For memory-optimized tables, you can add an index.

Importante

Sem o uso de uma instrução ALTER TABLE, não há suporte para as instruções CREATE INDEX, DROP INDEX, ALTER INDEX e PAD_INDEX para índices em tabelas com otimização de memória.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 ) Aplica-se a: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) por meio de SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name ) Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Especifica os nomes das colunas que o sistema usará para registrar o período em que um registro é válido.Specifies the names of the columns that the system uses to record the period of time for which a record is valid. Você pode especificar colunas existentes ou criar novas colunas como parte do argumento ADD PERIOD FOR SYSTEM_TIME.You can specify existing columns or create new columns as part of the ADD PERIOD FOR SYSTEM_TIME argument. Configure as colunas o datatype de datetime2 e as defina como NOT NULL.Set up the columns with the datatype of datetime2 and define them as NOT NULL. Se você definir uma coluna de período como NULL, um erro será gerado.If you define a period column as NULL, an error results. Você pode definir column_constraint e/ou Especificar Valores Padrão para Colunas para as colunas system_start_time e 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. Consulte o Exemplo A nos exemplos de Controle de versão do sistema a seguir, que demonstram o uso de um valor padrão para a coluna system_end_time.See Example A in the following System Versioning examples that demonstrates using a default value for the system_end_time column.

Use esse argumento com o argumento SET SYSTEM_VERSIONING para habilitar o controle de versão do sistema em uma tabela existente.Use this argument with the SET SYSTEM_VERSIONING argument to enable system versioning on an existing table. Para obter mais informações, veja Tabelas temporais e Introdução às tabelas temporais no Banco de Dados SQL do Azure.For more information, see Temporal Tables and Getting Started with Temporal Tables in Azure SQL Database.

Do SQL Server 2017 (14.x)SQL Server 2017 (14.x) em diante, os usuários poderão marcar uma ou ambas as colunas de período com o sinalizador HIDDEN para implicitamente ocultar essas colunas, de modo que SELECT * FROM <nome_da_tabela> não retorne um valor para as colunas.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. Por padrão, as colunas de período não ficam ocultas.By default, period columns aren't hidden. Para serem usadas, colunas ocultas devem ser explicitamente incluídas em todas as consultas que fazem referência direta à tabela temporal.In order to be used, hidden columns must be explicitly included in all queries that directly reference the temporal table.

DROP Especifica que uma ou mais definições de coluna, definições de coluna computada ou restrições de tabela são removidas ou remove a especificação das colunas que o sistema usa para controle de versão do sistema.DROP 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_name Especifica que column_name é removida da tabela.CONSTRAINT constraint_name Specifies that constraint_name is removed from the table. Várias restrições podem ser listadas.Multiple constraints can be listed.

O nome definido pelo usuário ou fornecido pelo sistema das restrições pode ser determinado ao consultar as exibições do catálogo restrição_sys.check, restrições_sys.default, restrições_sys.key e chaves_sys.foreign.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.

Uma restrição PRIMARY KEY não poderá ser descartada se um índice XML existir na tabela.A PRIMARY KEY constraint can't be dropped if an XML index exists on the table.

INDEX index_name Especifica que index_name foi removido da tabela.INDEX index_name Specifies that index_name is removed from the table.

A sintaxe ALTER TABLE... ADD/DROP/ALTER INDEX só tem suporte para tabelas com otimização de memória.The syntax ALTER TABLE ... ADD/DROP/ALTER INDEX is supported only for memory-optimized tables.

Importante

Sem o uso de uma instrução ALTER TABLE, não há suporte para as instruções CREATE INDEX, DROP INDEX, ALTER INDEX e PAD_INDEX para índices em tabelas com otimização de memória.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_name Especifica que constraint_name ou column_name é removida da tabela.COLUMN column_name Specifies that constraint_name or column_name is removed from the table. Várias colunas podem ser listadas.Multiple columns can be listed.

Uma coluna não pode ser descartada quando for:A column can't be dropped when it's:

  • Usado em um índice, como uma coluna de chave ou um INCLUDEUsed in an index, whether as a key column or as an INCLUDE
  • Usada em uma restrição CHECK, FOREIGN KEY, UNIQUE ou PRIMARY KEY.Used in a CHECK, FOREIGN KEY, UNIQUE, or PRIMARY KEY constraint.
  • Associada a um padrão que é definido com a palavra-chave DEFAULT ou associada com um objeto padrão.Associated with a default that's defined with the DEFAULT keyword, or bound to a default object.
  • Associada a uma regra.Bound to a rule.

Observação

Descartar uma coluna não recupera o espaço em disco da coluna.Dropping a column doesn't reclaim the disk space of the column. Talvez seja necessário recuperar o espaço em disco de uma coluna descartada quando o tamanho da linha de uma tabela estiver próximo do limite ou o exceder.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. Recupere o espaço, criando um índice clusterizado da tabela ou recriando um índice clusterizado existente usando ALTER INDEX.Reclaim space by creating a clustered index on the table or rebuilding an existing clustered index by using ALTER INDEX. Para obter informações sobre o impacto de remover tipos de dados LOB, consulte esta entrada de blog CSS.For information about the impact of dropping LOB data types, see this CSS blog entry.

PERIOD FOR SYSTEM_TIME Aplica-se ao: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) por meio do SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.PERIOD FOR SYSTEM_TIME Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Descarta a especificação para as colunas que o sistema usará para controle de versão do sistema.Drops the specification for the columns that the system will use for system versioning.

WITH <drop_clustered_constraint_option> Especifica que há uma ou mais opções de descarte de restrição clusterizada definidas.WITH <drop_clustered_constraint_option> Specifies that one or more drop clustered constraint options are set.

MAXDOP = max_degree_of_parallelism Aplica-se ao: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 por meio de SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.MAXDOP = max_degree_of_parallelism Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Substitui a opção de configuração de grau máximo de paralelismo apenas para a duração da operação.Overrides the max degree of parallelism configuration option only for the duration of the operation. Para obter mais informações, veja Configurar a opção max degree of parallelism de configuração de servidor.For more information, see Configure the max degree of parallelism Server Configuration Option.

Use a opção MAXDOP para limitar o número de processadores usados na execução do plano paralelo.Use the MAXDOP option to limit the number of processors used in parallel plan execution. O máximo é de 64 processadores.The maximum is 64 processors.

max_degree_of_parallelism pode ser um dos seguintes valores:max_degree_of_parallelism can be one of the following values:

1 Suprime a geração de plano paralelo.1 Suppresses parallel plan generation.

>1 Restringe o número máximo de processadores usados em uma operação de índice paralela ao número especificado.>1 Restricts the maximum number of processors used in a parallel index operation to the specified number.

0 (padrão) – Usa o número real de processadores ou menos, com base na carga de trabalho atual do sistema.0 (default) Uses the actual number of processors or fewer based on the current system workload.

Para obter mais informações, consulte Configurar operações de índice paralelo.For more information, see Configure Parallel Index Operations.

Observação

As operações de índice paralelas não estão disponíveis em todas as edições do SQL ServerSQL Server.Parallel index operations aren't available in every edition of SQL ServerSQL Server. Para saber mais, confira Edições e recursos com suporte para o SQL Server 2016 e Edições e recursos com suporte para o 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} <conforme se aplica em rop_clustered_constraint_option> Especifica se as tabelas subjacentes e os índices associados estão disponíveis para consultas e modificação de dados durante a operação de índice.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. O padrão é OFF.The default is OFF. É possível executar REBUILD como uma operação ONLINE.You can run REBUILD as an ONLINE operation.

ON Bloqueios de tabela de longa duração não são mantidos durante a operação do índice.ON Long-term table locks aren't held for the duration of the index operation. Durante a fase principal da operação de índice, apenas um bloqueio IS (Tentativa Compartilhada) é mantido na tabela de origem.During the main phase of the index operation, only an Intent Share (IS) lock is held on the source table. Esse comportamento permite a continuação de consultas ou atualizações feitas na tabela e nos índices subjacentes.This behavior enables queries or updates to the underlying table and indexes to continue. No início da operação, um bloqueio compartilhado (S) é mantido no objeto de origem por um curto período.At the start of the operation, a Shared (S) lock is held on the source object for a short time. Ao término da operação, por um curto período, um bloqueio S (Compartilhado) será adquirido na origem se um índice não clusterizado estiver sendo criado.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. Ou um bloqueio SCH-M (Modificação de Esquema) será adquirido quando um índice clusterizado for criado ou descartado online e quando um índice clusterizado ou não clusterizado estiver sendo recriado.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. Não será possível definir ONLINE como ON quando um índice estiver sendo criado em uma tabela temporária local.ONLINE can't be set to ON when an index is being created on a local temporary table. Apenas a operação de reconstrução de heap de thread único é permitida.Only single-threaded heap rebuild operation is allowed.

Para executar a DDL de SWITCH ou a recompilação de índice online, todas as transações de bloqueio ativas em execução em uma tabela específica devem ser concluídas.To run the DDL for SWITCH or online index rebuild, all active blocking transactions running on a particular table must be completed. Durante a execução, SWITCH ou a operação de recompilação impede que a nova transação seja iniciada e pode afetar significativamente a taxa de transferência da carga de trabalho e atrasar temporariamente o acesso à tabela subjacente.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.

OFF Os bloqueios de tabela são aplicados enquanto durar a operação de índice.OFF Table locks apply for the duration of the index operation. Uma operação de índice offline que cria, recria ou cancela um índice clusterizado ou recria ou cancela um índice não clusterizado, adquire um bloqueio de esquema de modificação (Sch-M) na tabela.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. Isso impede o acesso de todos os usuários à tabela subjacente enquanto durar a operação.This lock prevents all user access to the underlying table for the duration of the operation. Uma operação de índice offline que cria um índice não clusterizado adquire um bloqueio Compartilhado (S) na tabela.An offline index operation that creates a nonclustered index acquires a Shared (S) lock on the table. Isso impede atualizações na tabela subjacente, mas permite operações de leitura, como instruções SELECT.This lock prevents updates to the underlying table but allows read operations, such as SELECT statements. Permite operações de reconstrução de heap multi-threaded.Multi-threaded heap rebuild operations are allowed.

Para obter mais informações, consulte Como funcionam as operações de índice online.For more information, see How Online Index Operations Work.

Observação

As operações de índice online não estão disponíveis em todas as edições do SQL ServerSQL Server.Online index operations are not available in every edition of SQL ServerSQL Server. Para saber mais, confira Edições e recursos com suporte para o SQL Server 2016 e Edições e recursos com suporte para o SQL Server 2017.For more information, see Editions and Supported Features for SQL Server 2016, and Editions and Supported Features for SQL Server 2017.

MOVER PARA { partition_scheme_name(column_name [ 1 ,n] ) | filegroup | " default " } Aplica-se a: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 por meio de SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.MOVE TO { partition_scheme_name(column_name [ 1 , ... n] ) | filegroup | " default " } Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Especifica o local para onde mover as linhas de dados atualmente no nível folha do índice clusterizado.Specifies a location to move the data rows currently in the leaf level of the clustered index. A tabela é movida para o novo local.The table is moved to the new location. Esta opção se aplica apenas a restrições que criam um índice clusterizado.This option applies only to constraints that create a clustered index.

Observação

Nesse contexto, default não é uma palavra-chave.In this context, default isn't a keyword. É um identificador do grupo de arquivos padrão e deve ser delimitado, como em MOVE TO " default " ou MOVE TO [ default ].It is an identifier for the default filegroup and must be delimited, as in MOVE TO " default " or MOVE TO [ default ]. Se " default " for especificado, a opção QUOTED_IDENTIFIER deverá ser ON para a sessão atual.If " default " is specified, the QUOTED_IDENTIFIER option must be ON for the current session. Essa é a configuração padrão.This is the default setting. Para saber mais, confira SET QUOTED_IDENTIFIER.For more information, see SET QUOTED_IDENTIFIER.

{ CHECK | NOCHECK } CONSTRAINT Especifica que constraint_name está habilitado ou desabilitado.{ CHECK | NOCHECK } CONSTRAINT Specifies that constraint_name is enabled or disabled. Essa opção só pode ser usada com restrições FOREIGN KEY e CHECK.This option can only be used with FOREIGN KEY and CHECK constraints. Quando NOCHECK é especificado, a restrição é desabilitada e futuras inserções ou atualizações da coluna não são validadas com relação às condições de restrição.When NOCHECK is specified, the constraint is disabled and future inserts or updates to the column are not validated against the constraint conditions. As restrições DEFAULT, PRIMARY KEY e UNIQUE não podem ser desabilitadas.DEFAULT, PRIMARY KEY, and UNIQUE constraints can't be disabled.

ALL Especifica que todas as restrições são desabilitadas com a opção NOCHECK ou habilitadas com a opção CHECK.ALL Specifies that all constraints are either disabled with the NOCHECK option or enabled with the CHECK option.

{ ENABLE | DISABLE } TRIGGER Especifica que trigger_name está habilitado ou desabilitado.{ ENABLE | DISABLE } TRIGGER Specifies that trigger_name is enabled or disabled. Quando um gatilho é desabilitado, ele ainda permanece definido para a tabela.When a trigger is disabled, it's still defined for the table. Porém, quando a instrução INSERT, UPDATE ou DELETE é executada na tabela, as ações no gatilho não são realizadas até que ele seja reabilitado.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.

ALL Especifica que todos os gatilhos na tabela são habilitados ou desabilitados.ALL Specifies that all triggers in the table are enabled or disabled.

trigger_name Especifica o nome do gatilho a ser desabilitado ou habilitado.trigger_name Specifies the name of the trigger to disable or enable.

{HABILITAR | DESABILITAR} CHANGE_TRACKING Aplica-se ao: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 por meio do SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.{ ENABLE | DISABLE } CHANGE_TRACKING Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Especifica se controle de alterações está habilitado ou desabilitado para a tabela.Specifies whether change tracking is enabled disabled for the table. Por padrão, o controle de alterações está desabilitado.By default, change tracking is disabled.

Essa opção só estará disponível quando o controle de alterações estiver habilitado para o banco de dados.This option is available only when change tracking is enabled for the database. Para obter mais informações, veja Opções ALTER DATABASE SET (Transact-SQL).For more information, see ALTER DATABASE SET Options.

Para habilitar o controle de alterações, a tabela deve ter uma chave primária.To enable change tracking, the table must have a primary key.

COM o ( TRACK_COLUMNS_UPDATED = {ON | OFF } ) Aplica-se ao: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 por meio de SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } ) Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Especifica se o Mecanismo de Banco de DadosDatabase Engine controla quais colunas com alteração controlada foram atualizadas.Specifies whether the Mecanismo de Banco de DadosDatabase Engine tracks, which change tracked columns were updated. O valor padrão é 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 ] Aplica-se a: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 por meio de SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.] target_table [ PARTITION target_partition_number_expression ] Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Alterna um bloco de dados em um dos seguintes modos:Switches a block of data in one of the following ways:

  • Reatribui todos os dados de uma tabela como uma partição para uma tabela particionada já existente.Reassigns all data of a table as a partition to an already-existing partitioned table.
  • Alterna uma partição de uma tabela particionada para outra.Switches a partition from one partitioned table to another.
  • Reatribui todos os dados em uma partição de uma tabela particionada para uma tabela não particionada existente.Reassigns all data in one partition of a partitioned table to an existing non-partitioned table.

Se tabela for uma tabela particionada, será preciso especificar expressão_do_número_da_partição_de_origem.If table is a partitioned table, you must specify source_partition_number_expression. Se tabela_de_destino for uma tabela particionada, será preciso especificar expressão_do_número_da_partição_de_destino.If target_table is partitioned, you must specify target_partition_number_expression. Na reatribuição dos dados de uma tabela com uma partição para uma tabela particionada já existente ou alternando uma partição de uma tabela particionada para outra, a partição de destino deve existir e estar vazia.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.

Na reatribuição dos dados de uma partição para formar uma tabela única, a tabela de destino já deve existir e estar vazia.When reassigning one partition's data to form a single table, the target table must already exist and it must be empty. A tabela de origem ou a partição e a tabela de destino ou a partição devem estar localizadas no mesmo grupo de arquivos.Both the source table or partition, and the target table or partition, must be located in the same filegroup. Os índices correspondentes ou as partições de índice também devem estar localizadas no mesmo grupo de arquivos.The corresponding indexes, or index partitions, must also be located in the same filegroup. Muitas restrições adicionais são aplicadas para alternância de partições.Many additional restrictions apply to switching partitions. tabela e tabela_de_destino não podem ser iguais.table and target_table can't be the same. target_table pode ser um identificador de várias partes.target_table can be a multi-part identifier.

source_partition_number_expression e target_partition_number_expression são expressões de constante que podem fazer referência a variáveis e funções.source_partition_number_expression and target_partition_number_expression are constant expressions that can reference variables and functions. Eles incluem variáveis de tipo definidas pelo usuário e funções definidas pelo usuário.These include user-defined type variables and user-defined functions. Eles não podem referenciar expressões Transact-SQLTransact-SQL.They can't reference Transact-SQLTransact-SQL expressions.

Uma tabela particionada com um índice clusterizado columnstore se comporta como um heap particionado:A partitioned table with a clustered columstore index behaves like a partitioned heap:

  • A chave primária deve incluir a chave de partição.The primary key must include the partition key.
  • Um índice exclusivo deve incluir a chave de partição.A unique index must include the partition key. Incluir a chave de partição com um índice exclusivo existente pode alterar a exclusividade.But, including the partition key with an existing unique index can change the uniqueness.
  • Para mudar as partições, todos os índices não clusterizados devem incluir a chave de partição.To switch partitions, all non-clustered indexes must include the partition key.

Para a restrição SWITCH ao usar replicação, consulte Replicar tabelas e índices particionados.For SWITCH restriction when using replication, see Replicate Partitioned Tables and Indexes.

Índices columnstore não clusterizados criados para SQL ServerSQL Server 2016 CTP1 e para o Banco de Dados SQL antes da versão V12 estavam em um formato somente leitura.Nonclustered columnstore indexes built for SQL ServerSQL Server 2016 CTP1, and for SQL Database before version V12 were in a read-only format. É preciso recompilar índices columnstore não clusterizado para o formato atual (que é atualizável) antes de quaisquer operações de partição serem executadas.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 " }) Aplica-se a: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 por meio de SQL Server 2017SQL Server 2017).SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | " default " | " NULL " }) Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017). Banco de dados SQL do AzureAzure SQL Database não dá suporte a FILESTREAM.doesn't support FILESTREAM.

Especifica onde os dados FILESTREAM são armazenados.Specifies where FILESTREAM data is stored.

ALTER TABLE com a cláusula SET FILESTREAM_ON só terá sucesso se a tabela não tiver nenhuma coluna FILESTREAM.ALTER TABLE with the SET FILESTREAM_ON clause succeeds only if the table has no FILESTREAM columns. É possível adicionar colunas FILESTREAM usando uma segunda instrução ALTER TABLE.You can add FILESTREAM columns by using a second ALTER TABLE statement.

Se você especificar partition_scheme_name, as regras para CREATE TABLE se aplicarão.If you specify partition_scheme_name, the rules for CREATE TABLE apply. A tabela já deve estar particionada para dados de linha e seu esquema de partição usa a mesma função de partição e colunas que o esquema de partição 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 especifica o nome de um grupo de arquivos FILESTREAM.filestream_filegroup_name specifies the name of a FILESTREAM filegroup. O grupo de arquivos deve ter um arquivo definido para o grupo de arquivos usando uma instrução CREATE DATABASE ou ALTER DATABASE. Caso contrário, será gerado um erro.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 " especifica o grupo de arquivos FILESTREAM com a propriedade DEFAULT definida." default " specifies the FILESTREAM filegroup with the DEFAULT property set. Se não houver um grupo de arquivos FILESTREAM, ocorrerá um erro.If there's no FILESTREAM filegroup, an error results.

" NULL " especifica que sejam removidas todas as referências para grupos de arquivos FILESTREAM para a tabela." NULL " specifies that all references to FILESTREAM filegroups for the table are removed. Todas as colunas FILESTREAM devem ser descartadas primeiro.All FILESTREAM columns must be dropped first. Use SET FILESTREAM_ON =" NULL " para excluir todos os dados FILESTREAM associados a uma tabela.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 } ] ) ] } ) Aplica-se a: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) tpor meio de SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ]) ] } ) Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Desabilita ou habilita o controle de versão do sistema de uma tabela.Either disables or enables system versioning of a table. Para habilitar o controle de versão do sistema de uma tabela, o sistema verifica se o tipo de dados, a restrição de nulidade e requisitos de restrição de chave primária para o controle de versão do sistema são atendidos.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. Se você não usar o argumento HISTORY_TABLE, o sistema gerará uma nova tabela de histórico correspondendo ao esquema da tabela atual, criando um link entre as duas tabelas e permitindo que o sistema registre o histórico de cada registro na tabela atual na tabela de histórico.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. O nome desta tabela de histórico será MSSQL_TemporalHistoryFor<primary_table_object_id>.The name of this history table will be MSSQL_TemporalHistoryFor<primary_table_object_id>. Se o argumento HISTORY_TABLE for usado para criar um vínculo e usar a tabela de histórico existente, o sistema criará um vínculo entre a tabela atual e a tabela especificada.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. Ao criar um link para uma tabela de histórico existente, você pode optar por executar uma verificação de consistência de dados.When creating a link to an existing history table, you can choose to do a data consistency check. Essa verificação de consistência de dados garante que os registros existentes não se sobreponham.This data consistency check ensures that existing records don't overlap. A execução da verificação de consistência dos dados é o padrão.Running the data consistency check is the default. Para saber mais, veja Temporal Tables.For more information, see Temporal Tables.

HISTORY_RETENTION_PERIOD = { INFINITE | number {DAY | DAYS | WEEK | WEEKS | MONTH | MONTHS | YEAR | YEARS} } Aplica-se a: Banco de dados SQL do AzureAzure SQL Database.HISTORY_RETENTION_PERIOD = { INFINITE | number {DAY | DAYS | WEEK | WEEKS | MONTH | MONTHS | YEAR | YEARS} } Applies to: Banco de dados SQL do AzureAzure SQL Database.

Especifica a retenção finita ou infinita para dados históricos em tabela temporais.Specifies finite or infinite retention for historical data in a temporal table. Se omitido, será presumida retenção infinita.If omitted, infinite retention is assumed.

SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } ) Aplica-se a: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 por meio de SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } ) Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Especifica os métodos permitidos de escalonamento de bloqueios para uma tabela.Specifies the allowed methods of lock escalation for a table.

AUTO Essa opção permite que o Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine selecione a granularidade do escalonamento de bloqueios apropriado para o esquema da tabela.AUTO This option allows Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine to select the lock escalation granularity that's appropriate for the table schema.

  • Se a tabela não estiver particionada, o escalonamento de bloqueios será permitido para particionar.If the table is partitioned, lock escalation is allowed to partition. Depois de ser escalonado para o nível de partição, o bloqueio não será escalonado posteriormente para a granularidade TABLE.After the lock is escalated to the partition level, the lock won't be escalated later to TABLE granularity.
  • Se a tabela não estiver particionada, o escalonamento de bloqueios será feito para a granularidade TABLE.If the table isn't partitioned, the lock escalation is done to the TABLE granularity.

TABLE Lock O escalonamento de bloqueios será feito na granularidade em nível de tabela, esteja a tabela particionada ou não.TABLE Lock escalation is done at table-level granularity whether the table is partitioned or not partitioned. TABLE é o valor padrão.TABLE is the default value.

DISABLE Impede o escalonamento de bloqueios na maioria dos casos.DISABLE Prevents lock escalation in most cases. Os bloqueios em nível de tabela não são totalmente desautorizados.Table-level locks aren't completely disallowed. Por exemplo, quando você está verificando uma tabela que não tem nenhum índice clusterizado no nível de isolamento serializável, o Mecanismo de Banco de DadosDatabase Engine deve usar um bloqueio de tabela para proteger a integridade dos dados.For example, when you're scanning a table that has no clustered index under the serializable isolation level, Mecanismo de Banco de DadosDatabase Engine must take a table lock to protect data integrity.

REBUILD Use a sintaxe REBUILD WITH para recriar uma tabela inteira que inclui todas as partições em uma tabela particionada.REBUILD Use the REBUILD WITH syntax to rebuild an entire table including all the partitions in a partitioned table. Se a tabela tiver um índice clusterizado, a opção REBUILD recriará o índice clusterizado.If the table has a clustered index, the REBUILD option rebuilds the clustered index. REBUILD pode ser executado como uma operação ONLINE.REBUILD can be run as an ONLINE operation.

Use a sintaxe REBUILD PARTITION para recriar uma única partição em uma tabela particionada.Use the REBUILD PARTITION syntax to rebuild a single partition in a partitioned table.

PARTITION = All Aplica-se a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.PARTITION = ALL Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Recria todas as partições ao alterar as configurações de compactação da partição.Rebuilds all partitions when changing the partition compression settings.

REBUILD WITH ( <rebuild_option> ) Todas as opções se aplicam a uma tabela com um índice clusterizado.REBUILD WITH ( <rebuild_option> ) All options apply to a table with a clustered index. Se a tabela não tiver um índice clusterizado, a estrutura de heap será afetada somente por algumas opções.If the table doesn't have a clustered index, the heap structure is only affected by some of the options.

Quando uma configuração de compactação específica não é especificada com a operação REBUILD, a configuração de compactação atual da partição é usada.When a specific compression setting isn't specified with the REBUILD operation, the current compression setting for the partition is used. Para retornar à configuração atual, consulte a coluna data_compression na exibição do catálogo sys.partitions.To return the current setting, query the data_compression column in the sys.partitions catalog view.

Para obter descrições completas das opções de recompilação, veja index_option.For complete descriptions of the rebuild options, see index_option.

DATA_COMPRESSION Aplica-se a: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 por meio de SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.DATA_COMPRESSION Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Especifica a opção de compactação de dados para a tabela, o número de partição ou o intervalo de partições especificado.Specifies the data compression option for the specified table, partition number, or range of partitions. As opções são as seguintes:The options are as follows:

NONE A tabela ou as partições especificadas não são compactadas.NONE Table or specified partitions aren't compressed. Essa opção não se aplica a tabelas columnstore.This option doesn't apply to columnstore tables.

ROW A tabela ou as partições especificadas são compactadas usando a compactação de linha.ROW Table or specified partitions are compressed by using row compression. Essa opção não se aplica a tabelas columnstore.This option doesn't apply to columnstore tables.

PAGE A tabela ou as partições especificadas são compactadas usando a compactação de página.PAGE Table or specified partitions are compressed by using page compression. Essa opção não se aplica a tabelas columnstore.This option doesn't apply to columnstore tables.

COLUMNSTORE Aplica-se a: SQL ServerSQL Server (SQL Server 2014 (12.x)SQL Server 2014 (12.x) por meio de SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.COLUMNSTORE Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Aplica-se somente a tabelas columnstore.Applies only to columnstore tables. COLUMNSTORE especifica a descompactação de uma partição compactada com a opção COLUMNSTORE_ARCHIVE.COLUMNSTORE specifies to decompress a partition that was compressed with the COLUMNSTORE_ARCHIVE option. Quando os dados forem restaurados, eles continuarão sendo compactados por meio da compactação columnstore usada em todas as tabelas columnstore.When the data is restored, it continues to be compressed with the columnstore compression that's used for all columnstore tables.

COLUMNSTORE_ARCHIVE Aplica-se a: SQL ServerSQL Server (SQL Server 2014 (12.x)SQL Server 2014 (12.x) por meio de SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.COLUMNSTORE_ARCHIVE Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Aplica-se a tabelas columnstore, que são armazenadas com um índice columnstore clusterizado.Applies only to columnstore tables, which are tables stored with a clustered columnstore index. COLUMNSTORE_ARCHIVE compactará ainda mais a partição especificada para um tamanho menor.COLUMNSTORE_ARCHIVE will further compress the specified partition to a smaller size. Use essa opção para fins de arquivamento ou em outras situações que exijam menos armazenamento e possam dispensar mais tempo para armazenamento e recuperação.Use this option for archival or other situations that require less storage and can afford more time for storage and retrieval.

Para recompilar várias partições ao mesmo tempo, veja index_option.To rebuild multiple partitions at the same time, see index_option. Se a tabela não tiver um índice clusterizado, alterar a compactação de dados recriará o heap e os índices não clusterizados.If the table doesn't have a clustered index, changing the data compression rebuilds the heap and the nonclustered indexes. Para obter mais informações sobre compactação, consulte Compactação de dados.For more information about compression, see Data Compression.

ONLINE = { ON | OFF } <conforme se aplica a single_partition_rebuild_option> Especifica se uma única partição das tabelas subjacentes e os índices associados estão disponíveis para consultas e modificação de dados durante a operação de índice.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. O padrão é OFF.The default is OFF. É possível executar REBUILD como uma operação ONLINE.You can run REBUILD as an ONLINE operation.

ON Bloqueios de tabela de longa duração não são mantidos durante a operação do índice.ON Long-term table locks aren't held for the duration of the index operation. Um bloqueio S na tabela é exigido no início da recompilação de índice e um bloqueio Sch-M na tabela no final da recompilação de índice online.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. Embora ambos os bloqueios sejam bloqueios de metadados curtos, o bloqueio Sch-M deve esperar que todas as transações de bloqueio sejam concluídas.Although both locks are short metadata locks, the Sch-M lock must wait for all blocking transactions to be completed. Durante o tempo de espera, o bloqueio Sch-M bloqueia todas as transações restantes que esperam atrás desse bloqueio ao acessar a mesma tabela.During the wait time,, the Sch-M lock blocks all other transactions that wait behind this lock when accessing the same table.

Observação

A recompilação de índice online pode definir as opções low_priority_lock_wait descritas posteriormente nesta seção.Online index rebuild can set the low_priority_lock_wait options described later in this section.

OFF Os bloqueios de tabela são aplicados enquanto durar a operação de índice.OFF Table locks are applied for the duration of the index operation. Isso evita o acesso de todos os usuários à tabela subjacente enquanto durar a operação.This prevents all user access to the underlying table for the duration of the operation.

column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS Aplica-se a: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 por meio de SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

O nome do conjunto de colunas.The name of the column set. Um conjunto de colunas é uma representação em XML sem-tipo que combina todas as colunas esparsas de uma tabela em uma saída estruturada.A column set is an untyped XML representation that combines all of the sparse columns of a table into a structured output. Um conjunto de colunas não pode ser adicionado a uma tabela que contém colunas esparsas.A column set can't be added to a table that contains sparse columns. Para obter mais informações sobre conjuntos de colunas, veja Usar conjuntos de colunas.For more information about column sets, see Use Column Sets.

{ ENABLE | DISABLE } FILETABLE_NAMESPACE Aplica-se a: SQL ServerSQL Server ( SQL Server 2012 (11.x)SQL Server 2012 (11.x) por meio de SQL Server 2017SQL Server 2017).{ ENABLE | DISABLE } FILETABLE_NAMESPACE Applies to: SQL ServerSQL Server ( SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017).

Habilita ou desabilita as restrições definidas pelo sistema em uma FileTable.Enables or disables the system-defined constraints on a FileTable. Pode ser usado apenas com uma FileTable.Can only be used with a FileTable.

SET ( FILETABLE_DIRECTORY = directory_name ) Aplica-se a: SQL ServerSQL Server ) SQL Server 2012 (11.x)SQL Server 2012 (11.x) por meio de SQL Server 2017SQL Server 2017.SET ( FILETABLE_DIRECTORY = directory_name ) Applies to: SQL ServerSQL Server ) SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017. Banco de dados SQL do AzureAzure SQL Database não dá suporte a FILETABLE.doesn't support FILETABLE.

Especifica o nome do diretório de FileTable compatível com o Windows.Specifies the Windows-compatible FileTable directory name. Esse nome deve ser exclusivo entre todos os nomes de diretórios de FileTable no banco de dados.This name should be unique among all the FileTable directory names in the database. A comparação de exclusividade não diferencia maiúsculas de minúsculas, apesar das configurações de ordenação do SQL.Uniqueness comparison is case-insensitive, despite the SQL collation settings. Pode ser usado apenas com uma 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] )
        } )

Aplica-se a: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) a 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).

Habilita ou desabilita o Stretch Database para uma tabela.Enables or disables Stretch Database for a table. Saiba mais em Stretch Database.For more information, see Stretch Database.

Habilitar o Stretch Database para uma tabelaEnabling Stretch Database for a table

Quando você habilita Stretch para uma tabela especificando ON, também precisa especificar MIGRATION_STATE = OUTBOUND, para começar a migração de dados imediatamente, ou MIGRATION_STATE = PAUSED, para adiar a migração de dados.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. O valor padrão é MIGRATION_STATE = OUTBOUND.The default value is MIGRATION_STATE = OUTBOUND. Saiba mais sobre como habilitar o Stretch para uma tabela em Habilitar o Stretch Database para uma tabela.For more information about enabling Stretch for a table, see Enable Stretch Database for a table.

Pré-requisitos.Prerequisites. Antes de habilitar o Stretch para uma tabela, você precisa habilitar o Stretch no servidor e no banco de dados.Before you enable Stretch for a table, you have to enable Stretch on the server and on the database. Saiba mais em Enable Stretch Database for a database.For more information, see Enable Stretch Database for a database.

Permissões.Permissions. Habilitar o Stretch para um banco de dados ou uma tabela exige permissões db_owner.Enabling Stretch for a database or a table requires db_owner permissions. Habilitar o Stretch em uma tabela também requer permissões ALTER na tabela.Enabling Stretch for a table also requires ALTER permissions on the table.

Desabilitando o Stretch Database para uma tabelaDisabling Stretch Database for a table

Quando você desabilitar o Stretch para uma tabela, tem duas opções para os dados remotos que já foram migrados para o Azure.When you disable Stretch for a table, you have two options for the remote data that's already been migrated to Azure. Saiba mais em Desabilitar Stretch Database e trazer de volta dados remotos.For more information, see Disable Stretch Database and bring back remote data.

  • Para desabilitar o Stretch de uma tabela e copiar os dados remotos da tabela do Azure de volta para o SQL Server, execute o comando a seguir.To disable Stretch for a table and copy the remote data for the table from Azure back to SQL Server, run the following command. Esse comando não pode ser cancelado.This command can't be canceled.

    ALTER TABLE \<table name>
       SET ( REMOTE_DATA_ARCHIVE ( MIGRATION_STATE = INBOUND ) ) ;
    

Essa operação incorre em custos de transferência de dados, e não pode ser cancelada.This operation incurs data transfer costs, and it can't be canceled. Saiba mais em Detalhes de preços de transferências de dados.For more information, see Data Transfers Pricing Details.

Depois que todos os dados remotos forem copiados do Azure de volta para o SQL Server, o Stretch será desabilitado para a tabela.After all the remote data has been copied from Azure back to SQL Server, Stretch is disabled for the table.

  • Para desabilitar o Stretch de uma tabela e abandonar os dados remotos, execute o comando a seguir.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 ) ) ;
    

Depois de desabilitar o Stretch Database de uma tabela, a migração de dados é interrompida e os resultados da consulta não incluem mais resultados da tabela remota.After you disable Stretch Database for a table, data migration stops and query results no longer include results from the remote table.

Desabilitar o Stretch não remove a tabela remota.Disabling Stretch doesn't remove the remote table. Se você quiser excluir o banco de dados remoto, descarte-o usando o portal do Azure.If you want to delete the remote table, you drop it by using the Azure portal.

[ FILTER_PREDICATE = { null | predicate } ] Aplica-se a: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) por meio de SQL Server 2017SQL Server 2017).[ FILTER_PREDICATE = { null | predicate } ] Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through SQL Server 2017SQL Server 2017).

Opcionalmente, especifique um predicado de filtro para selecionar linhas para migrar de uma tabela que contém dados atuais e históricos.Optionally specifies a filter predicate to select rows to migrate from a table that contains both historical and current data. O predicado deve chamar uma função com valor de tabela embutido determinística.The predicate must call a deterministic inline table-valued function. Saiba mais em Habilitar Stretch Database para uma tabela e Selecionar linhas a serem migradas usando uma função de filtro – Stretch Database.For more information, see Enable Stretch Database for a table and Select rows to migrate by using a filter function - Stretch Database.

Importante

Se você fornecer um predicado de filtro precário, a migração de dados também será precária.If you provide a filter predicate that performs poorly, data migration also performs poorly. O Stretch Database aplica o predicado de filtro à tabela usando o operador CROSS APPLY.Stretch Database applies the filter predicate to the table by using the CROSS APPLY operator.

Se você não especificar um predicado de filtro, a tabela inteira será migrada.If you don't specify a filter predicate, the entire table is migrated.

Quando você especifica um predicado de filtro, também precisa especificar MIGRATION_STATE.When you specify a filter predicate, you also have to specify MIGRATION_STATE.

MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED } Aplica-se a: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) por meio de SQL Server 2017SQL Server 2017).MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED } Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through SQL Server 2017SQL Server 2017).

WAIT_AT_LOW_PRIORITY Aplica-se a: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) por meio de SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.WAIT_AT_LOW_PRIORITY Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Uma recriação de índice online precisa aguardar as operações de bloqueio nesta tabela.An online index rebuild has to wait for blocking operations on this table. WAIT_AT_LOW_PRIORITY indica que a operação de recompilação do índice online aguarda bloqueios de baixa prioridade, permitindo que outras operações sejam realizadas enquanto a operação de compilação de índice online está aguardando.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. Omitir a opção WAIT AT LOW PRIORITY é o mesmo que 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 = tempo [MINUTOS ] aplica-se a: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) por meio de SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.MAX_DURATION = time [MINUTES ] Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

O tempo de espera, que é um valor inteiro especificado em minutos, que a opção SWITCH ou os bloqueios de recompilação de índice online aguardam com baixa prioridade ao executar o comando 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. Se a operação for bloqueada por MAX_DURATION, uma das ações de ABORT_AFTER_WAIT será executada.If the operation is blocked for the MAX_DURATION time, one of the ABORT_AFTER_WAIT actions will run. O tempo MAX_DURATION está sempre em minutos, e a palavra MINUTES pode ser omitida.MAX_DURATION time is always in minutes, and you can omit the word MINUTES.

ABORT_AFTER_WAIT = [NONE | SELF | BLOQUEADORES }] aplica-se a: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) por meio SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ] Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

NONE Continue aguardando o bloqueio com prioridade normal (regular).NONE Continue waiting for the lock with normal (regular) priority.

SELF Saia da operação DDL de recompilação de índice online ou SWITCH em execução no momento sem realizar nenhuma ação.SELF Exit the SWITCH or online index rebuild DDL operation currently being run without taking any action.

BLOCKERS Encerre todas as transações de usuário que bloqueiam atualmente a opção SWITCH ou a operação DDL de recompilação de índice online para que a operação possa continuar.BLOCKERS Kill all user transactions that currently block the SWITCH or online index rebuild DDL operation so that the operation can continue.

Requer a permissão ALTER ANY CONNECTION.Requires ALTER ANY CONNECTION permission.

IF EXISTS Aplica-se a: SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) por meio de SQL Server 2017SQL Server 2017) e Banco de dados SQL do AzureAzure SQL Database.IF EXISTS Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017) and Banco de dados SQL do AzureAzure SQL Database.

Descartará condicionalmente a coluna ou restrição somente se ela já existir.Conditionally drops the column or constraint only if it already exists.

RemarksRemarks

Para adicionar novas linhas de dados, use INSERT.To add new rows of data, use INSERT. Para remover linhas de dados, use DELETE ou TRUNCATE TABLE.To remove rows of data, use DELETE or TRUNCATE TABLE. Para modificar os valores nas linhas existentes, use UPDATE.To change the values in existing rows, use UPDATE.

Se houver qualquer plano de execução no cache de procedimento que referencie a tabela, ALTER TABLE o marcará para que seja recompilado na próxima execução.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.

Alterando o tamanho de uma colunaChanging the Size of a Column

É possível alterar o comprimento, a precisão ou a escala de uma coluna, especificando um novo tamanho para o tipo de dados da coluna.You can change the length, precision, or scale of a column by specifying a new size for the column data type. Use a cláusula ALTER COLUMN.Use the ALTER COLUMN clause. Se dados existirem na coluna, o novo tamanho não poderá ser menor do que o tamanho máximo dos dados.If data exists in the column, the new size can't be smaller than the maximum size of the data. Além disso, não é possível definir a coluna em um índice, a menos que a coluna seja um tipo de dados varchar, nvarchar ou varbinary e o índice não seja o resultado de uma restrição 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. Consulte o exemplo P.See example P.

Bloqueios e ALTER TABLELocks and ALTER TABLE

As alterações especificadas em ALTER TABLE são implementadas imediatamente.Changes you specify in ALTER TABLE implement immediately. Se as alterações requererem modificações das linhas na tabela, ALTER TABLE atualizará as linhas.If the changes require modifications of the rows in the table, ALTER TABLE updates the rows. ALTER TABLE adquire um bloqueio de modificação de esquema (SCH-M) na tabela para se certificar de que nenhuma outra conexão referencie nem mesmo os metadados da tabela durante a alteração, exceto as operações de índice online que exigem um bloqueio SCH-M curto no final.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. Em uma operação ALTER TABLE...SWITCH, o bloqueio é adquirido em tabelas de origem e de destino.In an ALTER TABLE...SWITCH operation, the lock is acquired on both the source and target tables. As modificações feitas na tabela são registradas e completamente recuperáveis.The modifications made to the table are logged and fully recoverable. As alterações que afetam todas as linhas em tabelas grandes, como descartar uma coluna ou, em algumas edições do SQL ServerSQL Server, adicionar uma coluna NOT NULL com um valor padrão, podem demorar muito tempo para serem concluídas e gerar muitos registros de log.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. Execute essas instruções ALTER TABLE com o mesmo cuidado de outras instruções INSERT, UPDATE ou DELETE que podem afetar várias linhas.Run these ALTER TABLE statements with the same care as any INSERT, UPDATE, or DELETE statement that affects many rows.

Adicionando colunas NOT NULL como uma operação onlineAdding NOT NULL Columns as an Online Operation

Começando com o SQL Server 2012 (11.x)SQL Server 2012 (11.x) Enterprise Edition, a adição de uma coluna NOT NULL com um valor padrão é uma operação online quando o valor padrão é uma constante de tempo de execução.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. Isso significa que a operação é concluída quase instantaneamente, apesar do número de linhas na tabela.This means that the operation is completed almost instantaneously despite the number of rows in the table. Isso porque as linhas existentes na tabela não são atualizadas durante a operação.Because, the existing rows in the table aren't updated during the operation. Em vez disso, o valor padrão é armazenado somente nos metadados da tabela e o valor é pesquisado conforme necessário em consultas que acessam essas linhas.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. Esse comportamento é automático.This behavior is automatic. Nenhuma sintaxe adicional é necessária para implementar a operação online, além da sintaxe ADD COLUMN.No additional syntax is required to implement the online operation beyond the ADD COLUMN syntax. Uma constante de tempo de execução é uma expressão que gera o mesmo valor no tempo de execução para cada linha na tabela, independentemente de seu determinismo.A runtime constant is an expression that produces the same value at runtime for each row in the table despite its determinism. Por exemplo, a expressão constante "Meus dados temporários" ou a função do sistema GETUTCDATETIME() são constantes de tempo de execução.For example, the constant expression "My temporary data", or the system function GETUTCDATETIME() are runtime constants. Por outro lado, as funções NEWID() ou NEWSEQUENTIALID() não são constantes de tempo de execução porque é gerado um valor exclusivo para cada linha da tabela.In contrast, the functions NEWID() or NEWSEQUENTIALID() aren't runtime constants, because a unique value is produced for each row in the table. A adição de uma coluna NOT NULL com um valor padrão que não é uma constante de tempo de execução é sempre executada offline e um bloqueio exclusivo (SCH-M) é adquirido para a duração da operação.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.

Enquanto as linhas existentes referenciam o valor armazenado nos metadados, o valor padrão é armazenado na linha para qualquer nova linha inserida e não especifica outro valor para a coluna.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. O valor padrão armazenado nos metadados é movido para uma linha existente quando a linha é atualizada (mesmo que a coluna real não seja especificada na instrução UPDATE) ou quando a tabela ou o índice clusterizado é recompilado.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.

Colunas do tipo varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography ou CLR UDTS não podem ser adicionadas a uma operação online.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. Não será possível adicionar uma coluna online se isso fizer o tamanho máximo de linha possível exceder o limite de 8.060 bytes.A column can't be added online if doing so causes the maximum possible row size to exceed the 8,060-byte limit. Nesse caso, a coluna é adicionada como uma operação offline.The column is added as an offline operation in this case.

Execução de plano paraleloParallel Plan Execution

No Microsoft SQL Server 2012 EnterpriseMicrosoft SQL Server 2012 Enterprise e superior, o número de processadores empregados para executar uma instrução ALTER TABLE ADD (baseada em índice) CONSTRAINT ou DROP (índice clusterizado) CONSTRAINT é determinado pela opção de configuração grau máximo de paralelismo e pela atual carga de trabalho.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. Se o Mecanismo de Banco de DadosDatabase Engine detectar que o sistema está ocupado, o grau de paralelismo da operação será automaticamente reduzido antes do início da execução da instrução.If the Mecanismo de Banco de DadosDatabase Engine detects that the system is busy, the degree of parallelism of the operation is automatically reduced before statement execution starts. É possível configurar manualmente o número de processadores usados para executar a instrução, especificando a opção de índice MAXDOP.You can manually configure the number of processors that are used to run the statement by specifying the MAXDOP option. Para obter mais informações, veja Configurar a opção max degree of parallelism de configuração de servidor.For more information, see Configure the max degree of parallelism Server Configuration Option.

Tabelas particionadasPartitioned Tables

Além de realizar operações SWITCH que envolvem tabelas particionadas, use ALTER TABLE para alterar o estado de colunas, restrições e gatilhos de uma tabela particionada, exatamente da mesma forma que é usado em tabelas não particionadas.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. Porém, essa instrução não pode ser usada para alterar o modo que a própria tabela é particionada.However, this statement can't be used to change the way the table itself is partitioned. Para reparticionar uma tabela particionada, use ALTER PARTITION SCHEME e ALTER PARTITION FUNCTION.To repartition a partitioned table, use ALTER PARTITION SCHEME and ALTER PARTITION FUNCTION. Além disso, não é possível alterar o tipo de dados de uma coluna em uma tabela particionada.Additionally, you can't change the data type of a column of a partitioned table.

Restrições em tabelas com exibições associadas a esquemaRestrictions on Tables with Schema-Bound Views

As restrições que se aplicam a instruções ALTER TABLE em tabelas com exibições associadas a esquema são as mesmas atualmente aplicadas ao modificar tabelas com um índice simples.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. É permitido adicionar uma coluna.Adding a column is allowed. Porém, não é permitido remover ou alterar uma coluna que participa de qualquer exibição associada a esquema.However, removing or changing a column that participates in any schema-bound view isn't allowed. Se a instrução ALTER TABLE requerer a alteração de uma coluna usada em uma exibição associada a esquema, ALTER TABLE irá falhar e o Mecanismo de Banco de DadosDatabase Engine gerará uma mensagem de erro.If the ALTER TABLE statement requires changing a column used in a schema-bound view, ALTER TABLE fails and the Mecanismo de Banco de DadosDatabase Engine raises an error message. Para obter mais informações sobre associação de esquema e exibições indexadas, veja CREATE VIEW.For more information about schema binding and indexed views, see CREATE VIEW.

A adição ou remoção de gatilhos em tabelas base não é afetada pela criação de uma exibição associada a esquema que referencia tabelas.Adding or removing triggers on base tables isn't affected by creating a schema-bound view that references the tables.

Índices e ALTER TABLEIndexes and ALTER TABLE

Os índices criados como parte de uma restrição são descartados quando a restrição é descartada.Indexes created as part of a constraint are dropped when the constraint is dropped. Os índices criados com CREATE INDEX devem ser descartados com DROP INDEX.Indexes that were created with CREATE INDEX must be dropped with DROP INDEX. Use a instrução ALTER INDEX para recriar uma parte de índice de uma definição de restrição. A restrição não tem que ser descartada e adicionada novamente com ALTER INDEX.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.

Todos os índices e as restrições com base em uma coluna devem ser removidos antes que a coluna possa ser removida.All indexes and constraints based on a column must be removed before the column can be removed.

Quando uma restrição que cria um índice clusterizado é excluída, as linhas de dados que foram armazenadas no nível folha do índice clusterizado são armazenadas em uma tabela não clusterizada.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. É possível descartar o índice clusterizado e mover a tabela resultante para outro grupo de arquivos ou esquema de partição em uma única transação, especificando a opção 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. A opção MOVE TO tem as seguintes restrições:The MOVE TO option has the following restrictions:

  • MOVE TO não é válido para exibições indexadas ou índices não clusterizados.MOVE TO isn't valid for indexed views or nonclustered indexes.
  • O esquema de partição ou grupo de arquivos já deve existir.The partition scheme or filegroup must already exist.
  • Se MOVE TO não for especificada, a tabela resultante estará localizada no mesmo esquema de partição ou grupo de arquivos definido para o índice clusterizado.If MOVE TO isn't specified, the table is located in the same partition scheme or filegroup as was defined for the clustered index.

Ao remover um índice clusterizado, especifique a opção ONLINE = ON de modo que a transação DROP INDEX não bloqueie consultas e modificações nos dados subjacentes e índices não clusterizados associados.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 tem as seguintes restrições:ONLINE = ON has the following restrictions:

  • ONLINE = ON é inválido para índices clusterizados que também estão desabilitados.ONLINE = ON isn't valid for clustered indexes that are also disabled. Índices desabilitados devem ser descartados usando ONLINE = OFF.Disabled indexes must be dropped by using ONLINE = OFF.
  • Apenas um índice pode ser descartado por vez.Only one index at a time can be dropped.
  • ONLINE = ON é inválido para exibições indexadas, índices não clusterizados ou índices em tabelas temporárias locais.ONLINE = ON isn't valid for indexed views, nonclustered indexes, or indexes on local temp tables.
  • ONLINE = ON é inválido para índices columnstore.ONLINE = ON isn't valid for columnstore indexes.

É necessário ter espaço temporário em disco igual ao tamanho do índice clusterizado existente para descartar um índice clusterizado.Temporary disk space equal to the size of the existing clustered index is required to drop a clustered index. Esse espaço adicional será liberado assim que a operação for concluída.This additional space is released as soon as the operation is completed.

Observação

As opções listadas em <opção_de_descarte_de_restrição_clusterizada> aplicam-se a índices clusterizados em tabelas e não podem ser aplicadas a índices clusterizados em exibições ou a índices não clusterizados.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.

Replicando alterações de esquemaReplicating Schema Changes

Quando você executa ALTER TABLE em uma tabela publicada no Publicador do SQL ServerSQL Server, por padrão, essa alteração é propagada para todos os assinantes do 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. Essa funcionalidade tem algumas restrições.This functionality has some restrictions. É possível desabilitá-la.You can disable it. Para obter mais informações, consulte Make Schema Changes on Publication Databases (Fazer alterações de esquema em bancos de dados de publicação).For more information, see Make Schema Changes on Publication Databases.

Data CompressionData Compression

Não é possível habilitar as tabelas do sistema para compactação.System tables can't be enabled for compression. Se a tabela for um heap, a operação de reconstrução para o modo ONLINE será um thread único.If the table is a heap, the rebuild operation for ONLINE mode will be single threaded. Use o modo OFFLINE para uma operação de reconstrução de um heap multi-threaded.Use OFFLINE mode for a multi-threaded heap rebuild operation. Para obter mais informações sobre compactação de dados, veja Compactação de dados.For a more information about data compression, seeData Compression.

Para avaliar como a alteração do estado de compactação afetará uma tabela, um índice ou uma partição, use o procedimento armazenado 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.

As restrições a seguir se aplicam a tabelas particionadas:The following restrictions apply to partitioned tables:

  • Não será possível alterar a configuração de compactação de uma única partição se a tabela tiver índices não alinhados.You can't change the compression setting of a single partition if the table has nonaligned indexes.
  • A sintaxe ALTER TABLE <table> REBUILD PARTITION... recompila a partição especificada.The ALTER TABLE <table> REBUILD PARTITION ... syntax rebuilds the specified partition.
  • A sintaxe ALTER TABLE <tabela> REBUILD WITH... recompila todas as partições.The ALTER TABLE <table> REBUILD WITH ... syntax rebuilds all partitions.

Removendo colunas NTEXTDropping NTEXT Columns

Ao remover colunas NTEXT, a limpeza dos dados excluídos ocorre como uma operação serializada em todas as linhas.When dropping NTEXT columns, the cleanup of the deleted data occurs as a serialized operation on all rows. A limpeza pode exigir uma grande quantidade de tempo.The cleanup can require a large amount of time. Ao remover uma coluna NTEXT em uma tabela com muitas linhas, primeiro atualize a coluna NTEXT para o valor NULL e, em seguida, remova a coluna.When dropping an NTEXT column in a table with lots of rows, update the NTEXT column to NULL value first, then drop the column. Você pode executar essa opção com operações paralelas e torná-la muito mais rápida.You can run this option with parallel operations and make it much faster.

Recriação de índice onlineOnline Index Rebuild

Para executar a instrução DDL de uma recompilação de índice online, todas as transações de bloqueio ativas em execução em uma tabela específica devem ser concluídas.To run the DDL statement for an online index rebuild, all active blocking transactions running on a particular table must be completed. Quando a recompilação de índice online for iniciada, ela bloqueará todas as novas transações que estão prontas para iniciar a execução nessa tabela.When the online index rebuild launches, it blocks all new transactions that are ready to start running on this table. Embora a duração do bloqueio da recompilação de índice online seja curta, é possível que a espera pela conclusão de todas as transações abertas em uma tabela específica e o bloqueio das novas transações a serem iniciadas afetem significativamente a taxa de transferência.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. Isso pode diminuir a velocidade de uma carga de trabalho ou ocasionar o tempo limite dela, bem como limitar consideravelmente o acesso à tabela subjacente.This can cause a workload slow-down or timeout and significantly limit access to the underlying table. A opção WAIT_AT_LOW_PRIORITY permite que os DBAs gerenciem o bloqueio S e os bloqueios Sch-M necessários para recompilações de índice online e permite que selecionem uma das três opções.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. Nos três casos, se, durante o tempo de espera ( (MAX_DURATION =n [minutes]) ), não houver nenhuma atividade de bloqueio, a recompilação de índice online será executada imediatamente sem aguardar e a instrução DDL será concluída.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.

Suporte de compatibilidadeCompatibility Support

A instrução ALTER TABLE dá suporte apenas a nomes de tabela de duas partes (schema.object).The ALTER TABLE statement supports only two-part (schema.object) table names. No SQL Server 2017SQL Server 2017, a especificação de uma tabela usando os formatos a seguir falhará em tempo de compilação com o erro 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.tableserver.database.schema.table
  • .database.schema.table.database.schema.table
  • ..schema.table..schema.table

Em versões anteriores, especificar o formato server.database.schema.table retornou o erro 4902.In earlier versions, specifying the format server.database.schema.table returned error 4902. A especificação do formato .database.schema.table ou do formato ..schema.table foi bem-sucedida.Specifying the format .database.schema.table or the format ..schema.table succeeded.

Para resolver o problema, remova o uso de um prefixo de 4 partes.To resolve the problem, remove the use of a four-part prefix.

PermissõesPermissions

Exige a permissão ALTER na tabela.Requires ALTER permission on the table.

As permissões ALTER TABLE se aplicam a ambas as tabelas envolvidas em uma instrução ALTER TABLE SWITCH.ALTER TABLE permissions apply to both tables involved in an ALTER TABLE SWITCH statement. Qualquer dado que seja alternado herda a segurança da tabela de destino.Any data that's switched inherits the security of the target table.

Se você tiver definido alguma coluna da instrução ALTER TABLE como um tipo CLR (Common Language Runtime) definido pelo usuário ou tipo de dados de alias, a permissão REFERENCES será necessária nesse tipo.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.

Adicionar uma coluna que atualize as linhas da tabela requer a permissão UPDATE na tabela.Adding a column that updates the rows of the table requires UPDATE permission on the table. Por exemplo, a adição de uma coluna NOT NULL com um valor padrão ou a adição de uma coluna de identidade quando a tabela não está vazia.For example, adding a NOT NULL column with a default value or adding an identity column when the table isn't empty.

ExemplosExamples

CategoriaCategory Elementos de sintaxe em destaqueFeatured syntax elements
Adicionando colunas e restriçõesAdding columns and constraints ADD • PRIMARY KEY com opções de índice • colunas esparsas e conjuntos de colunas •ADD • PRIMARY KEY with index options • sparse columns and column sets •
Descartando colunas e restriçõesDropping columns and constraints DROPDROP
Alterando uma definição de colunaAltering a column definition alterar o tipo de dados • alterar o tamanho da coluna • ordenaçãochange data type • change column size • collation
Alterando uma definição de tabelaAltering a table definition DATA_COMPRESSION • SWITCH PARTITION • LOCK ESCALATION • controle de alteraçõesDATA_COMPRESSION • SWITCH PARTITION • LOCK ESCALATION • change tracking
Desabilitando e habilitando restrições e gatilhosDisabling and enabling constraints and triggers CHECK • NO CHECK • ENABLE TRIGGER • DISABLE TRIGGERCHECK • NO CHECK • ENABLE TRIGGER • DISABLE TRIGGER

Adicionando colunas e restriçõesAdding Columns and Constraints

Os exemplos desta seção demonstram a adição de colunas e restrições em uma tabela.Examples in this section demonstrate adding columns and constraints to a table.

A.A. Adicionando uma nova colunaAdding a new column

O exemplo a seguir adiciona uma coluna que permite valores nulos e que não tem nenhum valor fornecido por uma definição DEFAULT.The following example adds a column that allows null values and has no values provided through a DEFAULT definition. Na nova coluna, cada linha terá 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.B. Adicionando uma coluna com uma restriçãoAdding a column with a constraint

O exemplo a seguir adiciona uma nova coluna com uma restrição 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.C. Adicionando uma restrição CHECK não verificada a uma coluna existenteAdding an unverified CHECK constraint to an existing column

O exemplo a seguir adiciona uma restrição a uma coluna existente na tabela.The following example adds a constraint to an existing column in the table. A coluna tem um valor que viola a restrição.The column has a value that violates the constraint. Portanto, WITH NOCHECK é usado para evitar que a restrição seja validada contra as linhas existentes e para permitir que a restrição seja adicionada.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.D. Adicionando uma restrição DEFAULT a uma coluna existenteAdding a DEFAULT constraint to an existing column

O exemplo a seguir cria uma tabela de duas colunas e insere um valor na primeira coluna, sendo que a outra permanece NULL.The following example creates a table with two columns and inserts a value into the first column, and the other column remains NULL. Depois, uma restrição DEFAULT é adicionada à segunda coluna.A DEFAULT constraint is then added to the second column. Para verificar se o padrão está aplicado, outro valor é inserido na primeira coluna e a tabela é consultada.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.E. Adicionando várias colunas com restriçõesAdding several columns with constraints

O exemplo a seguir adiciona várias colunas com restrições definidas com a nova coluna.The following example adds several columns with constraints defined with the new column. A primeira coluna nova tem uma propriedade IDENTITY.The first new column has an IDENTITY property. Cada linha na tabela tem novos valores com incremento na coluna de identidade.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.F. Adicionando uma coluna que permite valor nulo com valores padrãoAdding a nullable column with default values

O exemplo a seguir adiciona uma coluna que permite valor nulo com uma definição DEFAULT e usa WITH VALUES para fornecer valores para cada linha existente na tabela.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. Se WITH VALUES não for usado, cada linha terá o valor NULL na nova coluna.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.G. Criando uma restrição PRIMARY KEY com opções de índice ou de compressão de dadosCreating a PRIMARY KEY constraint with index or data compression options

O exemplo a seguir cria a restrição PRIMARY KEY PK_TransactionHistoryArchive_TransactionID e especifica as opções FILLFACTOR, ONLINE e PAD_INDEX.The following example creates the PRIMARY KEY constraint PK_TransactionHistoryArchive_TransactionID and sets the options FILLFACTOR, ONLINE, and PAD_INDEX. O índice clusterizado resultante terá o mesmo nome da restrição.The resulting clustered index will have the same name as the constraint.

Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de dados SQL do 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

Este exemplo semelhante se aplica a compactação de página ao aplicar a chave primária clusterizada.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.H. Adicionando uma coluna esparsaAdding a sparse column

Os exemplos a seguir mostram a adição e modificação de colunas esparsas na tabela T1.The following examples show adding and modifying sparse columns in table T1. O código para criar a tabela T1 é o seguinte: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

Para adicionar uma outra coluna esparsa C5, execute a seguinte instrução:To add an additional sparse column C5, execute the following statement.

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

Para converter a coluna não esparsa C4 a uma coluna esparsa, execute a seguinte instrução:To convert the C4 non-sparse column to a sparse column, execute the following statement.

ALTER TABLE T1
ALTER COLUMN C4 ADD SPARSE ;
GO

Para converter a coluna esparsa C4 para uma coluna não esparsa, execute a seguinte instrução.To convert the C4 sparse column to a nonsparse column, execute the following statement.

ALTER TABLE T1
ALTER COLUMN C4 DROP SPARSE;
GO

I.I. Adicionando um conjunto de colunasAdding a column set

Os exemplos a seguir mostram a adição de uma coluna à tabela T2.The following examples show adding a column to table T2. Um conjunto de colunas não poderá ser adicionado a uma tabela se ela já contiver colunas esparsas.A column set can't be added to a table that already contains sparse columns. O código para criar a tabela T2 é o seguinte: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

As três instruções a seguir adicionam um conjunto de colunas chamado CS e, depois, modificam colunas C2 e C3 para 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.J. Adicionando uma coluna criptografadaAdding an encrypted column

A instrução a seguir adiciona uma coluna criptografada denominada 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') ;

Descartando colunas e restriçõesDropping Columns and Constraints

Os exemplos desta seção demonstram o descarte de colunas e restrições.The examples in this section demonstrate dropping columns and constraints.

A.A. Descartando uma coluna ou colunasDropping a column or columns

O primeiro exemplo modifica uma tabela para remover uma coluna.The first example modifies a table to remove a column. O segundo exemplo remove várias colunas.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.B. Descartando restrições e colunasDropping constraints and columns

O primeiro exemplo remove uma restrição UNIQUE de uma tabela.The first example removes a UNIQUE constraint from a table. O segundo exemplo remove duas restrições e uma única coluna.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 CONSTRAINT my_constraint, my_pk_constraint, COLUMN column_b ;
GO

C.C. Descartando uma restrição PRIMARY KEY no modo ONLINEDropping a PRIMARY KEY constraint in the ONLINE mode

O exemplo a seguir exclui uma restrição PRIMARY KEY com a opção ONLINE definida como 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.D. Adicionando e descartando uma restrição FOREIGN KEYAdding and dropping a FOREIGN KEY constraint

O exemplo a seguir cria a tabela ContactBackup e, em seguida, altera a tabela, adicionando uma restrição FOREIGN KEY que referencia a tabela Person.Person e, depois, descartando a restrição 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 ;

Ícone de seta usado com o link Voltar ao início ExemplosArrow icon used with Back to Top link Examples

Alterando uma definição de colunaAltering a Column Definition

A.A. Alteração do tipo de dados de uma colunaChanging the data type of a column

O exemplo a seguir altera uma coluna de uma tabela de INT para 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.B. Alterando o tamanho de uma colunaChanging the size of a column

O exemplo a seguir aumenta o tamanho de uma coluna varchar e a precisão e escala de uma coluna decimal.The following example increases the size of a varchar column and the precision and scale of a decimal column. Como essas colunas contêm dados, o tamanho da coluna só pode ser aumentado.Because the columns contain data, the column size can only be increased. Além disso, observe que col_a está definido como um índice exclusivo.Also notice that col_a is defined in a unique index. O tamanho de col_a ainda pode ser aumentado, pois o tipo de dados é um varchar e o índice não é o resultado de uma restrição 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.C. Alterando a ordenação de colunasChanging column collation

Os exemplos a seguir mostram como alterar a ordenação de uma coluna.The following example shows how to change the collation of a column. Primeiro, uma tabela é criada com a ordenação de usuário padrão.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

Em seguida, a ordenação da coluna C2 é alterada para Latin1_General_BIN.Next, column C2 collation is changed to Latin1_General_BIN. O tipo de dados é obrigatório, mesmo que não tenha sido alterado.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.D. Criptografar uma colunaEncrypting a column

O exemplo a seguir mostra como criptografar uma coluna usando Always Encrypted com enclaves seguros.The following example shows how to encrypt a column using Always Encrypted with secure enclaves.

Primeiro, uma tabela é criada sem nenhuma coluna criptografada.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

Em seguida, a coluna 'C2' é criptografada com uma chave de criptografia de coluna, chamada CEK1, e a criptografia aleatória.Next, column 'C2' is encrypted with a column encryption key, named CEK1, and randomized encryption. Para que a instrução a seguir seja bem-sucedida:For the following statement to succeed:

  • A chave de criptografia de coluna deve ser habilitada para enclave.The column encryption key must be enclave-enabled. Isso significa que ela deve ser criptografada com uma chave mestra de coluna que permita cálculos de enclave.Meaning, it must be encrypted with a column master key that allows enclave computations.
  • A instância do SQL Server de destino dá suporte a Always Encrypted com enclaves seguros.The target SQL Server instance must support Always Encrypted with secure enclaves.
  • A instrução deve ser emitida por uma conexão configurada para Always Encrypted com enclaves seguros e usando um driver de cliente com suporte.The statement must be issued over a connection set up for Always Encrypted with secure enclaves, and using a supported client driver.
  • O aplicativo de chamada deve ter acesso à chave mestra de coluna, protegendo 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

Alterando uma definição de tabelaAltering a Table Definition

Os exemplos desta seção demonstram como alterar a definição de uma tabela.The examples in this section demonstrate how to alter the definition of a table.

A.A. Modificando uma tabela para alterar a compactaçãoModifying a table to change the compression

O exemplo a seguir altera a compactação de uma tabela não particionada.The following example changes the compression of a nonpartitioned table. O heap ou índice clusterizado será recriado.The heap or clustered index will be rebuilt. Se a tabela for um heap, todos os índices não clusterizados serão recriados.If the table is a heap, all nonclustered indexes will be rebuilt.

ALTER TABLE T1
REBUILD WITH (DATA_COMPRESSION = PAGE);

O exemplo a seguir altera a compactação de uma tabela particionada.The following example changes the compression of a partitioned table. A sintaxe REBUILD PARTITION = 1 faz com que somente o número de partição 1 seja recriado.The REBUILD PARTITION = 1 syntax causes only partition number 1 to be rebuilt.

Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

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

A mesma operação usando a sintaxe alternada a seguir faz com que todas as partições na tabela sejam recriadas.The same operation using the following alternate syntax causes all partitions in the table to be rebuilt.

Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

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

Para obter exemplos de compactação de dados adicionais, consulte Compactação de dados.For additional data compression examples, see Data Compression.

b.B. Modificando uma tabela columnstore para alterar a compactação de arquivamentoModifying a columnstore table to change archival compression

O exemplo a seguir compacta ainda mais uma partição de tabela columnstore aplicando um algoritmo de compactação adicional.The following example further compresses a columnstore table partition by applying an additional compression algorithm. Essa compactação reduz a tabela para um tamanho menor, mas também aumenta o tempo necessário para armazenamento e recuperação.This compression reduces the table to a smaller size, but also increases the time required for storage and retrieval. Isso pode ser útil para fins de arquivamento, ou em outras situações que exijam menos espaço e possam dispensar mais tempo para armazenamento e recuperação.This is useful for archiving or for situations that require less space and can afford more time for storage and retrieval.

Aplica-se a: SQL Server 2014 (12.x)SQL Server 2014 (12.x) a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

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

O exemplo a seguir descompacta uma partição de tabela columnstore compactada com a opção COLUMNSTORE_ARCHIVE.The following example decompresses a columnstore table partition that was compressed with COLUMNSTORE_ARCHIVE option. Quando os dados forem restaurados, eles continuarão sendo compactados por meio da compactação columnstore usada em todas as tabelas columnstore.When the data is restored, it will continue to be compressed with the columnstore compression that's used for all columnstore tables.

Aplica-se a: SQL Server 2014 (12.x)SQL Server 2014 (12.x) a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

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

C.C. Alternando partições entre tabelasSwitching partitions between tables

O exemplo a seguir cria uma tabela particionada, pressupondo que o esquema de partição myRangePS1 já esteja criado no banco de dados.The following example creates a partitioned table, assuming that partition scheme myRangePS1 is already created in the database. Em seguida, uma tabela não particionada é criada com a mesma estrutura de uma tabela particionada e no mesmo grupo de arquivos que PARTITION 2 da tabela 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. Depois, os dados da PARTITION 2 da tabela PartitionTable são inseridos na tabela 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.D. Permitindo escalonamento de bloqueios em tabelas particionadasAllowing lock escalation on partitioned tables

O exemplo a seguir habilita o escalonamento de bloqueios no nível de partição em uma tabela particionada.The following example enables lock escalation to the partition level on a partitioned table. Se a tabela não estiver particionada, o escalonamento de bloqueios será definido no nível TABLE.If the table isn't partitioned, lock escalation is set at the TABLE level.

Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

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

E.E. Configurando o controle de alterações em uma tabelaConfiguring change tracking on a table

O exemplo a seguir habilita o controle de alterações na tabela Person.Person.The following example enables change tracking on the Person.Person table.

Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

USE AdventureWorks;
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING;

O exemplo a seguir habilita o controle de alterações e também o controle de colunas que são atualizadas durante uma alteração.The following example enables change tracking and enables the tracking of the columns that are updated during a change.

Aplica-se a: do SQL Server 2008SQL Server 2008 ao 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)

O exemplo a seguir desabilita o controle de alterações na tabela Person.Person.The following example disables change tracking on the Person.Person table.

Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

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

Desabilitando e habilitando restrições e gatilhosDisabling and Enabling Constraints and Triggers

A.A. Desabilitando e reabilitando uma restriçãoDisabling and re-enabling a constraint

O exemplo a seguir desabilita uma restrição que limita os salários aceitos nos dados.The following example disables a constraint that limits the salaries accepted in the data. NOCHECK CONSTRAINT é usada com ALTER TABLE para desabilitar a restrição e permitir uma inserção que normalmente violaria a restrição.NOCHECK CONSTRAINT is used with ALTER TABLE to disable the constraint and allow for an insert that would typically violate the constraint. CHECK CONSTRAINT reabilita a restrição.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.B. Desabilitando e reabilitando um gatilhoDisabling and re-enabling a trigger

O exemplo a seguir usa a opção DISABLE TRIGGER de ALTER TABLE para desabilitar o gatilho e permitir uma inserção que normalmente violaria o gatilho.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 é usado para reabilitar o gatilho.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

Operações onlineOnline Operations

A.A. Recompilação de índice online usando opções de espera de baixa prioridadeOnline index rebuild using low-priority wait options

O exemplo a seguir mostra como executar uma recompilação de índice online que especifica as opções de espera de baixa prioridade.The following example shows how to perform an online index rebuild specifying the low-priority wait options.

Aplica-se a: SQL Server 2014 (12.x)SQL Server 2014 (12.x) a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and Banco de dados SQL do 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.B. Alteração online de colunaOnline Alter Column

O exemplo a seguir mostra como executar uma operação de alteração de coluna com a opção ONLINE.The following example shows how to run an alter column operation with the ONLINE option.

Aplica-se a: SQL Server 2016 (13.x)SQL Server 2016 (13.x) a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and Banco de dados SQL do 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

Controle de versão do sistemaSystem Versioning

Os quatro exemplos a seguir ajudarão você a se familiarizar com a sintaxe para usar o controle de versão do sistema.The following four examples will help you become familiar with the syntax for using system versioning. Para obter assistência adicional, veja Introdução às tabelas temporais com controle de versão do sistema.For additional assistance, see Getting Started with System-Versioned Temporal Tables.

Aplica-se a: SQL Server 2016 (13.x)SQL Server 2016 (13.x) a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

A.A. Adicionar o controle de versão do sistema a tabelas existentesAdd System Versioning to Existing Tables

O exemplo a seguir mostra como adicionar o controle de versão do sistema a uma tabela existente e criar uma tabela de histórico futura.The following example shows how to add system versioning to an existing table and create a future history table. Este exemplo presume que há uma tabela existente chamada InsurancePolicy com uma chave primária definida.This example assumes that there's an existing table called InsurancePolicy with a primary key defined. Este exemplo preenche as colunas de período recém-criadas para controle de versão do sistema usando valores padrão para os horários de início e término, porque esses valores não podem ser nulos.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. Este exemplo usa a cláusula HIDDEN para garantir que não haja nenhum impacto aplicativos existentes que interagem com a tabela atual.This example uses the HIDDEN clause to ensure no impact on existing applications interacting with the current table. Ele também usa HISTORY_RETENTION_PERIOD, que está disponível somente em Banco de Dados SQLSQL Database.It also uses HISTORY_RETENTION_PERIOD that's available on Banco de Dados 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.B. Migrar uma solução existente para usar o controle de versão do sistemaMigrate An Existing Solution to Use System Versioning

O exemplo a seguir mostra como migrar para o controle de versão do sistema de uma solução que usa gatilhos para imitar simular o suporte temporal.The following example shows how to migrate to system versioning from a solution that uses triggers to mimic temporal support. O exemplo supõe que há uma solução existente que usa uma tabela ProjectTask e uma tabela ProjectTaskHistory para sua solução existente, que usa as colunas Changed Date e Revised Date para seus períodos, que essas colunas de período não usam o datatype datetime2 e que a tabela ProjectTask tem uma chave primária definida.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.C. Desabilitando e reabilitando o controle de versão do sistema para alterar o esquema de tabelaDisabling and Re-Enabling System Versioning to Change Table Schema

Este exemplo mostra como desabilitar o controle de versão do sistema na tabela Department, adicionar uma coluna e reabilitar o controle de versão do sistema.This example shows how to disable system versioning on the Department table, add a column, and re-enable system versioning. É necessário desabilitar o controle de versão do sistema para modificar o esquema da tabela.Disabling system versioning is required to modify the table schema. Realize essas etapas em uma transação para impedir atualizações a ambas as tabelas ao atualizar o esquema da tabela, o que permite ao DBA ignorar a verificação de consistência de dados ao habilitar novamente o controle de versão do sistema e obter um benefício de desempenho.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. Tarefas como criação de estatísticas, alternância de partições ou aplicação de compactação de uma ou ambas as tabelas não exigem a desabilitação do controle de versão do sistema.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.D. Removendo o controle de versão do sistemaRemoving System Versioning

Este exemplo mostra como remover completamente o controle de versão do sistema da tabela Departamento e remover a tabela DepartmentHistory.This example shows how to completely remove system versioning from the Department table and drop the DepartmentHistory table. Opcionalmente, você também pode querer remover as colunas de período usadas pelo sistema para registrar informações de controle de versão do sistema.Optionally, you might also want to drop the period columns used by the system to record system versioning information. Não é possível remover as tabelas Department ou DepartmentHistory enquanto a versão do sistema está habilitada.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;

Exemplos: Azure SQL Data WarehouseAzure SQL Data Warehouse e Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

Os exemplos a seguir de A a C usam a tabela FactResellerSales no banco de dados AdventureWorksPDW2012AdventureWorksPDW2012.The following examples A through C use the FactResellerSales table in the AdventureWorksPDW2012AdventureWorksPDW2012 database.

A.A. Determinando se uma tabela está particionadaDetermining if a table is partitioned

A consulta a seguir retornará uma ou mais linhas se a tabela FactResellerSales for particionada.The following query returns one or more rows if the table FactResellerSales is partitioned. Se a tabela não for particionada, nenhuma linha será retornada.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.B. Determinando os valores de limite para uma tabela particionadaDetermining boundary values for a partitioned table

A consulta a seguir retorna os valores de limite para cada partição na tabela 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.C. Determinando a coluna de partição para uma tabela particionadaDetermining the partition column for a partitioned table

A consulta a seguir retorna o nome da coluna de particionamento para a tabela.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.D. Mesclando duas partiçõesMerging two partitions

O exemplo a seguir mescla duas partições em uma tabela.The following example merges two partitions on a table.

A tabela Customer tem a seguinte definição: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)));

O comando a seguir combina os limites de partição 10 e 25.The following command combines the 10 and 25 partition boundaries.

ALTER TABLE Customer MERGE RANGE (10);

A nova DDL para a tabela é: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.E. Dividindo uma partiçãoSplitting a partition

O exemplo a seguir divide uma partição em uma tabela.The following example splits a partition on a table.

A tabela Customer tem a seguinte 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 )));

O comando a seguir cria um novo o limite de partição com o valor de 75, entre 50 e 100.The following command creates a new partition bound by the value 75, between 50 and 100.

ALTER TABLE Customer SPLIT RANGE (75);

A nova DDL para a tabela é: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.F. Usando SWITCH para mover uma partição para uma tabela de históricoUsing SWITCH to move a partition to a history table

O exemplo a seguir move os dados em uma partição da tabela Orders para uma partição da tabela OrdersHistory.The following example moves the data in a partition of the Orders table to a partition in the OrdersHistory table.

A tabela Orders tem a seguinte 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' )));

Neste exemplo, a tabela Orders tem as seguintes partições.In this example, the Orders table has the following partitions. Cada partição contém dados.Each partition contains data.

PartitionPartition Tem dados?Has data? Intervalo de limiteBoundary range
11 SimYes OrderDate < '2004-01-01'OrderDate < '2004-01-01'
22 SimYes '2004-01-01' <= OrderDate < '2005-01-01''2004-01-01' <= OrderDate < '2005-01-01'
33 SimYes '2005-01-01' <= OrderDate< '2006-01-01''2005-01-01' <= OrderDate< '2006-01-01'
44 SimYes '2006-01-01'<= OrderDate < '2007-01-01''2006-01-01'<= OrderDate < '2007-01-01'
55 SimYes '2007-01-01' <= OrderDate'2007-01-01' <= OrderDate
  • Partição 1 (tem dados): OrderDate < '2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'
  • Partição 2 (tem dados): '2004-01-01' <= OrderDate < '2005-01-01'Partition 2 (has data): '2004-01-01' <= OrderDate < '2005-01-01'
  • Partição 3 (tem dados): '2005-01-01' <= OrderDate< '2006-01-01'Partition 3 (has data): '2005-01-01' <= OrderDate< '2006-01-01'
  • Partição 4 (tem dados): '2006-01-01'<= OrderDate < '2007-01-01'Partition 4 (has data): '2006-01-01'<= OrderDate < '2007-01-01'
  • Partição 5 (tem dados): '2007-01-01' <= OrderDatePartition 5 (has data): '2007-01-01' <= OrderDate

A tabela OrdersHistory tem a seguinte DDL, que tem colunas e nomes de coluna idênticos aos da tabela Orders.The OrdersHistory table has the following DDL, which has identical columns and column names as the Orders table. Ambos são distribuídos por hash na coluna 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' )));

Embora as colunas e os nomes de coluna devam ser iguais, os limites de partição não precisam ser.Although the columns and column names must be the same, the partition boundaries don't need to be the same. Neste exemplo, a tabela OrdersHistory tem as duas partições a seguir, e ambas estão vazias:In this example, the OrdersHistory table has the following two partitions and both partitions are empty:

  • Partição 1 (sem dados): OrderDate < '2004-01-01'Partition 1 (no data): OrderDate < '2004-01-01'
  • Partição 2 (vazia): '2004-01-01' <= OrderDatePartition 2 (empty): '2004-01-01' <= OrderDate

Para as duas tabelas anteriores, o comando a seguir move todas as linhas com OrderDate < '2004-01-01' da tabela Orders para a tabela 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;

Como resultado, a primeira partição Orders está vazia e a primeira partição em OrdersHistory contém dados.As a result, the first partition in Orders is empty and the first partition in OrdersHistory contains data. As tabelas agora aparecem da seguinte maneira:The tables now appear as follows:

Tabela OrdersOrders table

  • Partição 1 (vazia): OrderDate < '2004-01-01'Partition 1 (empty): OrderDate < '2004-01-01'
  • Partição 2 (tem dados): '2004-01-01' <= OrderDate < '2005-01-01'Partition 2 (has data): '2004-01-01' <= OrderDate < '2005-01-01'
  • Partição 3 (tem dados): '2005-01-01' <= OrderDate< '2006-01-01'Partition 3 (has data): '2005-01-01' <= OrderDate< '2006-01-01'
  • Partição 4 (tem dados): '2006-01-01'<= OrderDate < '2007-01-01'Partition 4 (has data): '2006-01-01'<= OrderDate < '2007-01-01'
  • Partição 5 (tem dados): '2007-01-01' <= OrderDatePartition 5 (has data): '2007-01-01' <= OrderDate

Tabela OrdersHistoryOrdersHistory table

  • Partição 1 (tem dados): OrderDate < '2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'
  • Partição 2 (vazia): '2004-01-01' <= OrderDatePartition 2 (empty): '2004-01-01' <= OrderDate

Para limpar a tabela Orders, você pode remover a partição vazia mesclando partições 1 e 2 da seguinte maneira: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');

Após a mesclagem, a tabela Orders tem as seguintes partições:After the merge, the Orders table has the following partitions:

Tabela OrdersOrders table

  • Partição 1 (tem dados): OrderDate < '2005-01-01'Partition 1 (has data): OrderDate < '2005-01-01'
  • Partição 2 (tem dados): '2005-01-01' <= OrderDate< '2006-01-01'Partition 2 (has data): '2005-01-01' <= OrderDate< '2006-01-01'
  • Partição 3 (tem dados): '2006-01-01'<= OrderDate < '2007-01-01'Partition 3 (has data): '2006-01-01'<= OrderDate < '2007-01-01'
  • Partição 4 (tem dados): '2007-01-01' <= OrderDatePartition 4 (has data): '2007-01-01' <= OrderDate

Suponha que se passe outro ano e você esteja pronto para arquivar o ano de 2005.Suppose another year passes and you're ready to archive the year 2005. Você pode alocar uma partição vazia para o ano 2005 na tabela OrdersHistory dividindo a partição vazia da seguinte maneira: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');

Após a divisão, a tabela OrdersHistory tem as seguintes partições:After the split, the OrdersHistory table has the following partitions:

Tabela OrdersHistoryOrdersHistory table

  • Partição 1 (tem dados): OrderDate < '2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'
  • Partição 2 (vazia): '2004-01-01' < '2005-01-01'Partition 2 (empty): '2004-01-01' < '2005-01-01'
  • Partição 3 (vazia): '2005-01-01' <= OrderDatePartition 3 (empty): '2005-01-01' <= OrderDate

Consulte TambémSee Also