Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Applies to:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Warehouse in Microsoft Fabric
SQL database in Microsoft Fabric
Modifica una definición de tabla mediante la alteración, adición o retirada de columnas y restricciones.
ALTER TABLE también reasigna y vuelve a generar particiones, o deshabilita y habilita restricciones y desencadenadores.
Sugerencia
La sintaxis de ALTER TABLE varía en distintas versiones del Microsoft SQL Motor de base de datos. Use la lista desplegable selector de versiones para elegir la versión del producto adecuada.
La sintaxis de ALTER TABLE es diferente para las tablas basadas en disco y las tablas optimizadas para memoria. Utilice los siguientes vínculos para acceder directamente al bloque de sintaxis apropiado para los tipos de tabla y a los ejemplos de sintaxis apropiados:
Tablas basadas en disco:
Tablas optimizadas para memoria:
Para obtener más información sobre las convenciones de sintaxis, vea Transact-SQL convenciones de sintaxis.
Sintaxis para las tablas basadas en disco
ALTER TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
{
ALTER COLUMN column_name
{
[ type_schema_name. ] type_name
[ (
{
precision [ , scale ]
| max
| xml_schema_collection
}
) ]
[ COLLATE collation_name ]
[ NULL | NOT NULL ] [ SPARSE ]
| { ADD | DROP }
{ ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION | SPARSE | HIDDEN }
| { ADD | DROP } MASKED [ WITH ( FUNCTION = ' mask_function ') ]
}
[ WITH ( ONLINE = ON | OFF ) ]
| [ WITH { CHECK | NOCHECK } ]
| ADD
{
<column_definition>
| <computed_column_definition>
| <table_constraint>
| <column_set_definition>
} [ ,...n ]
| [ system_start_time_column_name datetime2 GENERATED ALWAYS AS ROW START
[ HIDDEN ] [ NOT NULL ] [ CONSTRAINT constraint_name ]
DEFAULT constant_expression [WITH VALUES] ,
system_end_time_column_name datetime2 GENERATED ALWAYS AS ROW END
[ HIDDEN ] [ NOT NULL ][ CONSTRAINT constraint_name ]
DEFAULT constant_expression [WITH VALUES] ,
start_transaction_id_column_name bigint GENERATED ALWAYS AS TRANSACTION_ID START
[ HIDDEN ] NOT NULL [ CONSTRAINT constraint_name ]
DEFAULT constant_expression [WITH VALUES],
end_transaction_id_column_name bigint GENERATED ALWAYS AS TRANSACTION_ID END
[ HIDDEN ] NULL [ CONSTRAINT constraint_name ]
DEFAULT constant_expression [WITH VALUES],
start_sequence_number_column_name bigint GENERATED ALWAYS AS SEQUENCE_NUMBER START
[ HIDDEN ] NOT NULL [ CONSTRAINT constraint_name ]
DEFAULT constant_expression [WITH VALUES],
end_sequence_number_column_name bigint GENERATED ALWAYS AS SEQUENCE_NUMBER END
[ HIDDEN ] NULL [ CONSTRAINT constraint_name ]
DEFAULT constant_expression [WITH VALUES]
]
PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )
| DROP
[ {
[ CONSTRAINT ][ IF EXISTS ]
{
constraint_name
[ WITH
( <drop_clustered_constraint_option> [ ,...n ] )
]
} [ ,...n ]
| COLUMN [ IF EXISTS ]
{
column_name
} [ ,...n ]
| PERIOD FOR SYSTEM_TIME
} [ ,...n ] ]
| [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT
{ ALL | constraint_name [ ,...n ] }
| { ENABLE | DISABLE } TRIGGER
{ ALL | trigger_name [ ,...n ] }
| { ENABLE | DISABLE } CHANGE_TRACKING
[ WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } ) ]
| SWITCH [ PARTITION source_partition_number_expression ]
TO target_table
[ PARTITION target_partition_number_expression ]
[ WITH ( <low_priority_lock_wait> ) ]
| SET
(
[ FILESTREAM_ON =
{ partition_scheme_name | filegroup | "default" | "NULL" } ]
| SYSTEM_VERSIONING =
{
OFF
| ON
[ ( HISTORY_TABLE = schema_name . history_table_name
[, DATA_CONSISTENCY_CHECK = { ON | OFF } ]
[, HISTORY_RETENTION_PERIOD =
{
INFINITE | number {DAY | DAYS | WEEK | WEEKS
| MONTH | MONTHS | YEAR | YEARS }
}
]
)
]
}
| DATA_DELETION =
{
OFF
| ON
[( [ FILTER_COLUMN = column_name ]
[, RETENTION_PERIOD = { INFINITE | number { DAY | DAYS | WEEK | WEEKS
| MONTH | MONTHS | YEAR | YEARS } } ]
)]
} )
| REBUILD
[ [PARTITION = ALL]
[ WITH ( <rebuild_option> [ ,...n ] ) ]
| [ PARTITION = partition_number
[ WITH ( <single_partition_rebuild_option> [ ,...n ] ) ]
]
]
| <table_option>
| <filetable_option>
| <stretch_configuration>
}
[ ; ]
-- ALTER TABLE options
<column_set_definition> ::=
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
<drop_clustered_constraint_option> ::=
{
MAXDOP = max_degree_of_parallelism
| ONLINE = { ON | OFF }
| MOVE TO
{ partition_scheme_name ( column_name ) | filegroup | "default" }
}
<table_option> ::=
{
SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
}
<filetable_option> ::=
{
[ { ENABLE | DISABLE } FILETABLE_NAMESPACE ]
[ SET ( FILETABLE_DIRECTORY = directory_name ) ]
}
<stretch_configuration> ::=
{
SET (
REMOTE_DATA_ARCHIVE
{
= ON (<table_stretch_options>)
| = OFF_WITHOUT_DATA_RECOVERY ( MIGRATION_STATE = PAUSED )
| ( <table_stretch_options> [, ...n] )
}
)
}
<table_stretch_options> ::=
{
[ FILTER_PREDICATE = { null | table_predicate_function } , ]
MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }
}
<single_partition_rebuild__option> ::=
{
SORT_IN_TEMPDB = { ON | OFF }
| MAXDOP = max_degree_of_parallelism
| DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE}
| ONLINE = { ON [( <low_priority_lock_wait> ) ] | OFF }
}
<low_priority_lock_wait>::=
{
WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ],
ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )
}
Para más información, consulte:
- ALTER TABLE column_constraint (Transact-SQL)
- ALTER TABLE column_definition (Transact-SQL)
- ALTER TABLE computed_column_definition (Transact-SQL)
- ALTER TABLE index_option (Transact-SQL)
- ALTER TABLE table_constraint (Transact-SQL)
Sintaxis para las tablas optimizadas para memoria
ALTER TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
{
ALTER COLUMN column_name
{
[ type_schema_name. ] type_name
[ (
{
precision [ , scale ]
}
) ]
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
}
| ALTER INDEX index_name
{
[ type_schema_name. ] type_name
REBUILD
[ [ NONCLUSTERED ] WITH ( BUCKET_COUNT = bucket_count )
]
}
| ADD
{
<column_definition>
| <computed_column_definition>
| <table_constraint>
| <table_index>
| <column_index>
} [ ,...n ]
| DROP
[ {
CONSTRAINT [ IF EXISTS ]
{
constraint_name
} [ ,...n ]
| INDEX [ IF EXISTS ]
{
index_name
} [ ,...n ]
| COLUMN [ IF EXISTS ]
{
column_name
} [ ,...n ]
| PERIOD FOR SYSTEM_TIME
} [ ,...n ] ]
| [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT
{ ALL | constraint_name [ ,...n ] }
| { ENABLE | DISABLE } TRIGGER
{ ALL | trigger_name [ ,...n ] }
| SWITCH [ [ PARTITION ] source_partition_number_expression ]
TO target_table
[ PARTITION target_partition_number_expression ]
[ WITH ( <low_priority_lock_wait> ) ]
}
[ ; ]
-- ALTER TABLE options
< table_constraint > ::=
[ CONSTRAINT constraint_name ]
{
{PRIMARY KEY | UNIQUE }
{
NONCLUSTERED (column [ ASC | DESC ] [ ,... n ])
| NONCLUSTERED HASH (column [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
}
| FOREIGN KEY
( column [ ,...n ] )
REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]
| CHECK ( logical_expression )
}
<column_index> ::=
INDEX index_name
{ [ NONCLUSTERED ] | [ NONCLUSTERED ] HASH WITH (BUCKET_COUNT = bucket_count) }
<table_index> ::=
INDEX index_name
{ [ NONCLUSTERED ] HASH (column [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count)
| [ NONCLUSTERED ] (column [ ASC | DESC ] [ ,... n ] )
[ ON filegroup_name | default ]
| CLUSTERED COLUMNSTORE [ WITH ( COMPRESSION_DELAY = { 0 | delay [MINUTES] } ) ]
[ ON filegroup_name | default ]
}
Sintaxis de Azure Synapse Analytics y Data Warehouse parallel
ALTER TABLE { database_name.schema_name.source_table_name | schema_name.source_table_name | source_table_name }
{
ALTER COLUMN column_name
{
type_name [ ( precision [ , scale ] ) ]
[ COLLATE Windows_collation_name ]
[ NULL | NOT NULL ]
}
| ADD { <column_definition> | <column_constraint> FOR column_name} [ ,...n ]
| DROP { COLUMN column_name | [CONSTRAINT] constraint_name } [ ,...n ]
| REBUILD {
[ PARTITION = ALL [ WITH ( <rebuild_option> ) ] ]
| [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_option> ] ]
}
| { SPLIT | MERGE } RANGE (boundary_value)
| SWITCH [ PARTITION source_partition_number
TO target_table_name [ PARTITION target_partition_number ] [ WITH ( TRUNCATE_TARGET = ON | OFF ) ] ]
}
[ ; ]
<column_definition>::=
{
column_name
type_name [ ( precision [ , scale ] ) ]
[ <column_constraint> ]
[ COLLATE Windows_collation_name ]
[ NULL | NOT NULL ]
}
<column_constraint>::=
[ CONSTRAINT constraint_name ]
{
DEFAULT constant_expression
| PRIMARY KEY NONCLUSTERED (column_name [ ,... n ]) NOT ENFORCED -- Applies to Azure Synapse Analytics only
| UNIQUE (column_name [ ,... n ]) NOT ENFORCED -- Applies to Azure Synapse Analytics only
}
<rebuild_option > ::=
{
DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
[ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]
| XML_COMPRESSION = { ON | OFF }
[ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]
}
<single_partition_rebuild_option > ::=
{
DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
}
Sintaxis de Warehouse en Fabric
ALTER TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
{
ADD { column_name <data_type> [COLLATE collation_name] [ <column_options> ] } [ ,...n ]
| ADD { <column_constraint> FOR column_name} [ ,...n ]
| DROP { COLUMN column_name | [CONSTRAINT] constraint_name } [ ,...n ]
}
[ ; ]
<column_options> ::=
[ NULL ] -- default is NULL
<data type> ::= type_name [ ( precision [ , scale ] ) ]
<column_constraint>::=
[ CONSTRAINT constraint_name ]
{
PRIMARY KEY NONCLUSTERED (column_name [ ,... n ]) NOT ENFORCED
| UNIQUE NONCLUSTERED (column_name [ ,... n ]) NOT ENFORCED
| FOREIGN KEY
( column [ ,...n ] )
REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ] NOT ENFORCED
}
Arguments
nombre de la base de datos
Nombre de la base de datos donde creó la tabla.
schema_name
El nombre del esquema al que pertenece la tabla.
nombre_de_tabla
Nombre de la tabla que se va a modificar. Si la tabla no está en la base de datos actual o si el esquema de la tabla no es propiedad del usuario actual, debe especificar explícitamente la base de datos y el esquema.
COLUMNA ALTER
Especifica la columna con nombre que se va a modificar.
La columna modificada no puede ser:
Una columna con un tipo de datos timestamp.
para
ROWGUIDCOLla tabla.Una columna calculada o usada en una columna calculada.
Se usa en las estadísticas generadas por la
CREATE STATISTICSinstrucción . Para quitar estas estadísticas, ejecuteDROP STATISTICSantes deALTER COLUMNque pueda realizarse correctamente. Ejecute esta consulta para obtener todas las columnas de estadísticas y estadísticas creadas por el usuario para una tabla.SELECT s.name AS statistics_name, c.name AS column_name, sc.stats_column_id FROM sys.stats AS s INNER JOIN sys.stats_columns AS sc ON s.object_id = sc.object_id AND s.stats_id = sc.stats_id INNER JOIN sys.columns AS c ON sc.object_id = c.object_id AND c.column_id = sc.column_id WHERE s.object_id = OBJECT_ID('<table_name>');Se usa en una
PRIMARY KEYrestricción o[FOREIGN KEY] REFERENCES.Se usa en una
CHECKrestricción oUNIQUE. Sin embargo, puede cambiar la longitud de una columna de longitud variable usada en unaCHECKrestricción oUNIQUE.Una columna asociada a la definición predeterminada. Sin embargo, puede cambiar la longitud, precisión o escala de una columna si no cambia el tipo de datos.
ALTER COLUMN quita las estadísticas que el optimizador de consultas genera automáticamente.
Puede cambiar el tipo de datos de las columnas text, ntext e image solo de las maneras siguientes:
- text por varchar(max) , nvarchar(max) o xml
- ntext por varchar(max) , nvarchar(max) o xml
- image por varbinary(max)
Algunos cambios de tipo de datos pueden provocar un cambio en los datos. Por ejemplo, cambiar una columna nchar o nvarchar a char o varchar podría provocar la conversión de caracteres extendidos. Para obtener más información, vea CAST y CONVERT (Transact-SQL).
- Reducir la precisión o escala de una columna puede dar como resultado que se trunquen los datos.
- No se puede cambiar el tipo de datos de una columna en una tabla con particiones.
- No se puede cambiar el tipo de datos de las columnas incluidas en un índice a menos que la columna sea un tipo de datos varchar, nvarchar o varbinary y el nuevo tamaño sea igual o mayor que el tamaño anterior.
- No se puede cambiar una columna incluida en una restricción de clave principal de
NOT NULLaNULL.
Cuando se usa Always Encrypted (sin enclaves seguros), si modifica una columna cifrada con ENCRYPTED WITH, puede cambiar el tipo de datos a un tipo de datos compatible (por ejemplo , int a bigint), pero no puede cambiar ninguna configuración de cifrado.
Al usar Always Encrypted con enclaves seguros, puede cambiar cualquier configuración de cifrado si la clave de cifrado de columna que protege la columna (y la nueva clave de cifrado de columnas, si cambia la clave) admite cálculos de enclave (cifrados con claves de columna master habilitadas para enclave). Para más información, vea Always Encrypted con enclaves seguros.
Al modificar una columna, el Motor de base de datos realiza un seguimiento de cada modificación agregando una fila en una tabla del sistema y marcando la modificación de columna anterior como una columna quitada. En el caso poco frecuente de modificar una columna demasiadas veces, el Motor de base de datos podría alcanzar el límite de tamaño del registro. Si esto sucede, obtendrá el error MSSQLSERVER_511 o 1708. Para evitar estos errores, vuelva a generar el índice agrupado en la tabla periódicamente o reduzca el número de modificaciones de columna.
nombre de columna
Nombre de la columna que se va a modificar, agregar o quitar. La longitud máxima de column_name es 128 caracteres.
Si se trata de columnas nuevas, puede omitir column_name para las columnas creadas con un tipo de datos timestamp. Si no se especifica el argumento column_name en una columna con un tipo de datos timestamp, se usa el nombre timestamp.
Note
Se agregan nuevas columnas después de que se modifiquen todas las columnas existentes en la tabla.
[ type_schema_name. ] type_name
El nuevo tipo de datos de la columna modificada o el tipo de datos de la columna agregada. No puede especificar type_name para columnas existentes de tablas con particiones. type_name puede ser cualquiera de los siguientes tipos:
- Un tipo de datos del sistema SQL Server.
- Tipo de datos de alias basado en un tipo de datos del sistema SQL Server. Puede crear tipos de datos de alias con la
CREATE TYPEinstrucción antes de que se puedan usar en una definición de tabla. - Tipo definido por el usuario .NET Framework y el esquema al que pertenece. Puede crear tipos definidos por el usuario con la
CREATE TYPEinstrucción antes de que se puedan usar en una definición de tabla.
Los criterios siguientes se aplican a type_name de una columna modificada:
- El tipo de datos anterior debe poderse convertir implícitamente al nuevo tipo de datos.
- type_name no puede ser timestamp.
-
ANSI_NULLlos valores predeterminados siempre están activados paraALTER COLUMN; si no se especifica, la columna admite valores NULL. -
ANSI_PADDINGel relleno siempreONes paraALTER COLUMN. - Si la columna alterada es una columna de identidad, new_data_type debe ser de un tipo de datos compatible con la propiedad de la identidad.
- Se omite la configuración actual de
SET ARITHABORT.ALTER TABLEfunciona como siARITHABORTse estableceONen .
Note
Si no especifica la COLLATE cláusula , cambiar el tipo de datos de una columna provoca un cambio de intercalación en la intercalación predeterminada de la base de datos.
precisión
La precisión del tipo de datos especificado. Para obtener más información sobre los valores de precisión válidos, vea Precision, scale y length (Transact-SQL).
scale
La escala del tipo de datos especificado. Para obtener más información sobre los valores de escala válidos, vea Precision, scale y length (Transact-SQL).
max
Solo se aplica a los tipos de datos varchar, nvarchar y varbinary para el almacenamiento de 2^31-1 bytes de caracteres, datos binarios y datos Unicode.
xml_schema_collection
Applies to: SQL Server y Azure SQL Database.
Solo se aplica al tipo de datos xml para asociar un esquema XML con el tipo. Antes de escribir una columna xml en una colección de esquemas, primero debe crear la colección de esquemas en la base de datos mediante CREATE XML SCHEMA COLLECTION (Transact-SQL).
COLLATE <nombre_de_intercalación>
Especifica la nueva intercalación para la columna alterada. Si no especifica ninguna intercalación, se asigna a la columna la intercalación predeterminada de la base de datos. El nombre de intercalación puede ser un nombre de intercalación Windows o un nombre de intercalación de SQL. Para obtener una lista y más información, vea Windows nombre de intercalación (Transact-SQL) y SQL Server Nombre de intercalación (Transact-SQL).
La COLLATE cláusula cambia las intercalaciones solo de las columnas de los tipos de datos char, varchar, nchar y nvarchar . Para cambiar la intercalación de una columna de tipo de datos de alias definido por el usuario, use instrucciones ALTER TABLE independientes para cambiar la columna a un tipo de datos del sistema de SQL Server. A continuación, cambie su intercalación y cambie la columna de nuevo a un tipo de datos de alias.
ALTER COLUMN no puede tener un cambio de intercalación si existe una o varias de las condiciones siguientes:
- Una
CHECKrestricción,FOREIGN KEYrestricción o columnas calculadas hace referencia a la columna modificada. - Cualquier índice, estadísticas o índice de texto completo se crea en la columna. Las estadísticas creadas automáticamente en la columna cambiada se quitarán si se altera la intercalación de columna.
- Una vista enlazada a esquema o función hace referencia a la columna.
Para obtener más información sobre las intercalaciones admitidas, vea COLLATE (Transact-SQL).
NULL | NO NULL
Especifica si la columna puede aceptar valores NULL. Puede agregar columnas que no permitan valores NULL usando ALTER TABLE solo si tienen un valor predeterminado especificado o si la tabla está vacía. Solo puede especificar NOT NULL para las columnas calculadas si también especifica PERSISTED. Si la nueva columna permite valores NULL y no se especifica un valor predeterminado, la nueva columna contendrá un valor NULL en cada fila de la tabla. Si la nueva columna permite valores NULL y agrega una definición predeterminada con la nueva columna, puede usar WITH VALUES para almacenar el valor predeterminado en la nueva columna para cada fila existente de la tabla.
Si la nueva columna no permite valores NULL y la tabla no está vacía, debe agregar una DEFAULT definición con la nueva columna. La columna nueva se carga automáticamente con el valor predeterminado en cada fila existente de las columnas nuevas.
Puede especificar NULL en ALTER COLUMN para forzar una NOT NULL columna para permitir valores NULL, excepto para las columnas en PRIMARY KEY restricciones. Solo puede especificar NOT NULL en ALTER COLUMN si la columna no contiene valores NULL. Debe actualizar los valores NULL a algún valor antes ALTER COLUMNNOT NULL de que se permita, por ejemplo:
UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL;
ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR (20) NOT NULL;
Al crear o modificar una tabla mediante las instrucciones o ALTER TABLE , la CREATE TABLE configuración de la base de datos y la sesión pueden influir y posiblemente invalidar la nulabilidad del tipo de datos que especifique en una definición de columna. Siempre defina explícitamente una columna como NULL o NOT NULL para las columnas no calculadas.
Si agrega una columna con un tipo de datos definidos por el usuario, asegúrese de definir la columna con la misma nulabilidad del tipo de datos definidos por el usuario. Y especifique un valor predeterminado para la columna. Para obtener más información, vea CREATE TABLE (Transact-SQL).
Note
Si especifica NULL o NOT NULL con ALTER COLUMN, también debe especificar new_data_type [(precisión [, escala ])]. Si el tipo de datos, la precisión y la escala no cambian, especifique los valores de columna actuales.
[ {ADD | DROP} ROWGUIDCOL ]
Applies to: SQL Server y Azure SQL Database.
Especifica que la ROWGUIDCOL propiedad se agrega o quita de la columna especificada.
ROWGUIDCOL indica que la columna es una columna GUID de fila. Solo puede establecer una columna uniqueidentifier por tabla como columna ROWGUIDCOL . Solo puede asignar la ROWGUIDCOL propiedad a una columna uniqueidentifier . No se puede asignar ROWGUIDCOL a una columna de un tipo de datos definido por el usuario.
ROWGUIDCOL no aplica la unicidad de los valores almacenados en la columna y no genera automáticamente valores para las nuevas filas que se insertan en la tabla. Para generar valores únicos para cada columna, use la función NEWID() o NEWSEQUENTIALID() en instrucciones INSERT. O bien, especifique la función NEWID() o NEWSEQUENTIALID() como valor predeterminado para la columna.
[ {ADD | DROP} PERSISTIÓ ]
Especifica que la PERSISTED propiedad se agrega o quita de la columna especificada. La columna debe ser una columna calculada definida mediante una expresión determinista. Para las columnas especificadas como PERSISTED, el Motor de base de datos almacena físicamente los valores calculados en la tabla y actualiza los valores cuando se actualizan las demás columnas en las que depende la columna calculada. Al marcar una columna calculada como PERSISTED, puede crear índices en columnas calculadas definidas en expresiones deterministas, pero no precisas. Para obtener más información, consulte Índices en columnas calculadas.
SET QUOTED_IDENTIFIER debe ser ON cuando cree o cambie índices en columnas calculadas o vistas indizadas. Para obtener más información, vea SET QUOTED_IDENTIFIER (Transact-SQL).
Cualquier columna calculada que se use como columna de partición de una tabla con particiones debe marcarse PERSISTEDexplícitamente .
Note
En Fabric base de datos SQL, se permiten columnas calculadas, pero actualmente no se reflejan en Fabric OneLake.
NO SE PUEDE DEJAR PARA REPLICACIÓN
Applies to: SQL Server y Azure SQL Database.
Especifica que los valores de columnas de identidad se incrementan cuando los agentes de replicación realizan operaciones de inserción. Solo puede especificar esta cláusula si column_name es una columna de identidad.
SPARSE
Indica que la columna es una columna dispersa. El almacenamiento de columnas dispersas está optimizado para los valores NULL. No se pueden establecer columnas dispersas como NOT NULL. Si se convierte una columna de dispersa a no dispersa, o viceversa, esta opción bloquea la tabla durante la ejecución del comando. Es posible que tenga que usar la REBUILD cláusula para reclamar cualquier ahorro de espacio. Para obtener más restricciones y más información sobre las columnas dispersas, consulte Uso de columnas dispersas.
AÑADIR ENMASCARADO CON (FUNCIÓN = 'mask_function')
Applies to: SQL Server 2016 (13.x) y versiones posteriores, y Azure SQL Database.
Especifica una máscara dinámica de datos. mask_function es el nombre de la función de máscara con los parámetros adecuados. Hay tres funciones disponibles:
- default()
- email()
- partial()
- random()
Requiere ALTER ANY MASK permiso.
Para quitar una máscara, utilice DROP MASKED. Para conocer los parámetros de función, consulte Enmascaramiento dinámico de datos.
Agregar y quitar una máscara requieren ALTER ANY MASK permiso.
WITH ( ONLINE = ON | OFF) <tal como se aplica al modificar una columna>
Applies to: SQL Server 2016 (13.x) y versiones posteriores, y Azure SQL Database.
Permite realizar numerosas acciones de alteración de columna mientras la tabla sigue estando disponible. El valor predeterminado es OFF. La alteración de columna se puede realizar en línea para los cambios de columna relacionados con el tipo de datos, la precisión o la longitud de la columna, la nulabilidad, la escasez y la intercalación.
Online ALTER COLUMN permite a los usuarios crear y autostatisticas hacer referencia a la columna modificada durante la operación ALTER COLUMN , lo que permite que las consultas se ejecuten como de costumbre. Al final de la operación, se quitan las estadísticas automáticas que hacen referencia a la columna y se invalidan las estadísticas creadas por el usuario. El usuario debe actualizar manualmente las estadísticas generadas por el usuario una vez completada la operación. Si la columna forma parte de una expresión de filtro para las estadísticas o índices, no puede realizar una ALTER COLUMN operación.
Mientras se ejecuta la operación en línea
ALTER COLUMN, se bloquea cualquier operación DDL que pueda depender de esa columna (como la creación o modificación de índices o vistas) o se produce un error adecuado. Este comportamiento garantiza que no se producirá un error en líneaALTER COLUMNdebido a las dependencias introducidas mientras se estaba ejecutando la operación.No se admite la modificación de una columna de
NOT NULLaNULLcomo una operación en línea cuando los índices no agrupados hacen referencia a la columna modificada.No se admite en línea
ALTERcuando se hace referencia a la columna mediante una restricción check y laALTERoperación restringe la precisión de la columna (numérica o datetime).La
WAIT_AT_LOW_PRIORITYopción no se puede usar con en líneaALTER COLUMN.ALTER COLUMN ... ADD/DROP PERSISTEDno se admite para .ALTER COLUMNALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATIONno se ve afectado por la conexiónALTER COLUMN.En línea
ALTER COLUMNno admite la modificación de una tabla en la que el seguimiento de cambios está habilitado o que es un publicador de replicación de mezcla.En línea
ALTER COLUMNno se admite la modificación de tipos de datos clR o de .Online
ALTER COLUMNno admite la modificación de un tipo de datos XML que tenga una colección de esquemas diferente de la colección de esquemas actual.En línea
ALTER COLUMNno reduce las restricciones de cuándo se puede modificar una columna. Las referencias por índice, estadísticas, etc., pueden provocar un error en la modificación.En línea
ALTER COLUMNno admite modificar más de una columna simultáneamente.Online
ALTER COLUMNno tiene ningún efecto en una tabla temporal con versiones del sistema.ALTERcolumn no se ejecuta como en línea independientemente del valor especificado paraONLINEla opción.
Online ALTER COLUMN tiene requisitos, restricciones y funcionalidad similares como recompilación de índices en línea, que incluye:
- No se admite la regeneración de índices en línea cuando la tabla contiene columnas LOB o filestream heredadas, o cuando tiene un índice de almacén de columnas. Las mismas limitaciones se aplican a en línea
ALTER COLUMN. - Una columna existente que se va a modificar requiere dos veces la misma asignación de espacio; para la columna original y para la columna oculta recién creada.
- La estrategia de bloqueo durante una operación de alteración de columna en línea sigue el mismo patrón de bloqueo usado para la generación de índice en línea.
CON CHECK | CON NOCHECK
Especifica si los datos de la tabla son o no se validan con una restricción o recién agregada o FOREIGN KEY habilitadaCHECK. Si no especifica, WITH CHECK se supone que hay nuevas restricciones y WITH NOCHECK se supone que se vuelven a habilitar las restricciones.
Si no desea comprobar las restricciones nuevas CHECK o FOREIGN KEY con los datos existentes, use WITH NOCHECK. Por lo general, esto nunca se recomienda, pero puede ser necesario en algunas circunstancias. La nueva restricción se evalúa en todas las actualizaciones futuras. Las infracciones de restricciones que se suprimen WITH NOCHECK cuando se agrega la restricción pueden provocar un error en las actualizaciones futuras si actualizan filas con datos que no siguen la restricción. El optimizador de consultas no tiene en cuenta las restricciones definidas WITH NOCHECK. Estas restricciones se pasan por alto hasta que se vuelven a habilitar mediante ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL. Para obtener más información, vea Deshabilitar restricciones de clave externa con instrucciones INSERT y UPDATE.
ALTER INDEX nombre_de_índice
Especifica que es necesario cambiar o modificar el número de cubos de nombre_de_índice.
La sintaxis ALTER TABLE ... ADD/DROP/ALTER INDEX solo se admite para tablas optimizadas para memoria.
Important
Sin usar una instrucción />
ADD
Especifica que se agregan una o más definiciones de columna, definiciones de columnas calculadas o restricciones de tabla. O bien, se agregan las columnas que el sistema usa para el control de versiones del sistema. Puede agregar un índice para las tablas optimizadas para memoria.
Note
Se agregan nuevas columnas después de que se modifiquen todas las columnas existentes en la tabla.
Important
Sin usar una instrucción />
PERÍODO DE SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )
Applies to: SQL Server 2017 (14.x) y versiones posteriores, y Azure SQL Database.
Especifica los nombres de las columnas que el sistema usa para registrar el período durante el que un registro es válido. Puede especificar columnas existentes o crear nuevas columnas como parte del ADD PERIOD FOR SYSTEM_TIME argumento . Configure las columnas con el tipo de datos datetime2 y definalas como NOT NULL. Si define una columna de punto como NULL, se produce un error. Puede definir un column_constraint o Especificar valores predeterminados para las columnas de system_start_time y system_end_time columnas. Vea el ejemplo A en la sección Control de versiones del sistema, en que se muestra el uso de un valor predeterminado para la columna system_end_time.
Use este argumento con el SET SYSTEM_VERSIONING argumento para convertir una tabla existente en una tabla temporal. Para obtener más información, consulte Tablastemporales y Introducción a las tablas temporales.
A partir de SQL Server 2017 (14.x), los usuarios pueden marcar una o ambas columnas de período con HIDDEN marca para ocultar implícitamente estas columnas de modo que SELECT * FROM <table_name> no devuelve un valor para las columnas. De forma predeterminada, no se ocultan las columnas de período. Para poder usar las columnas ocultas, deben incluirse explícitamente en todas las consultas que hacen referencia directa a la tabla temporal.
DROP
Especifica que se quitan una o más definiciones de columna, definiciones de columnas calculadas o restricciones de tabla, o que se quita la especificación para las columnas que el sistema utiliza para el control de versiones del sistema.
Note
Las columnas que se quitan de las tablas de libro de contabilidad solo se eliminan temporalmente. Una columna quitada permanece en la tabla del libro de contabilidad, pero se marca como una columna quitada estableciendo la dropped_ledger_table columna en en sys.tables1. La vista de libro de contabilidad de la tabla de libro de contabilidad quitada también se marca como quitada estableciendo la columna dropped_ledger_view en sys.tables a 1. El nombre de una tabla de libro de contabilidad quitada, de su tabla de historial y de su vista de libro de contabilidad se cambia agregando un prefijo (MSSQL_DroppedLedgerTable, MSSQL_DroppedLedgerHistory, MSSQL_DroppedLedgerView) y anexando un GUID al nombre original.
RESTRICCIÓN constraint_name
Especifica que constraint_name se ha quitado de la tabla. Se pueden enumerar múltiples restricciones.
Puede determinar el nombre de la restricción, ya sea proporcionado por el sistema o definido por el usuario, mediante la consulta de las vistas de catálogo sys.check_constraint, sys.default_constraints, sys.key_constraints y sys.foreign_keys.
No PRIMARY KEY se puede quitar una restricción si existe un índice XML en la tabla.
INDEX index_name
Especifica que nombre_de_índice se ha quitado de la tabla.
La sintaxis ALTER TABLE ...ADD/DROP/ALTER INDEXsolo se admite para tablas optimizadas para memoria.
Important
Sin usar una instrucción />
COLUMNA column_name
Especifica que constraint_name o column_name se quita de la tabla. Pueden especificarse varias columnas.
Una columna no puede quitarse cuando:
- Se usa en un índice, ya sea como una columna de clave o como una
INCLUDE - Se usa en una
CHECKrestricción ,FOREIGN KEY,UNIQUEoPRIMARY KEY. - Asociado a un valor predeterminado definido con la
DEFAULTpalabra clave o enlazado a un objeto predeterminado. - Está enlazada a una regla.
Note
Quitar una columna no recupera el espacio en disco de la columna. Es posible que tenga que reclamar el espacio en disco de una columna descartada cuando el tamaño de fila de una tabla está cerca o ha superado su límite. Recupere espacio creando un índice agrupado en la tabla o recompilando un índice agrupado existente mediante ALTER INDEX (Transact-SQL). Para obtener más información acerca del impacto de quitar los tipos de datos LOB, vea esta entrada del blog de CSS.
PERÍODO DE SYSTEM_TIME
Applies to: SQL Server 2016 (13.x) y versiones posteriores, y Azure SQL Database.
Quita la especificación de las columnas que usa el sistema para el control de versiones del sistema.
CON <drop_clustered_constraint_option>
Especifica que se han establecido una o más opciones para quitar restricciones en clúster.
MAXDOP = max_degree_of_parallelism
Applies to: SQL Server y Azure SQL Database.
Invalida la opción de configuración grado máximo de paralelismo solo durante la operación. Para obtener más información, vea Configuración del servidor: grado máximo de paralelismo.
Use la MAXDOP opción para limitar el número de procesadores usados en la ejecución del plan en paralelo. El máximo es 64 procesadores.
max_degree_of_parallelism puede ser uno de los siguientes valores:
1Suprime la generación de planes paralelos.
>1Restringe el número máximo de procesadores utilizados en una operación de índice paralelo para el número especificado.
0(valor predeterminado)Usa el número real de procesadores o menos en función de la carga de trabajo del sistema actual.
Para obtener más información, consulte Configuración de operaciones de índice en paralelo.
Note
Las operaciones de índice en paralelo no están disponibles en todas las ediciones de SQL Server. Para obtener más información, vea Editions y características admitidas de SQL Server 2022.
ONLINE = { ON | OFF } <tal como se aplica a drop_clustered_constraint_option>
Especifica si las tablas subyacentes y los índices asociados están disponibles para realizar consultas y modificar datos durante la operación de índice. El valor predeterminado es OFF. Puede ejecutarse REBUILD como una ONLINE operación.
ON
Los bloqueos de tabla de larga duración no se mantienen durante la operación de indización. Durante la fase principal de la operación de índice, solo se mantiene un bloqueo de uso compartido de intenciones (
IS) en la tabla de origen. De esta forma, las consultas o actualizaciones realizadas sobre la tabla y los índices subyacentes pueden continuar. Al principio de la operación, se mantiene un bloqueo compartido (S) sobre el objeto de origen durante un breve espacio de tiempo. Al final de la operación, durante un breve período, se adquiere un bloqueo S (compartido) en el origen si se está creando un índice no agrupado. O bien, se adquiere un bloqueo de Sch-M (modificación del esquema) cuando se crea o quita un índice agrupado en línea y cuando se vuelve a generar un índice agrupado o no clúster.ONLINEno se puede establecerONen cuando se crea un índice en una tabla temporal local. Solo se permite la operación de regeneración de montón de un único subproceso.Para ejecutar el DDL para
SWITCHo la recompilación de índices en línea, se deben completar todas las transacciones de bloqueo activas que se ejecutan en una tabla determinada. Al ejecutarse, laSWITCHoperación de recompilación o impide que se inicien nuevas transacciones y podrían afectar significativamente al rendimiento de la carga de trabajo y retrasar temporalmente el acceso a la tabla subyacente.OFF
Los bloqueos de tabla se aplican durante la operación de índice. Una operación de índice sin conexión para crear, volver a crear o quitar un índice clúster, o para volver a crear o quitar un índice no clúster, adquiere un bloqueo de modificación del esquema (Sch-M) de la tabla. Este bloqueo evita que todos los usuarios tengan acceso a la tabla subyacente durante la operación. Una operación de índice sin conexión que crea un índice no clúster adquiere un bloqueo compartido (S) en la tabla. Este bloqueo impide las actualizaciones de la tabla subyacente, pero permite operaciones de lectura, como
SELECTinstrucciones . Se permiten operaciones multiproceso de regeneración del montón.Para obtener más información, consulte Funcionamiento de las operaciones de índice en línea.
Note
Las operaciones de índice en línea no están disponibles en todas las ediciones de SQL Server. Para obtener más información, vea Editions y características admitidas de SQL Server 2022.
MOVER A { partition_scheme_name(column_name [ ,... n ] ) | grupo de archivos | "default" }
Applies to: SQL Server y Azure SQL Database.
Especifica una ubicación a la que mover las filas de datos que se encuentran en el nivel hoja del índice clúster. La tabla se mueve a la nueva ubicación. Esta opción solo se aplica a las restricciones que crean un índice clúster.
Note
En este contexto, default no es una palabra clave. Es un identificador para el grupo de archivos predeterminado y debe delimitarse, como en MOVE TO "default" o MOVE TO [default]. Si "default" se especifica , la QUOTED_IDENTIFIER opción debe ser ON para la sesión actual. Esta es la configuración predeterminada. Para obtener más información, vea SET QUOTED_IDENTIFIER (Transact-SQL).
{ CHECK | NOCHECK } RESTRICCIÓN
Especifica si constraint_name está habilitado o deshabilitado. Esta opción solo se puede usar con FOREIGN KEY restricciones y CHECK . Cuando NOCHECK se especifica , la restricción está deshabilitada y las inserciones o actualizaciones futuras de la columna no se validan con las condiciones de restricción.
DEFAULTLas restricciones , PRIMARY KEYy UNIQUE no se pueden deshabilitar.
ALL
Especifica que todas las restricciones están deshabilitadas con la
NOCHECKopción o habilitadas con laCHECKopción .
{ HABILITAR | DESACTIVAR } TRIGGER
Especifica si trigger_name está habilitado o deshabilitado. Cuando se deshabilita un desencadenador, sigue definido para la tabla. Sin embargo, cuando INSERTlas instrucciones , UPDATEo DELETE se ejecutan en la tabla, las acciones del desencadenador no se llevan a cabo hasta que se vuelva a habilitar el desencadenador.
ALL
Especifica si todos los desencadenadores de la tabla están habilitados o deshabilitados.
trigger_name
Especifica el nombre del desencadenador que se va a habilitar o deshabilitar.
{ HABILITAR | DESACTIVAR } CHANGE_TRACKING
Applies to: SQL Server y Azure SQL Database.
Especifica si el seguimiento de cambios está habilitado o deshabilitado para la tabla. El seguimiento de cambios está deshabilitado de manera predeterminada.
Esta opción solo está disponible cuando el seguimiento de cambios está habilitado para la base de datos. Para obtener más información, vea ALTER DATABASE SET options (Transact-SQL).
Para habilitar el seguimiento de cambios, la tabla debe tener una clave principal.
CON ( TRACK_COLUMNS_UPDATED = { ON | DESACTIVADO } )
Applies to: SQL Server y Azure SQL Database.
Especifica si se actualizaron las pistas de Motor de base de datos, que cambiaron las columnas de seguimiento. El valor predeterminado es OFF.
CAMBIA [ PARTICIÓN source_partition_number_expression ] A [ schema_name. ] target_table [ PARTICIÓN target_partition_number_expression ]
Applies to: SQL Server y Azure SQL Database.
Modifica un bloqueo de datos de una de las formas siguientes:
- Vuelve a asignar todos los datos de una tabla como una partición en una tabla con particiones ya existente.
- Modifica una partición de una tabla con particiones a otra.
- Vuelve a asignar todos los datos de una partición de una tabla con particiones a una tabla sin particiones ya existente.
Si table es una tabla con particiones, debe especificarsource_partition_number_expression. Si target_table es una tabla con particiones, debe especificar target_partition_number_expression. Si se vuelven a asignar los datos de una tabla como partición a una tabla con particiones ya existente, o se modifica una partición de una tabla con particiones a otra, la partición de destino debe existir y debe estar vacía.
Si se vuelven a asignar los datos de una partición para formar una sola tabla, la tabla de destino debe ya estar creada y vacía. Tanto la tabla o partición de origen como la tabla o partición de destino deben residir en el mismo grupo de archivos. Los índices correspondientes, o particiones de índice, también deben residir en el mismo grupo de archivos. Son muchas las restricciones adicionales que se aplican a las particiones que se modifican. table y target_table no pueden ser iguales. target_table puede ser un identificador de varias partes.
source_partition_number_expression y target_partition_number_expression son expresiones constantes que pueden hacer referencia a funciones y variables. Incluyen las variables de tipos definidos por el usuario y las funciones definidas por el usuario. No pueden hacer referencia a expresiones Transact-SQL.
Una tabla con particiones con un índice de almacén de columnas agrupado se comporta como un montón con particiones:
- La clave principal debe incluir la clave de partición.
- Un índice único debe incluir la clave de partición. Sin embargo, incluir la clave de partición con un índice único existente puede cambiar la unicidad.
- Para cambiar de partición, todos los índices no agrupados deben incluir la clave de partición.
Para obtener SWITCH restricciones al usar la replicación, consulte Replicación de tablas e índices con particiones.
Los índices de almacén de columnas no agrupados se compilaron en un formato de solo lectura antes de SQL Server 2016 (13.x) y para SQL Database antes de la versión V12. Debe volver a generar índices de almacén de columnas no agrupados en el formato actual (que es actualizable) para poder ejecutar cualquier PARTITION operación.
Limitations
Si ambas tablas tienen particiones idénticas, incluidos los índices no agrupados, y la tabla de destino no tiene ningún índice no clúster, es posible que reciba un error 4907.
Ejemplo de resultado:
Msg 4907, Level 16, State 1, Line 38
'ALTER TABLE SWITCH' statement failed. The table 'MyDB.dbo.PrtTable1' has 4 partitions while index 'MS1' has 6 partitions.
SET ( FILESTREAM_ON = { partition_scheme_name filestream_filegroup_name | | "default" | "NULL" })
Applies to: SQL Server. Azure SQL Database no admite FILESTREAM.
Especifica dónde se almacenan los datos FILESTREAM.
ALTER TABLE con la SET FILESTREAM_ON cláusula solo se realiza correctamente si la tabla no tiene columnas FILESTREAM. Puede agregar columnas FILESTREAM mediante una segunda ALTER TABLE instrucción.
Si especifica partition_scheme_name, se aplican las reglas de CREATE TABLE (Transact-SQL). Asegúrese de que la tabla tenga ya particiones para los datos de la fila y de que su esquema de partición utilice la misma función de partición y columnas que el esquema de partición de FILESTREAM.
filestream_filegroup_name especifica el nombre de un grupo de archivos FILESTREAM. El grupo de archivos debe tener un archivo definido para el grupo de archivos mediante una instrucción CREATE DATABASE o ALTER DATABASE (Transact-SQL) o se produce un error.
"default" especifica el grupo de archivos FILESTREAM con el conjunto de DEFAULT propiedades . Si no hay ningún grupo de archivos FILESTREAM, recibirá un error.
"NULL" especifica que se quitan todas las referencias a grupos de archivos FILESTREAM para la tabla. Se deben quitar primero todas las columnas FILESTREAM. Use SET FILESTREAM_ON = "NULL" para eliminar todos los datos FILESTREAM asociados a una tabla.
SET ( SYSTEM_VERSIONING = { OFF | ON [ ( HISTORY_TABLE = schema_name . history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | APAGADO } ] ) ] } )
Applies to: SQL Server 2016 (13.x) y versiones posteriores, y Azure SQL Database.
Habilita o deshabilita el control de versiones del sistema de una tabla. Para habilitar el control de versiones del sistema de una tabla, el sistema comprueba que se cumplen los requisitos de tipo de datos, restricción de nulabilidad y restricción de clave principal para el control de versiones del sistema. El sistema registra el historial de cada registro de la tabla con versiones del sistema en una tabla de historial independiente. Si no se usa el HISTORY_TABLE argumento , el nombre de esta tabla de historial es MSSQL_TemporalHistoryFor<primary_table_object_id>. Si la tabla de historial no existe, el sistema genera una nueva tabla de historial que coincide con el esquema de la tabla actual, crea un vínculo entre las dos tablas y permite que el sistema registre el historial de cada registro de la tabla actual en la tabla de historial. Si usa el argumento HISTORY_TABLE para crear un vínculo a un historial existente y usarlo, el sistema crea un vínculo entre la tabla actual y la tabla especificada. Al crear un vínculo a una tabla de historial existente, puede realizar una comprobación de coherencia de datos. Esta comprobación de coherencia de datos garantiza que los registros existentes no se superponen. La comprobación de coherencia de datos se ejecuta de manera predeterminada. Use el argumento SYSTEM_VERSIONING = ON en una tabla que se define con la cláusula PERIOD FOR SYSTEM_TIME para convertir la tabla existente en una tabla temporal. Para obtener más información, consulte Tablas temporales.
HISTORY_RETENTION_PERIOD = { INFINITE | number { DAY | DÍAS | SEMANA | SEMANAS | MES | MESES | AÑO | YEARS } }
Applies to: SQL Server 2017 (14.x) y Azure SQL Database.
Especifica la retención finita o infinita de los datos del historial en la tabla temporal. Si se omite, se presupone la retención infinita.
DATA_DELETION
Applies to: Azure SQL Edge only
Habilita la limpieza basada en la directiva de retención de los datos obsoletos o antiguos de las tablas de una base de datos. Para obtener más información, consulte Habilitación y deshabilitación de la retención de datos. Para habilitar la retención de datos se deben especificar los parámetros siguientes.
FILTER_COLUMN = { nombre_columna }
Especifica la columna que se debe usar para determinar si las filas de la tabla están obsoletas o no. Se permiten los tipos de datos siguientes para la columna de filtro.
- date
- datetime
- datetime2
- smalldatetime
- datetimeoffset
RETENTION_PERIOD = { INFINITE | number { DAY | DÍAS | SEMANA | SEMANAS | MES | MESES | AÑO | YEARS } }
Especifica la directiva del período de retención para la tabla. El período de retención se especifica como una combinación de un valor entero positivo y la unidad de la parte de la fecha.
SET ( LOCK_ESCALATION = { AUTO | TABLA | DESACTIVAR } )
Applies to: SQL Server y Azure SQL Database.
Especifica los métodos permitidos de extensión de bloqueo para una tabla.
AUTO
Esta opción permite Motor de base de datos de SQL Server seleccionar la granularidad de escalación de bloqueo adecuada para el esquema de tabla.
Si la tabla tiene particiones, se permite la extensión de bloqueo a la granularidad del montón o árbol B (HoBT). En otras palabras, la extensión se permite al nivel de partición. Después de escalar el bloqueo al nivel de HoBT, el bloqueo no se escalará más adelante a
TABLEla granularidad.Si la tabla no tiene particiones, la extensión del bloqueo se realiza a la
TABLEgranularidad.
TABLE
La extensión de bloqueo se aplica a la granularidad en el nivel de tabla, independientemente de que la tabla tenga o no particiones.
TABLEes el valor predeterminado.DISABLE
Evita la extensión de bloqueo en la mayoría de los casos. No siempre se evitan los bloqueos de nivel de la tabla. Por ejemplo, cuando se examina una tabla que no tiene ningún índice agrupado bajo el nivel de aislamiento serializable, Motor de base de datos debe tomar un bloqueo de tabla para proteger la integridad de los datos.
REBUILD
Use la REBUILD WITH sintaxis para recompilar una tabla completa, incluidas todas las particiones de una tabla con particiones. Si la tabla tiene un índice agrupado, la REBUILD opción vuelve a generar el índice agrupado.
REBUILD se puede ejecutar como una ONLINE operación.
Use la REBUILD PARTITION sintaxis para recompilar una sola partición en una tabla con particiones.
PARTICIÓN = TODOS
Applies to: SQL Server y Azure SQL Database.
Vuelve a generar todas las particiones al cambiar los valores de compresión de la partición.
REBUILD WITH (<rebuild_option>)
Todas las opciones se aplican a una tabla con un índice clúster. Si la tabla no tiene un índice agrupado, solo algunas de las opciones afectan a la estructura del montón.
Cuando no se especifica una configuración de compresión específica con la REBUILD operación, se usa la configuración de compresión actual para la partición. Para devolver el valor actual, realice una consulta en la columna data_compression de la vista del catálogo sys.partitions.
Para obtener descripciones completas de las opciones de recompilación, vea ALTER TABLE index_option (Transact-SQL).
DATA_COMPRESSION
Applies to: SQL Server y Azure SQL Database.
Especifica la opción de compresión de datos para la tabla, el número de partición o el intervalo de particiones especificados. Las opciones son las siguientes:
NONE
Las particiones especificadas o de tabla no se comprimen. Esta opción no se aplica a las tablas del almacén de columnas.
FILA
Las particiones de tabla o especificadas se comprimen mediante la compresión de fila. Esta opción no se aplica a las tablas del almacén de columnas.
PÁGINA
Las particiones de tabla o especificadas se comprimen mediante la compresión de página. Esta opción no se aplica a las tablas del almacén de columnas.
COLUMNSTORE
Applies to: SQL Server 2014 (12.x) y versiones posteriores, y Azure SQL Database.
Solo se aplica a tablas de almacén de columnas.
COLUMNSTOREespecifica para descomprimir una partición que se comprimió con laCOLUMNSTORE_ARCHIVEopción . Cuando se restauran los datos, siguen estando comprimidos con la compresión de almacén de columnas que se usa para todas las tablas de almacén de columnas.COLUMNSTORE_ARCHIVE
Applies to: SQL Server 2014 (12.x) y versiones posteriores, y Azure SQL Database.
Solo se aplica a las tablas de almacén de columnas almacenadas con un índice clúster de almacén de columnas.
COLUMNSTORE_ARCHIVEcomprime aún más la partición especificada en un tamaño menor. Use esta opción para el archivado o para otras situaciones que requieran menos almacenamiento y en las que pueda permitirse más tiempo para el almacenamiento y recuperación.Para volver a generar al mismo tiempo varias particiones, vea index_option. Si la tabla no tiene un índice agrupado, al cambiar la compresión de datos se vuelven a generar el montón y los índices no agrupados. Para obtener más información sobre la compresión, consulte Compresión de datos.
ALTER TABLE REBUILD PARTITION WITH DATA COMPRESSION = ROWoPAGEno se permite en la base de datos SQL en Microsoft Fabric.
XML_COMPRESSION
Applies to: SQL Server 2022 (16.x) y versiones posteriores, Azure SQL Database y Azure SQL Managed Instance.
Especifica la opción de compresión XML de las columnas de tipo de datos xml de la tabla. Las opciones son las siguientes:
ON
Las columnas que usan el tipo de datos xml se comprimen.
OFF
Las columnas que usan el tipo de datos xml no se comprimen.
ONLINE = { ON | OFF } <tal y como se aplica a single_partition_rebuild_option>
Especifica si una única partición de las tablas subyacentes y los índices asociados están disponibles para realizar consultas y modificar datos durante la operación de indización. El valor predeterminado es OFF. Puede ejecutarse REBUILD como una ONLINE operación.
ON
Los bloqueos de tabla de larga duración no se mantienen durante la operación de indización. Requiere un bloqueo S en la tabla al principio de la recompilación del índice y un bloqueo Sch-M en la tabla en el extremo de la recompilación de índice en línea. Aunque ambos bloqueos son bloqueos de metadatos cortos, el bloqueo Sch-M debe esperar a que todas las transacciones de bloqueo se completen. Durante el tiempo de espera, el bloqueo Sch-M bloquea todas las demás transacciones que esperan detrás de este bloqueo al acceder a la misma tabla.
Note
La regeneración de índices en línea puede establecer las opciones
low_priority_lock_waitque se describen más adelante en esta sección.OFF
Los bloqueos de tabla se aplican durante la operación de índice. Esto evita que todos los usuarios tengan acceso a la tabla subyacente durante la operación.
column_set_name COLUMN_SET XML PARA ALL_SPARSE_COLUMNS
Applies to: SQL Server y Azure SQL Database.
El nombre del conjunto de columnas. Un conjunto de columnas es una representación XML sin tipo que combina todas las columnas dispersas de una tabla en una salida estructurada. No se puede agregar un conjunto de columnas a una tabla que contenga columnas dispersas. Para obtener más información sobre los conjuntos de columnas, consulte Uso de conjuntos de columnas.
{ HABILITAR | DESACTIVAR } FILETABLE_NAMESPACE
Applies to: SQL Server.
Habilita o deshabilita las restricciones definidas por el sistema en un objeto FileTable. Solo se puede utilizar con un objeto FileTable.
SET ( FILETABLE_DIRECTORY = directory_name )
Applies to: SQL Server. Azure SQL Database no admite FileTable.
Especifica el nombre de directorio de FileTable compatible con Windows. Este nombre debe ser único entre todos los nombres de directorio de FileTable en la base de datos. La comparación de unicidad no distingue mayúsculas de minúsculas, a pesar de la configuración de intercalación de SQL. Solo se puede utilizar con un objeto FileTable.
REMOTE_DATA_ARCHIVE
Applies to: SQL Server 2017 (14.x) y versiones posteriores.
Habilita o deshabilita Stretch Database para una tabla. Para obtener más información, vea Stretch Database.
Important
Stretch Database está en desuso en SQL Server 2022 (16.x) y Azure SQL Database. Esta característica se quitará en una versión futura del Motor de base de datos. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.
Habilitación de Stretch Database para una tabla
Al habilitar Stretch para una tabla especificando ON, también tiene que especificar MIGRATION_STATE = OUTBOUND para empezar a migrar los datos inmediatamente o MIGRATION_STATE = PAUSED para posponer la migración de datos. El valor predeterminado es MIGRATION_STATE = OUTBOUND. Para más información sobre la habilitación de Stretch para una tabla, vea Enable Stretch Database for a table (Habilitar Stretch Database para una tabla).
Prerequisites. Para poder habilitar Stretch para una tabla, primero tiene que habilitar Stretch en el servidor y en la base de datos. Para obtener más información, vea Enable Stretch Database for a database (Habilitar Stretch Database para una tabla).
Permissions. Para habilitar Stretch en una base de datos o una tabla, se necesitan permisos db_owner. La habilitación de Stretch para una tabla también requiere ALTER permisos en la tabla.
Deshabilitar Stretch Database para una tabla
Al deshabilitar Stretch para una tabla, tiene dos opciones para los datos remotos que ya se han migrado a Azure. Para obtener más información, vea Deshabilitar Stretch Database y recuperar datos remotos.
Para deshabilitar Stretch para una tabla y copiar los datos remotos de la tabla de Azure volver a SQL Server, ejecute el comando siguiente. Este comando no se puede cancelar.
ALTER TABLE <table_name> SET ( REMOTE_DATA_ARCHIVE ( MIGRATION_STATE = INBOUND ) ) ;
Esta operación provoca costos de transferencia de datos y no se puede cancelar. Para obtener más información, consulte Detalles de precios de Transferencias de datos.
Una vez copiados todos los datos remotos de Azure de vuelta a SQL Server, Stretch está deshabilitado para la tabla.
Para deshabilitar Stretch para una tabla y abandonar los datos remotos, ejecute el siguiente comando.
ALTER TABLE <table_name> SET ( REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY ( MIGRATION_STATE = PAUSED ) ) ;
Después de deshabilitar Stretch Database para una tabla, se detiene la migración de datos y los resultados de la consulta dejan de incluir los resultados de la tabla remota.
Al deshabilitar Stretch no se quita la tabla remota. Si desea eliminar la tabla remota, la quite mediante el portal de Azure.
[ FILTER_PREDICATE = { null | predicado } ]
Applies to: SQL Server 2017 (14.x) y versiones posteriores.
Especifica opcionalmente un predicado de filtro para seleccionar las filas que se migrarán desde una tabla que contiene datos históricos y datos actuales. El predicado debe llamar a una función determinista con valores de tabla insertada. Para obtener más información, consulte Enable Stretch Database para una tabla (Habilitar Stretch Database para una tabla) y Seleccionar las filas que se van a migrar mediante una función de filtro (Stretch Database).
Important
Si se indica un predicado de filtro que tiene un rendimiento bajo, la migración de datos también tendrá un rendimiento bajo. Stretch Database aplica el predicado de filtro a la tabla mediante el CROSS APPLY operador .
Si no se especifica un predicado de filtro, se migrará toda la tabla.
Al especificar un predicado de filtro, también debe especificar MIGRATION_STATE.
MIGRATION_STATE = { SALIDA | INBOUND | PAUSO }
Applies to: SQL Server 2017 (14.x) y versiones posteriores.
Especifique
OUTBOUNDpara migrar datos de SQL Server a Azure.Especifique
INBOUNDpara copiar los datos remotos de la tabla de Azure a SQL Server y deshabilitar Stretch para la tabla. Para obtener más información, vea Deshabilitar Stretch Database y recuperar datos remotos.Esta operación provoca costos de transferencia de datos y no se puede cancelar.
Especifique
PAUSEDpara pausar o posponer la migración de datos. Para obtener más información, vea Pausa y reanudación de la migración de datos (Stretch Database).
WAIT_AT_LOW_PRIORITY
Applies to: SQL Server 2014 (12.x) y versiones posteriores, y Azure SQL Database.
Una recompilación de índices en línea tiene que esperar a las operaciones de bloqueo en esta tabla.
WAIT_AT_LOW_PRIORITY indica que la operación de recompilación de índices en línea espera bloqueos de prioridad baja, lo que permite que otras operaciones se lleven a cabo mientras la operación de compilación del índice en línea está esperando. Omitir la WAIT AT LOW PRIORITY opción es la misma que WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).
MAX_DURATION = tiempo [ MINUTOS ]
Applies to: SQL Server 2014 (12.x) y versiones posteriores, y Azure SQL Database.
El tiempo de espera, que es un valor entero especificado en minutos, que el índice en línea o recompila SWITCH los bloqueos espera con prioridad baja al ejecutar el comando DDL. Si la operación se bloquea durante el MAX_DURATION tiempo, se ejecuta una de las ABORT_AFTER_WAIT acciones.
MAX_DURATION el tiempo siempre está en minutos y puede omitir la palabra MINUTES.
ABORT_AFTER_WAIT = { NONE | SELF | BLOQUEADORES }
Applies to: SQL Server 2014 (12.x) y versiones posteriores, y Azure SQL Database.
NONE
Se continúa esperando al bloqueo con prioridad normal.
SELF
Salga de la operación DDL de recompilación del
SWITCHíndice o en línea que se está ejecutando actualmente sin realizar ninguna acción.BLOCKERS
Elimine todas las transacciones de usuario que bloquean actualmente la operación DDL de recompilación del
SWITCHíndice o en línea para que la operación pueda continuar.Requiere
ALTER ANY CONNECTIONpermiso.
SI EXISTE
Applies to: SQL Server 2016 (13.x) y versiones posteriores, y Azure SQL Database.
Quita condicionalmente la columna o restricción solo si ya existe.
RESUMIBLE = { ON | APAGADO}
Applies to: SQL Server 2022 (16.x) y versiones posteriores.
Especifica si una operación ALTER TABLE ADD CONSTRAINT se puede reanudar. La operación para agregar una restricción de tabla se puede reanudar cuando tiene el valor ON. La operación para agregar una restricción de tabla no se puede reanudar cuando tiene el valor OFF. El valor predeterminado es OFF. La opción RESUMABLE se puede usar como parte del ALTER TABLE index_option (Transact-SQL) en ALTER TABLE table_constraint (Transact-SQL).
MAX_DURATION cuando se usa con RESUMABLE = ON (requiere ONLINE = ON) indica el tiempo (un valor entero especificado en minutos) que se ejecuta una operación de restricción de adición en línea reanudable antes de pausarse. Si no se especifica, la operación continúa hasta acabar.
Para obtener más información sobre cómo habilitar y usar operaciones reanudables ALTER TABLE ADD CONSTRAINT , consulte Reanudable add table constraints (Reanudable add table constraints).
Remarks
Para agregar nuevas filas de datos, use INSERT (Transact-SQL). Para quitar filas de datos, use DELETE (Transact-SQL) o TRUNCATE TABLE (Transact-SQL). Para cambiar los valores de las filas existentes, use UPDATE (Transact-SQL).
Si hay planes de ejecución en la memoria caché de procedimientos que hacen referencia a la tabla, ALTER TABLE los marca para que se vuelvan a compilar en su siguiente ejecución.
Actualmente, las tablas en memoria, libro de contabilidad, historial de libro de contabilidad y Always Encrypted no se pueden crear en sql Database en Microsoft Fabric. Para obtener más información, vea Limitations en SQL Database en Microsoft Fabric.
En sql Database en Microsoft Fabric, se pueden crear algunas características de tabla, pero no se mirrored en el Fabric OneLake. Para obtener más información, consulte Limitations for Fabric SQL Database mirroring.
En Fabric Data Warehouse, las operaciones admitidas ALTER TABLE Transact-SQL se pueden ejecutar dentro de una transacción definida por el usuario explícita. Para obtener más información, vea Transactions en Fabric Data Warehouse.
En Fabric Data Warehouse, puede modificar las tablas de #temp distribuidas con ALTER TABLE, pero no tablas temporales respaldadas por MDF. Para obtener más información, consulte #temp tablas en Fabric Data Warehouse.
Cambio del tamaño de una columna
Puede cambiar la longitud, precisión o escala de una columna especificando un nuevo tamaño para el tipo de datos de columna. Use la ALTER COLUMN cláusula . Si hay datos en la columna, el nuevo tamaño no puede ser menor que el tamaño máximo de los datos. Además, no se puede definir la columna en un índice, a menos que la columna sea un tipo de datos varchar, nvarchar o varbinary y el índice no sea el resultado de una PRIMARY KEY restricción. Vea el ejemplo en la breve sección titulada Modificación de una definición de columna.
Bloqueos y ALTER TABLE
Los cambios que especifique en ALTER TABLE surten efecto inmediatamente. Si los cambios requieren modificaciones en las filas de la tabla, ALTER TABLE actualiza las filas.
ALTER TABLE adquiere un bloqueo de modificación de esquema (Sch-M) en la tabla para asegurarse de que ninguna otra conexión haga referencia a los metadatos de la tabla durante el cambio, excepto las operaciones de índice en línea que requieren un bloqueo de Sch-M corto al final. En una operación ALTER TABLE...SWITCH, el bloqueo se adquiere tanto en las tablas de origen como en las de destino. Las modificaciones realizadas en la tabla se registran y son completamente recuperables. Los cambios que afectan a todas las filas de tablas grandes, como quitar una columna o, en algunas ediciones de SQL Server, agregar una columna NOT NULL con un valor predeterminado, pueden tardar mucho tiempo en completarse y generar muchos registros de registro. Ejecute estas ALTER TABLE instrucciones con el mismo cuidado que cualquier INSERTinstrucción , UPDATEo DELETE que afecte a muchas filas.
Eventos extendidos (XEvents) para el modificador de partición
Los XEvents siguientes se relacionan con ALTER TABLE ... SWITCH PARTITION y las recompilaciones de índices en línea.
- lock_request_priority_state
- process_killed_by_abort_blockers
- ddl_with_wait_at_low_priority
Incorporación de columnas NOT NULL como una operación en línea
En SQL Server 2012 (11.x) Enterprise Edition y versiones posteriores, agregar una columna NOT NULL con un valor predeterminado es una operación en línea cuando el valor predeterminado es una constante runtime. Este comportamiento predeterminado significa que la operación finaliza casi instantáneamente a pesar del número de filas de la tabla, ya que las filas existentes de la tabla no se actualizan durante la operación. En su lugar, el valor predeterminado se almacena únicamente en los metadatos de la tabla y el valor se busca según sea necesario en las consultas que tienen acceso a estas filas. Este comportamiento es automático. No se requiere ninguna sintaxis adicional para implementar la operación en línea más allá de la ADD COLUMN sintaxis. Una constante de tiempo de ejecución es una expresión que genera el mismo valor en tiempo de ejecución para cada fila de la tabla, a pesar de su determinismo. Por ejemplo, la expresión "My temporary data"constante o la función GETUTCDATETIME() del sistema son constantes en tiempo de ejecución. En cambio, las funciones NEWID() o NEWSEQUENTIALID() no son constantes de tiempo de ejecución porque se genera un valor único para cada fila de la tabla. La adición de una NOT NULL columna con un valor predeterminado que no es una constante en tiempo de ejecución siempre se ejecuta sin conexión y se adquiere un bloqueo exclusivo (Sch-M) durante la operación.
Mientras que las filas existentes hacen referencia al valor almacenado en los metadatos, el valor predeterminado se almacena en la fila para aquellas filas nuevas que se inserten y que no especifiquen otro valor para la columna. El valor predeterminado almacenado en metadatos se mueve a una fila existente cuando se actualiza la fila (incluso si la columna real no se especifica en la UPDATE instrucción ), o si se vuelve a generar la tabla o el índice agrupado.
No se pueden agregar columnas de tipo varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography o CLR definidos por el usuario en una operación en línea. No se puede agregar una columna en línea si esto hace que el tamaño máximo de fila posible supere el límite de 8060 bytes. En este caso, la columna se agrega como una operación sin conexión.
Ejecución de planes paralelos
En SQL Server 2012 (11.x) Enterprise Edition y versiones posteriores, la opción de configuración MAXDOP opción . Para obtener más información, vea Configuración del servidor: grado máximo de paralelismo.
Tablas con particiones
Además de realizar SWITCH operaciones que implican tablas con particiones, use ALTER TABLE para cambiar el estado de las columnas, restricciones y desencadenadores de una tabla con particiones, al igual que para las tablas sin particiones. Sin embargo, no puede usar esta instrucción para cambiar la forma en que se particiona la propia tabla. Para volver a particionar una tabla con particiones, use ALTER PARTITION SCHEME (Transact-SQL) y ALTER PARTITION FUNCTION (Transact-SQL). Además, no puede cambiar el tipo de datos de una columna de una tabla con particiones.
Restricciones en tablas con vistas enlazadas a esquema
Las restricciones que se aplican a ALTER TABLE las instrucciones de las tablas con vistas enlazadas al esquema son las mismas que las restricciones aplicadas actualmente al modificar tablas con un índice simple. Puede agregar una columna. Sin embargo, no puede quitar ni cambiar una columna que participe en ninguna vista enlazada al esquema. Si la instrucción ALTER TABLE requiere cambiar una columna usada en una vista enlazada al esquema, ALTER TABLE produce un error y el Motor de base de datos genera un mensaje de error. Para obtener más información sobre el enlace de esquemas y las vistas indizadas, vea CREATE VIEW (Transact-SQL).
La creación de una vista enlazada a esquema que hace referencia a las tablas no afecta a la adición ni a la eliminación de desencadenadores en las tablas base.
Índices y ALTER TABLE
Los índices creados como parte de una restricción se quitan cuando se quita la restricción. Para quitar índices creados mediante CREATE INDEX, use DROP INDEX. Use la ALTER INDEX instrucción para recompilar un índice que forma parte de una definición de restricción. No es necesario quitar y agregar la restricción de nuevo mediante ALTER TABLE.
Debe quitar todos los índices y restricciones que se basan en una columna para poder quitar esa columna.
Cuando elimina una restricción que ha creado un índice agrupado, las filas de datos que se han almacenado en el nivel hoja del índice agrupado se almacenan en una tabla no agrupada. Puede quitar el índice agrupado y mover la tabla resultante a otro grupo de archivos o esquema de partición en una sola transacción especificando la MOVE TO opción . La MOVE TO opción tiene las restricciones siguientes:
MOVE TOno es válido para vistas indexadas o índices no agrupados.El esquema de partición o el grupo de archivos debe existir previamente.
Si no especifica
MOVE TO, la tabla se encuentra en el mismo esquema de partición o grupo de archivos que se definió para el índice agrupado.
Al quitar un índice clúster, especifique la ONLINE = ON opción para que la DROP INDEX transacción no bloquee las consultas y modificaciones en los datos subyacentes y los índices no clúster asociados.
ONLINE = ON tiene las restricciones siguientes:
-
ONLINE = ONno es válido para los índices agrupados que también están deshabilitados. Debe quitar índices deshabilitados medianteONLINE = OFF. - Solo puede quitar un índice a la vez.
-
ONLINE = ONno es válido para vistas indizadas, índices no agrupados o índices en tablas temporales locales. -
ONLINE = ONno es válido para los índices de almacén de columnas.
Quitar un índice agrupado requiere espacio en disco temporal que sea igual al tamaño del índice agrupado existente. Esta operación libera el espacio adicional en cuanto se completa.
Note
Las opciones enumeradas en <drop_clustered_constraint_option> se aplican a los índices agrupados en tablas. No se pueden aplicar estas opciones a los índices agrupados en vistas o índices no clúster.
Replicación de cambios de esquema
Al ejecutar ALTER TABLE en una tabla publicada en una SQL Server Publisher, el cambio se propaga a todos los suscriptores de SQL Server de forma predeterminada. Esta funcionalidad tiene algunas restricciones. La puede deshabilitar. Para más información, vea Realizar cambios de esquema en bases de datos de publicaciones.
Compresión de datos
No se puede habilitar la compresión para las tablas del sistema. Si la tabla es un montón, la operación de recompilación para ONLINE el modo es de un solo subproceso. Use OFFLINE el modo para una operación de recompilación de montón multiproceso. Para obtener más información sobre la compresión de datos, consulte Compresión de datos.
Para evaluar cómo el cambio del estado de compresión afecta a una tabla, un índice o una partición, use el procedimiento almacenado del sistema sp_estimate_data_compression_savings .
Las restricciones siguientes se aplican a las tablas con particiones:
- No se puede cambiar la configuración de compresión de una partición única si la tabla tiene índices no alineados.
- La sintaxis
ALTER TABLE <table> REBUILD PARTITION... recompila la partición especificada. - La sintaxis
ALTER TABLE <table> REBUILD WITH... recompila todas las particiones.
Quitar columnas de ntext
Al quitar columnas que usan el tipo de datos ntext en desuso, la limpieza de los datos eliminados se produce como una operación serializada en todas las filas. La limpieza puede requerir una gran cantidad de tiempo. Al quitar una columna ntext en una tabla con una gran cantidad de filas, actualice primero la columna ntext al NULL valor y, a continuación, quite la columna. Puede ejecutar esta opción con operaciones en paralelo para que sea mucho más rápida.
Recompilación de índices en línea
Para ejecutar la instrucción DDL para una recompilación de índices en línea, todas las transacciones de bloqueo activas que se ejecutan en una tabla determinada deben completarse. Cuando la regeneración de índice en línea se inicia, bloquea todas las nuevas transacciones que están listas para iniciar la ejecución en esta tabla. Aunque la duración del bloqueo para la recompilación de índices en línea es corta, esperar a que todas las transacciones abiertas de una tabla determinada se completen y bloquear las nuevas transacciones que se inicien podrían afectar significativamente al rendimiento. Esta espera de bloqueo puede provocar una ralentización de la carga de trabajo o un tiempo de espera y limitar significativamente el acceso a la tabla subyacente. La WAIT_AT_LOW_PRIORITY opción permite a los DBA administrar el bloqueo S y Sch-M bloqueos necesarios para las recompilaciones de índices en línea. En los tres casos: NONE, SELFy BLOCKERS, si durante el tiempo de espera ((MAX_DURATION = n [minutes])) no hay actividades de bloqueo, la recompilación del índice en línea se ejecuta inmediatamente sin esperar y se completa la instrucción DDL.
Compatibilidad con compatibilidad
La ALTER TABLE instrucción solo admite nombres de tabla de dos partes (schema.object). En SQL Server, al especificar un nombre de tabla con los siguientes formatos, se produce un error en tiempo de compilación con el error 117.
server.database.schema.table.database.schema.table..schema.table
En versiones anteriores, al especificar el formato server.database.schema.table se devolvía el error 4902. La especificación del formato .database.schema.table o del formato ..schema.table se realizaba correctamente.
Para resolver el problema, quite el uso de un prefijo de cuatro partes.
Permissions
Requiere ALTER permiso en la tabla.
ALTER TABLE los permisos se aplican a ambas tablas implicadas en una ALTER TABLE SWITCH instrucción . Los datos que se modifican heredan la seguridad de la tabla de destino.
Si define cualquier columna de la ALTER TABLE instrucción para que sea de un tipo definido por el usuario ( REFERENCES CLR) de Common Language Runtime (CLR), se requiere el permiso para el tipo.
Agregar o modificar una columna que actualice las filas de la tabla requiere UPDATE permiso en la tabla. Por ejemplo, agregar una NOT NULL columna con un valor predeterminado o agregar una columna de identidad cuando la tabla no está vacía.
Examples
Los ejemplos de código de este artículo usan la base de datos de ejemplo AdventureWorks2025 o AdventureWorksDW2025, que puede descargar desde la página principal de Microsoft SQL Server Samples and Community Projects.
| Category | Elementos de sintaxis ofrecidos |
|---|---|
| Agregar columnas y restricciones |
ADD; PRIMARY KEY con opciones de índice, columnas dispersas y conjuntos de columnas |
| Quitar columnas y restricciones | DROP |
| Modificar una definición de columna | Cambiar el tipo de datos; cambiar el tamaño de la columna; intercalación |
| Modificar una definición de tabla |
DATA_COMPRESSION; SWITCH PARTITION; ; LOCK ESCALATION seguimiento de cambios |
| Deshabilitar y habilitar restricciones y desencadenadores |
CHECK; NO CHECK; ; ENABLE TRIGGERDISABLE TRIGGER |
| Operaciones en línea | ONLINE |
| Control de versiones del sistema | SYSTEM_VERSIONING |
Adición de columnas y restricciones
En los ejemplos de esta sección se muestra cómo agregar columnas y restricciones a una tabla.
A. Adición de una columna nueva
En el ejemplo siguiente se agrega una columna que permite valores NULL y no incluye una DEFAULT definición. En la nueva columna, cada fila tiene NULL.
CREATE TABLE dbo.doc_exa (column_a INT);
GO
ALTER TABLE dbo.doc_exa
ADD column_b VARCHAR (20) NULL;
GO
B. Adición de una columna con una restricción
En el ejemplo siguiente se agrega una nueva columna con una restricción UNIQUE.
CREATE TABLE dbo.doc_exc (column_a INT);
GO
ALTER TABLE dbo.doc_exc
ADD column_b VARCHAR (20) NULL
CONSTRAINT exb_unique UNIQUE;
GO
EXECUTE sp_help doc_exc;
GO
DROP TABLE dbo.doc_exc;
GO
C. Adición de una restricción CHECK no comprobada a una columna existente
En el ejemplo siguiente se agrega una restricción a una columna existente de la tabla. La columna tiene un valor que infringe la restricción. Por lo tanto, el ejemplo usa WITH NOCHECK para evitar que la restricción se valide con las filas existentes y para permitir que se agregue la restricción.
CREATE TABLE dbo.doc_exd (column_a INT);
GO
INSERT INTO dbo.doc_exd VALUES (-1);
GO
ALTER TABLE dbo.doc_exd WITH NOCHECK
ADD CONSTRAINT exd_check CHECK (column_a > 1);
GO
EXECUTE sp_help doc_exd;
GO
DROP TABLE dbo.doc_exd;
GO
D. Adición de una restricción DEFAULT a una columna existente
En el ejemplo siguiente se crea una tabla con dos columnas e inserta un valor en la primera columna, mientras que la otra columna sigue siendo NULL. A continuación, el ejemplo agrega una DEFAULT restricción a la segunda columna. Para comprobar que se aplica el valor predeterminado, el ejemplo inserta otro valor en la primera columna y consulta la tabla.
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. Adición de varias columnas con restricciones
En el ejemplo siguiente se agregan varias columnas con restricciones que se definen con la nueva columna. La primera columna nueva tiene una propiedad IDENTITY. Cada fila de la tabla tiene nuevos valores incrementales en la columna de identidad.
CREATE TABLE dbo.doc_exe
(
column_a INT
CONSTRAINT column_a_un UNIQUE
);
GO
ALTER TABLE dbo.doc_exe
-- Add a PRIMARY KEY identity column.
ADD column_b INT IDENTITY
CONSTRAINT column_b_pk PRIMARY KEY,
-- Add a column that references another column in the same table.
column_c INT NULL
CONSTRAINT column_c_fk FOREIGN KEY REFERENCES doc_exe (column_a),
-- Add a column with a constraint to enforce that
-- nonnull data is in a valid telephone number format.
column_d VARCHAR (16) NULL
CONSTRAINT column_d_chk CHECK (column_d LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'
OR column_d LIKE '([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'),
-- Add a nonnull column with a default.
column_e DECIMAL (3, 3)
CONSTRAINT column_e_default DEFAULT .081;
GO
EXECUTE sp_help doc_exe;
GO
DROP TABLE dbo.doc_exe;
GO
F. Adición de una columna que admite valores NULL con valores predeterminados
En el ejemplo siguiente se agrega una columna que acepta valores NULL con una definición DEFAULT y se usa WITH VALUES para proporcionar valores para cada fila existente en la tabla. Si no usa WITH VALUES, cada fila tiene el valor NULL en la nueva columna.
CREATE TABLE dbo.doc_exf (column_a INT);
GO
INSERT INTO dbo.doc_exf VALUES (1);
GO
ALTER TABLE dbo.doc_exf
ADD AddDate SMALLDATETIME
CONSTRAINT AddDateDflt DEFAULT GETDATE() WITH VALUES NULL;
GO
DROP TABLE dbo.doc_exf;
GO
G. Creación de una restricción PRIMARY KEY con opciones de índice o compresión de datos
En el ejemplo siguiente se crea la PRIMARY KEY restricción PK_TransactionHistoryArchive_TransactionID y se establecen las opciones FILLFACTOR, ONLINEy PAD_INDEX. El índice agrupado resultante tiene el mismo nombre que la restricción .
Applies to: SQL Server y Azure SQL Database.
USE AdventureWorks2022;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID
PRIMARY KEY CLUSTERED (TransactionID) WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON);
GO
En este ejemplo similar se aplica la compresión de página mientras se aplica la clave principal agrupada.
USE AdventureWorks2022;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID
PRIMARY KEY CLUSTERED (TransactionID) WITH (DATA_COMPRESSION = PAGE);
GO
H. Adición de una columna dispersa
En los ejemplos siguientes se muestra cómo agregar y modificar columnas dispersas en la tabla T1. El código para crear la tabla T1 es el siguiente.
CREATE TABLE T1
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) SPARSE NULL,
C3 INT SPARSE NULL,
C4 INT
);
GO
Para agregar una columna dispersa adicional C5, ejecute la instrucción siguiente.
ALTER TABLE T1
ADD C5 CHAR (100) SPARSE NULL;
GO
Para convertir la columna no dispersa C4 en una columna dispersa, ejecute la instrucción siguiente.
ALTER TABLE T1
ALTER COLUMN C4 ADD SPARSE;
GO
Para convertir la columna dispersa C4 en una columna no dispersa, ejecute la instrucción siguiente.
ALTER TABLE T1
ALTER COLUMN C4 DROP SPARSE;
GO
I. Adición de un conjunto de columnas
En los ejemplos siguientes se muestra cómo agregar una columna a la tabla T2. No se puede agregar un conjunto de columnas a una tabla que ya contiene columnas dispersas. El código siguiente crea la tabla T2.
CREATE TABLE T2
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) NULL,
C3 INT NULL,
C4 INT
);
GO
Las tres instrucciones siguientes agregan un conjunto de columnas denominado CS y, a continuación, modifican las columnas C2 y C3 a 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. Adición de una columna cifrada
La siguiente instrucción agrega una columna cifrada con el nombre PromotionCode.
ALTER TABLE Customers
ADD PromotionCode NVARCHAR (100)
ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = MyCEK,
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
);
K. Incorporación de una clave principal con una operación reanudable
La operación ALTER TABLE reanudable para agregar una clave principal agrupada en la columna (a) con una duración MAX_DURATION de 240 minutos.
ALTER TABLE table1
ADD CONSTRAINT PK_Constrain PRIMARY KEY CLUSTERED (a)
WITH (ONLINE = ON, MAXDOP = 2, RESUMABLE = ON, MAX_DURATION = 240);
Eliminación de columnas y restricciones
Los ejemplos de esta sección muestran cómo quitar columnas y restricciones.
A. Eliminación de una o varias columnas
En el primer ejemplo se modifica una tabla para quitar una columna. En el segundo ejemplo se quitan varias columnas.
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. Eliminación de restricciones y columnas
En el primer ejemplo se quita una restricción UNIQUE de una tabla. En el segundo ejemplo se quitan dos restricciones y una sola columna.
CREATE TABLE dbo.doc_exc
(
column_a INT NOT NULL
CONSTRAINT my_constraint UNIQUE
);
GO
-- Example 1. Remove a single constraint.
ALTER TABLE dbo.doc_exc DROP my_constraint;
GO
DROP TABLE dbo.doc_exc;
GO
CREATE TABLE dbo.doc_exc
(
column_a INT NOT NULL
CONSTRAINT my_constraint UNIQUE,
column_b INT NOT NULL
CONSTRAINT my_pk_constraint PRIMARY KEY
);
GO
-- Example 2. Remove two constraints and one column
-- The keyword CONSTRAINT is optional. The keyword COLUMN is required.
ALTER TABLE dbo.doc_exc
DROP CONSTRAINT my_constraint, my_pk_constraint, COLUMN column_b;
GO
C. Eliminación de una restricción PRIMARY KEY en modo ONLINE
En el ejemplo siguiente se elimina una PRIMARY KEY restricción con la ONLINE opción establecida en ON.
ALTER TABLE Production.TransactionHistoryArchive
DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID
WITH (ONLINE = ON);
GO
D. Adición y eliminación de una restricción FOREIGN KEY
En el ejemplo siguiente se crea la tabla ContactBackupy, a continuación, se modifica la tabla. En primer lugar, agrega una FOREIGN KEY restricción que hace referencia a la tabla Person.Person. A continuación, quita la FOREIGN KEY restricción.
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;
Modificación de una definición de columna
A. Cambio del tipo de datos de una columna
En el ejemplo siguiente se modifica una columna de una tabla de INT a 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. Cambio del tamaño de una columna
En el ejemplo siguiente se aumenta el tamaño de una columna varchar y la precisión y la escala de una columna decimal. Dado que las columnas contienen datos, solo puede aumentar el tamaño de la columna. Observe también que col_a se define en un índice único. Todavía puede aumentar el tamaño de porque el tipo de col_a datos es varchar y el índice no es el resultado de una PRIMARY KEY restricción.
-- 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. Cambiar la intercalación de columnas
En el siguiente ejemplo se muestra cómo cambiar la intercalación de una columna. En primer lugar, se crea una tabla con la intercalación de usuario predeterminada.
CREATE TABLE T3
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) NULL,
C3 INT NULL,
C4 INT
);
GO
A continuación, cambie la intercalación de columna C2 a Latin1_General_BIN. Debe especificar el tipo de datos, incluso si no se cambia.
ALTER TABLE T3
ALTER COLUMN C2 VARCHAR (50) COLLATE Latin1_General_BIN;
GO
D. Cifrado de columnas
En el ejemplo siguiente se muestra cómo cifrar una columna mediante Always Encrypted con enclaves seguros.
En primer lugar, se crea una tabla sin columnas cifradas.
CREATE TABLE T3
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) NULL,
C3 INT NULL,
C4 INT
);
GO
A continuación, cifre la columna C2 con una clave de cifrado de columna, denominada CEK1y cifrado aleatorio. Para que la siguiente instrucción se realice correctamente:
- La clave de cifrado de la columna debe estar habilitada para el enclave. Este requisito significa que se debe cifrar mediante una clave de columna
master(CMK) que permita cálculos de enclave. - La instancia de SQL Server de destino debe admitir Always Encrypted con enclaves seguros.
- La instrucción debe emitirse a través de una conexión configurada para Always Encrypted con enclaves seguros y con un controlador cliente compatible.
- La aplicación que llama debe tener acceso a CMK, protegiendo
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
Modificación de una definición de tabla
En los ejemplos de esta sección se muestra cómo modificar la definición de una tabla.
A. Modificación de una tabla para cambiar la compresión
En el ejemplo siguiente se cambia la compresión de una tabla sin particiones. El montón o el índice agrupado se vuelven a generar. Si la tabla es un montón, se vuelven a generar todos los índices no agrupados.
ALTER TABLE T1 REBUILD
WITH (DATA_COMPRESSION = PAGE);
En el ejemplo siguiente se cambia la compresión de una tabla con particiones. La sintaxis REBUILD PARTITION = 1 hace que solo se vuelva a generar la partición número 1.
Applies to: SQL Server.
ALTER TABLE PartitionTable1 REBUILD PARTITION = 1
WITH (DATA_COMPRESSION = NONE);
GO
La misma operación que utiliza la sintaxis alternativa siguiente hace que se vuelvan a generar todas las particiones de la tabla.
Applies to: SQL Server.
ALTER TABLE PartitionTable1 REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = PAGE ON PARTITIONS (1));
Para ver ejemplos adicionales de compresión de datos, consulte Compresión de datos.
B. Modificación de una tabla de almacén de columnas para cambiar la compresión de archivo
En el ejemplo siguiente se comprime aún más una partición de tabla de almacén de columnas aplicando un algoritmo de compresión adicional. Esta compresión reduce la tabla a un tamaño mínimo, pero también aumenta el tiempo necesario para el almacenamiento y la recuperación. Esta compresión es útil para archivar o para situaciones que requieren menos espacio y pueden permitirse más tiempo para el almacenamiento y la recuperación.
Applies to: SQL Server 2014 (12.x) y versiones posteriores, y Azure SQL Database.
ALTER TABLE PartitionTable1 REBUILD PARTITION = 1
WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);
GO
En el ejemplo siguiente se descomprime una partición de tabla de almacén de columnas que se comprimió con COLUMNSTORE_ARCHIVE la opción . Cuando se restauran los datos, siguen estando comprimidos con la compresión de almacén de columnas que se usa para todas las tablas de almacén de columnas.
Applies to: SQL Server 2014 (12.x) y versiones posteriores, y Azure SQL Database.
ALTER TABLE PartitionTable1 REBUILD PARTITION = 1
WITH (DATA_COMPRESSION = COLUMNSTORE);
GO
C. Cambio de las particiones entre tablas
En el ejemplo siguiente se crea una tabla con particiones, suponiendo que el esquema de partición myRangePS1 ya esté creado en la base de datos. A continuación, se crea una tabla sin particiones con la misma estructura que la tabla con particiones y en el mismo grupo de archivos que PARTITION 2 de la tabla PartitionTable. Los datos de PARTITION 2 de la tabla PartitionTable se cambian entonces a la tabla 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. Permisión de la extensión de bloqueo en tablas con particiones
En el ejemplo siguiente se habilita la extensión de bloqueo al nivel de partición en una tabla con particiones. Si la tabla no tiene particiones, la extensión de bloqueo se establece en el TABLE nivel .
Applies to: SQL Server y Azure SQL Database.
ALTER TABLE dbo.T1 SET (LOCK_ESCALATION = AUTO);
GO
E. Configuración del seguimiento de cambios en una tabla
En el ejemplo siguiente se habilita el seguimiento de cambios en la tabla Person.Person.
Applies to: SQL Server y Azure SQL Database.
USE AdventureWorks2022;
ALTER TABLE Person.Person ENABLE CHANGE_TRACKING;
El ejemplo siguiente habilita el seguimiento de cambios y el seguimiento de las columnas que se actualizan durante un cambio.
Applies to: SQL Server.
USE AdventureWorks2022;
GO
ALTER TABLE Person.Person ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON);
En el ejemplo siguiente se deshabilita el seguimiento de cambios en la tabla Person.Person.
Applies to: SQL Server y Azure SQL Database.
USE AdventureWorks2022;
GO
ALTER TABLE Person.Person DISABLE CHANGE_TRACKING;
Deshabilitación y habilitación de restricciones y desencadenadores
A. Deshabilitación y habilitación de una restricción
En el ejemplo siguiente se deshabilita una restricción que limita los salarios aceptados en los datos. Use NOCHECK CONSTRAINT con ALTER TABLE para deshabilitar la restricción y permitir una inserción que normalmente infringiría la restricción. Use CHECK CONSTRAINT para volver a habilitar la restricción.
CREATE TABLE dbo.cnst_example
(
id INT NOT NULL,
name VARCHAR (10) NOT NULL,
salary MONEY NOT NULL
CONSTRAINT salary_cap CHECK (salary < 100000)
);
-- Valid inserts
INSERT INTO dbo.cnst_example VALUES (1, 'Joe Brown', 65000);
INSERT INTO dbo.cnst_example VALUES (2, 'Mary Smith', 75000);
-- This insert violates the constraint.
INSERT INTO dbo.cnst_example VALUES (3, 'Pat Jones', 105000);
-- Disable the constraint and try again.
ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (3, 'Pat Jones', 105000);
-- Re-enable the constraint and try another insert; this fails.
ALTER TABLE dbo.cnst_example CHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (4, 'Eric James', 110000);
B. Deshabilitación y habilitación de un desencadenador DML
En el ejemplo siguiente se usa la DISABLE TRIGGER opción de ALTER TABLE deshabilitar el desencadenador y permitir una inserción que normalmente infringiría el desencadenador. Use ENABLE TRIGGER para volver a habilitar el desencadenador.
CREATE TABLE dbo.trig_example
(
id INT,
name VARCHAR (12),
salary MONEY
);
GO
-- Create the trigger.
CREATE TRIGGER dbo.trig1
ON dbo.trig_example
FOR INSERT
AS IF (SELECT COUNT(*)
FROM INSERTED
WHERE salary > 100000) > 0
BEGIN
PRINT 'TRIG1 Error: you attempted to insert a salary > $100,000';
ROLLBACK;
END
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (1, 'Pat Smith', 100001);
GO
-- Disable the trigger.
ALTER TABLE dbo.trig_example DISABLE TRIGGER trig1;
GO
-- Try an insert that would typically violate the trigger.
INSERT INTO dbo.trig_example VALUES (2, 'Chuck Jones', 100001);
GO
-- Re-enable the trigger.
ALTER TABLE dbo.trig_example ENABLE TRIGGER trig1;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (3, 'Mary Booth', 100001);
GO
Operaciones en línea
A. Volver a generar el índice en línea mediante opciones de espera de prioridad baja
En el ejemplo siguiente se muestra cómo realizar una regeneración de índice en línea que especifica las opciones de espera de prioridad baja.
Applies to: SQL Server 2014 (12.x) y versiones posteriores, y Azure SQL Database.
ALTER TABLE T1 REBUILD WITH (
PAD_INDEX = ON,
ONLINE = ON (
WAIT_AT_LOW_PRIORITY (MAX_DURATION = 4 MINUTES, ABORT_AFTER_WAIT = BLOCKERS)
)
);
B. Alteración de columna en línea
En el ejemplo siguiente se muestra cómo ejecutar una operación de modificación de columna con la ONLINE opción .
Applies to: SQL Server 2016 (13.x) y versiones posteriores, y Azure SQL Database.
CREATE TABLE dbo.doc_exy (column_a INT);
GO
INSERT INTO dbo.doc_exy (column_a) VALUES (10);
GO
ALTER TABLE dbo.doc_exy
ALTER COLUMN column_a DECIMAL (5, 2) WITH (ONLINE = ON);
GO
EXECUTE sp_help doc_exy;
DROP TABLE dbo.doc_exy;
GO
Control de versiones del sistema
Los cuatro ejemplos siguientes le ayudarán a familiarizarse con la sintaxis para usar el control de versiones del sistema. Para obtener ayuda adicional, consulte Introducción a las tablas temporales con versiones del sistema.
Applies to: SQL Server 2016 (13.x) y versiones posteriores, y Azure SQL Database.
A. Incorporación del control de versiones del sistema a las tablas existentes
En el ejemplo siguiente se muestra cómo agregar el control de versiones del sistema a una tabla existente y cómo crear una futura tabla de historial. En este ejemplo se supone que hay una tabla existente denominada InsurancePolicy con una clave principal definida. En este ejemplo se rellenan las columnas de período recién creadas para las versiones de sistema utilizando los valores predeterminados para los tiempos de inicio y finalización porque estos valores no pueden ser null. En este ejemplo se usa la HIDDEN cláusula para garantizar que no haya ningún efecto en las aplicaciones existentes que interactúan con la tabla actual. También usa HISTORY_RETENTION_PERIOD que solo está disponible en SQL Database.
--Alter non-temporal table to define periods for system versioning
ALTER TABLE InsurancePolicy
ADD ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN
DEFAULT SYSUTCDATETIME() NOT NULL,
ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN
DEFAULT CONVERT (DATETIME2, '9999-12-31 23:59:59.99999999') NOT NULL,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo);
--Enable system versioning with 1 year retention for historical data
ALTER TABLE InsurancePolicy SET (
SYSTEM_VERSIONING = ON (
HISTORY_RETENTION_PERIOD=1 YEAR
)
);
B. Migración de una solución existente para usar el control de versiones del sistema
En el ejemplo siguiente se muestra cómo migrar a las versiones del sistema desde una solución que utilice desencadenadores para imitar una compatibilidad temporal. En el ejemplo se supone que hay una solución existente que usa una ProjectTask tabla y una ProjectTaskHistory tabla para su solución existente, que usa las Changed Date columnas y Revised Date durante sus períodos, que estas columnas de período no usan el tipo de datos datetime2 y que la ProjectTask tabla tiene definida una clave principal.
-- 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. Deshabilitación y habilitación del control de versiones del sistema para cambiar el esquema de la tabla de cambios
En este ejemplo se muestra cómo deshabilitar el control de versiones del sistema en la tabla Department, agregar una columna y volver a habilitar el control de versiones del sistema. Es necesario deshabilitar el control de versiones del sistema para modificar el esquema de la tabla. Siga estos pasos en una transacción para impedir las actualizaciones de ambas tablas al mismo tiempo que se actualiza el esquema de tabla, que permite que el DBA omita la comprobación de coherencia de los datos al volver a habilitar el control de versiones del sistema y obtener una ventaja de rendimiento. Tareas como la creación de estadísticas, la conmutación de particiones o la aplicación de la compresión en una o ambas tablas no requieren la deshabilitación del control de versiones del sistema.
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. Eliminación del control de versiones del sistema
En este ejemplo se muestra cómo quitar completamente el control de versiones del sistema de la tabla del departamento y cómo quitar la tabla DepartmentHistory. Si lo desea, también puede quitar las columnas de período utilizadas por el sistema para registrar información de versiones del sistema. No se puede quitar la tabla Department ni DepartmentHistory mientras el control de versiones del sistema esté habilitado.
ALTER TABLE Department
SET (SYSTEM_VERSIONING = OFF);
ALTER TABLE Department
DROP PERIOD FOR SYSTEM_TIME;
DROP TABLE DepartmentHistory;
Ejemplos: Azure Synapse Analytics y Analytics Platform System (PDW)
En todos los ejemplos siguientes, del A al C, se usa la tabla FactResellerSales de la base de datos AdventureWorksPDW2022.
A. Determinación de si se crean particiones de una tabla
La consulta siguiente devuelve una o más filas si la tabla tiene particiones FactResellerSales . Si la tabla no tiene particiones, la consulta no devuelve ninguna fila.
SELECT *
FROM sys.partitions AS p
INNER JOIN sys.tables AS t
ON p.object_id = t.object_id
WHERE p.partition_id IS NOT NULL
AND t.name = 'FactResellerSales';
B. Determinación de los valores de límite para una tabla con particiones
La consulta siguiente devuelve los valores de límite para cada partición de la tabla FactResellerSales .
SELECT t.name AS TableName,
i.name AS IndexName,
p.partition_number,
p.partition_id,
i.data_space_id,
f.function_id,
f.type_desc,
r.boundary_id,
r.value AS BoundaryValue
FROM sys.tables AS t
INNER JOIN sys.indexes AS i
ON t.object_id = i.object_id
INNER JOIN sys.partitions AS p
ON i.object_id = p.object_id
AND i.index_id = p.index_id
INNER JOIN sys.partition_schemes AS s
ON i.data_space_id = s.data_space_id
INNER JOIN sys.partition_functions AS f
ON s.function_id = f.function_id
LEFT OUTER JOIN sys.partition_range_values AS r
ON f.function_id = r.function_id
AND r.boundary_id = p.partition_number
WHERE t.name = 'FactResellerSales'
AND i.type <= 1
ORDER BY p.partition_number;
C. Determinación de la columna de partición de una tabla con particiones
La consulta siguiente devuelve el nombre de la columna de partición de la FactResellerSales tabla.
SELECT t.object_id AS Object_ID,
t.name AS TableName,
ic.column_id AS PartitioningColumnID,
c.name AS PartitioningColumnName
FROM sys.tables AS t
INNER JOIN sys.indexes AS i
ON t.object_id = i.object_id
INNER JOIN sys.columns AS c
ON t.object_id = c.object_id
INNER JOIN sys.partition_schemes AS ps
ON ps.data_space_id = i.data_space_id
INNER JOIN sys.index_columns AS ic
ON ic.object_id = i.object_id
AND ic.index_id = i.index_id
AND ic.partition_ordinal > 0
WHERE t.name = 'FactResellerSales'
AND i.type <= 1
AND c.column_id = ic.column_id;
D. Combinación de dos particiones
En el ejemplo siguiente se combinan dos particiones en una tabla.
La tabla Customer tiene la definición siguiente:
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)
)
);
El comando siguiente combina los límites de partición 10 y 25.
ALTER TABLE Customer MERGE RANGE (10);
El nuevo archivo DDL para la tabla es:
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. División de una partición
En el ejemplo siguiente se divide una partición de una tabla.
La tabla Customer tiene el siguiente archivo 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)
)
);
El siguiente comando crea un nuevo límite de partición por el valor 75, entre 50 y 100.
ALTER TABLE Customer SPLIT RANGE (75);
El nuevo archivo DDL para la tabla es:
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. Uso de SWITCH para mover una partición a una tabla de historial
En el siguiente ejemplo se mueven los datos de una partición de la tabla Orders a una partición de la tabla OrdersHistory.
La tabla Orders tiene el siguiente archivo 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')
)
);
En este ejemplo, la tabla Orders tiene las siguientes particiones. Cada partición contiene datos.
| Partition | ¿Tiene datos? | Intervalo de límites |
|---|---|---|
1 |
Yes | OrderDate < '2004-01-01' |
2 |
Yes | '2004-01-01' <= OrderDate < '2005-01-01' |
3 |
Yes | '2005-01-01' <= OrderDate< '2006-01-01' |
4 |
Yes | '2006-01-01'<= OrderDate < '2007-01-01' |
5 |
Yes | '2007-01-01' <= OrderDate |
- Partición 1 (tiene datos):
OrderDate < '2004-01-01' - Partición 2 (tiene datos):
'2004-01-01' <= OrderDate < '2005-01-01' - Partición 3 (tiene datos):
'2005-01-01' <= OrderDate< '2006-01-01' - Partición 4 (tiene datos):
'2006-01-01'<= OrderDate < '2007-01-01' - Partición 5 (tiene datos):
'2007-01-01' <= OrderDate
La tabla OrdersHistory tiene el siguiente DDL, que tiene columnas y nombres de columna idénticos a los de la tabla Orders. Ambos tienen una distribución de hash en la columna id.
CREATE TABLE OrdersHistory
(
id INT,
city VARCHAR (25),
lastUpdateDate DATE,
orderDate DATE
)
WITH (
DISTRIBUTION = HASH(id),
PARTITION(orderDate RANGE RIGHT
FOR VALUES ('2004-01-01')
)
);
Aunque las columnas y los nombres de columna deben ser iguales, no es necesario que los límites de partición sean iguales. En este ejemplo, la tabla OrdersHistory tiene las dos siguientes particiones y ambas están vacías:
- Partición 1 (sin datos):
OrderDate < '2004-01-01' - Partición 2 (vacía):
'2004-01-01' <= OrderDate
En las dos tablas anteriores, el siguiente comando mueve todas las filas con OrderDate < '2004-01-01' de la tabla Orders a la tabla OrdersHistory.
ALTER TABLE Orders SWITCH PARTITION 1 TO OrdersHistory PARTITION 1;
Como resultado, la primera partición de Orders está vacía y la primera partición de OrdersHistory contiene datos. Ahora, las tablas aparecen como se muestra a continuación:
Tabla Orders
- Partición 1 (vacía):
OrderDate < '2004-01-01' - Partición 2 (tiene datos):
'2004-01-01' <= OrderDate < '2005-01-01' - Partición 3 (tiene datos):
'2005-01-01' <= OrderDate< '2006-01-01' - Partición 4 (tiene datos):
'2006-01-01'<= OrderDate < '2007-01-01' - Partición 5 (tiene datos):
'2007-01-01' <= OrderDate
Tabla OrdersHistory
- Partición 1 (tiene datos):
OrderDate < '2004-01-01' - Partición 2 (vacía):
'2004-01-01' <= OrderDate
Para limpiar la tabla, puede quitar la partición vacía mediante la combinación de particiones Orders y 1 de la 2 siguiente manera:
ALTER TABLE Orders MERGE RANGE ('2004-01-01');
Después de la combinación, la tabla Orders tiene las siguientes particiones:
Tabla Orders
- Partición 1 (tiene datos):
OrderDate < '2005-01-01' - Partición 2 (tiene datos):
'2005-01-01' <= OrderDate< '2006-01-01' - Partición 3 (tiene datos):
'2006-01-01'<= OrderDate < '2007-01-01' - Partición 4 (tiene datos):
'2007-01-01' <= OrderDate
Supongamos que termina otro año y quiere archivar el año 2005. Puede asignar una partición vacía al año 2005 en la tabla OrdersHistory dividiendo la partición vacía como se indica a continuación:
ALTER TABLE OrdersHistory SPLIT RANGE ('2005-01-01');
Después de la división, la tabla OrdersHistory tiene las siguientes particiones:
Tabla OrdersHistory
- Partición 1 (tiene datos):
OrderDate < '2004-01-01' - Partición 2 (vacía):
'2004-01-01' < '2005-01-01' - Partición 3 (vacía):
'2005-01-01' <= OrderDate
Contenido relacionado
- sys.tables
- sp_rename
- sp_help
- EVENTDATA (Transact-SQL)
- CREATE TABLE (Transact-SQL)
- DROP TABLE (Transact-SQL)
- ALTER TABLE column_constraint (Transact-SQL)
- ALTER TABLE column_definition (Transact-SQL)
- ALTER TABLE computed_column_definition (Transact-SQL)
- ALTER TABLE index_option (Transact-SQL)
- ALTER TABLE table_constraint (Transact-SQL)