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.
Se aplica a:SQL Server
Azure SQL Database
Instancia
administrada de Azure SQLAzure Synapse Analytics
Analytics Platform System (PDW)
Almacenamiento en Microsoft Fabric
Base de datos SQL en 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.
Note
Actualmente, ALTER TABLE en Fabric Warehouse solo se admiten restricciones y se agregan columnas que aceptan valores NULL. Consulte sintaxis de para warehouse en Microsoft Fabric.
Actualmente, las tablas optimizadas para memoria no están disponibles en la base de datos SQL de Microsoft Fabric.
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 más información sobre las convenciones de sintaxis, vea Convenciones de sintaxis de Transact-SQL.
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
- ALTER TABLE column_definition
- ALTER TABLE computed_column_definition
- ALTER TABLE index_option
- ALTER TABLE table_constraint
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 para Azure Synapse Analytics y Almacenamiento de datos paralelos
ALTER TABLE { database_name.schema_name.source_table_name | schema_name.source_table_name | source_table_name }
{
ALTER COLUMN column_name
{
type_name [ ( precision [ , scale ] ) ]
[ COLLATE Windows_collation_name ]
[ NULL | NOT NULL ]
}
| ADD { <column_definition> | <column_constraint> FOR column_name} [ ,...n ]
| DROP { COLUMN column_name | [CONSTRAINT] constraint_name } [ ,...n ]
| REBUILD {
[ PARTITION = ALL [ WITH ( <rebuild_option> ) ] ]
| [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_option> ] ]
}
| { SPLIT | MERGE } RANGE (boundary_value)
| SWITCH [ PARTITION source_partition_number
TO target_table_name [ PARTITION target_partition_number ] [ WITH ( TRUNCATE_TARGET = ON | OFF ) ] ]
}
[ ; ]
<column_definition>::=
{
column_name
type_name [ ( precision [ , scale ] ) ]
[ <column_constraint> ]
[ COLLATE Windows_collation_name ]
[ NULL | NOT NULL ]
}
<column_constraint>::=
[ CONSTRAINT constraint_name ]
{
DEFAULT constant_expression
| PRIMARY KEY NONCLUSTERED (column_name [ ,... n ]) NOT ENFORCED -- Applies to Azure Synapse Analytics only
| UNIQUE (column_name [ ,... n ]) NOT ENFORCED -- Applies to Azure Synapse Analytics only
}
<rebuild_option > ::=
{
DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
[ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]
| XML_COMPRESSION = { ON | OFF }
[ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]
}
<single_partition_rebuild_option > ::=
{
DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
}
Note
El grupo de SQL sin servidor en Azure Synapse Analytics solo admite tablas externas y temporales.
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> ::=
datetime2 ( n )
| date
| time ( n )
| float [ ( n ) ]
| real [ ( n ) ]
| decimal [ ( precision [ , scale ] ) ]
| numeric [ ( precision [ , scale ] ) ]
| bigint
| int
| smallint
| bit
| varchar [ ( n ) ]
| char [ ( n ) ]
| varbinary [ ( n ) ]
| uniqueidentifier
<column_constraint>::=
[ CONSTRAINT constraint_name ]
{
PRIMARY KEY NONCLUSTERED (column_name [ ,... n ]) NOT ENFORCED
| UNIQUE NONCLUSTERED (column_name [ ,... n ]) NOT ENFORCED
| FOREIGN KEY
( column [ ,...n ] )
REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ] NOT ENFORCED
}
Arguments
database_name
El nombre de la base de datos en la que se creó la tabla.
schema_name
El nombre del esquema al que pertenece la tabla.
table_name
El nombre de la tabla que se va a modificar. Si la tabla no escla base de datos actual o no está contenida en el esquema propiedad del usuario actual, la base de datos y el esquema deben especificarse explícitamente.
COLUMNA ALTER
Especifica que la columna con nombre va a cambiarse o modificarse.
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 . Los usuarios deben ejecutarseDROP STATISTICSpara quitar las estadísticas antes deALTER COLUMNque se puedan realizar correctamente. Ejecute esta consulta para obtener todas las estadísticas y las columnas de 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>');Note
Las estadísticas generadas automáticamente por el optimizador de consultas se quitan automáticamente mediante
ALTER COLUMN.Se usa en una
PRIMARY KEYrestricción o[FOREIGN KEY] REFERENCES.Se usa en una
CHECKrestricción oUNIQUE. Sin embargo, se permite cambiar la longitud de una columna de longitud variable utilizada en unaCHECKrestricción oUNIQUE.Una columna asociada a la definición predeterminada. No obstante, la longitud, precisión o escala de una columna puede cambiarse si el tipo de datos no se cambia.
El tipo de datos de las columnas text, ntext e image solo se puede cambiar de las formas 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 por char o varchar puede provocar la conversión de caracteres extendidos. Para obtener más información, vea CAST y CONVERT. Reducir la precisión o escala de una columna puede dar como resultado que se trunquen los datos.
Note
El tipo de datos de una columna de una tabla con particiones no puede cambiarse.
El tipo de datos de las columnas incluidas en un índice no puede cambiarse, a menos que la columna sea del tipo de datos varchar, nvarchar o varbinary y que el nuevo tamaño sea igual o mayor que el tamaño anterior.
Una columna incluida en una restricción de clave principal no se puede cambiar de NOT NULL a NULL.
Al usar Always Encrypted (sin enclaves seguros), si la columna que se va a modificar está 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 columna, si va a cambiar la clave) admita los cálculos de enclave (cifrados con claves maestras de columna habilitadas para el 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 de registro. Si esto sucede, obtendrá el error 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.
column_name
El 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 de SQL Server.
- Un tipo de datos del alias basado en el tipo de datos del sistema de 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. - Un tipo definido por el usuario de .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.
A continuación se indican los criterios de type_name en 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_NULL los valores predeterminados siempre están activados para
ALTER 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 se 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.
precision
La precisión del tipo de datos especificado. Para obtener más información sobre los valores de precisión válidos, vea Precisión, escala y longitud.
scale
La escala del tipo de datos especificado. Para obtener más información sobre los valores de escala válidos, vea Precisión, escala y longitud.
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
Se aplica a: 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, cree primero la colección de esquema en la base de datos mediante el uso de CREATE XML SCHEMA COLLECTION.
COLLATE <nombre_de_intercalación>
Especifica la nueva intercalación para la columna alterada. Si no se especifica, 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 de Windows o un nombre de intercalación de SQL. Para obtener una lista y más información, vea Nombre de intercalación de Windows y Nombre de intercalación de SQL Server.
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 independientes ALTER TABLE 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, consulte COLLATE.
NULL | NO NULL
Especifica si la columna puede aceptar valores NULL. Las columnas que no permiten valores NULL se agregan solo si ALTER TABLE tienen un valor predeterminado especificado o si la tabla está vacía. Solo puede especificar NOT NULL para las columnas calculadas si también ha especificado 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. Y 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. Los valores NULL deben actualizarse a algún valor antes ALTER COLUMNNOT NULL de permitir , 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 con las CREATE TABLE instrucciones o ALTER TABLE , la configuración de la base de datos y la sesión influyen y posiblemente invalidan la nulabilidad del tipo de datos que se usa en una definición de columna. Asegúrese de definir siempre 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.
Note
Si NULL o NOT NULL se especifica con ALTER COLUMN, también debe especificarse 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 ]
Se aplica a: 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 . Además, 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 más información, consulte SET QUOTED_IDENTIFIER.
Cualquier columna calculada que se use como columna de partición de una tabla con particiones debe marcarse PERSISTEDexplícitamente .
Note
En la base de datos SQL de Fabric, se permiten columnas calculadas, pero actualmente no se reflejan en Fabric OneLake.
NO SE PUEDE DEJAR PARA REPLICACIÓN
Se aplica a: 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')
Se aplica a: 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>
Se aplica a: 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.
La columna alter en línea permite al usuario crear y autostatistics 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 estadísticas o índices, no podrá realizar una operación para alterar la columna.
Mientras se ejecuta la operación alter column en línea, se bloquea cualquier operación DDL que pueda depender de esa columna (como la creación o modificación de índices, vistas, etc.) o se produce un error adecuado. Este comportamiento garantiza que no se produzcan problemas en la alteración de columna en línea debido a las dependencias introducidas durante la ejecución de 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 opción
WAIT_AT_LOW_PRIORITYno puede utilizarse con alteración de columna en línea.ALTER COLUMN ... ADD/DROP PERSISTEDno se admite para la alteración de columna en línea.ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATIONno se ve afectado por la alteración de columna en línea.La alteración de columna en línea no admite la modificación de una tabla con el seguimiento de cambios habilitado que sea un publicador de replicación de mezcla.
La alteración de columna en línea no admite la alteración desde tipos de datos CLR o a estos.
La alteración de columna en línea no admite la alteración a un tipo de datos XML con una colección de esquemas diferente a la colección de esquemas actual.
La alteración de columna en línea no reduce las restricciones sobre cuándo se puede modificar una columna. Las referencias de las estadísticas/índice, etc. podrían provocar el error de la alteración.
La alteración de columna en línea no admite la modificación de más de una columna simultáneamente.
La alteración de columna en línea no tiene ningún efecto en caso de tablas temporales con versiones del sistema.
ALTERcolumn no se ejecuta como en línea independientemente del valor especificado paraONLINEla opción.
La alteración de columna en línea tiene requisitos, restricciones y funciones similares a los de la regeneración de índice en línea, lo cual incluye lo siguiente:
- 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 para las alteraciones de columna en línea.
- 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. No se recomienda que haga esto, excepto en casos muy contados. 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 ALTER TABLE instrucción , las instrucciones CREATE INDEX, DROP INDEX, ALTER INDEX y PAD_INDEX no se admiten para índices en tablas optimizadas para memoria.
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 ALTER TABLE instrucción , las instrucciones CREATE INDEX, DROP INDEX, ALTER INDEX y PAD_INDEX no se admiten para índices en tablas optimizadas para memoria.
PERÍODO DE SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )
Se aplica a: 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 punto con HIDDEN marca para ocultar implícitamente estas columnas de modo que SELECT * FROM <table_name> no devuelvan 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 ALTER TABLE instrucción , las instrucciones CREATE INDEX, DROP INDEX, ALTER INDEX y PAD_INDEX no se admiten para índices en tablas optimizadas para memoria.
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 el espacio mediante la creación de un índice agrupado en la tabla o regenerando un índice agrupado existente mediante la utilización de ALTER INDEX. 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
Se aplica a: 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
Se aplica a: 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, vea Configurar operaciones de índice en paralelo.
Note
Las operaciones de índices en paralelo no están disponibles en todas las ediciones de SQL Server. Para obtener más información, consulte Ediciones 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, consulte Ediciones y características admitidas de SQL Server 2022.
MOVER A { partition_scheme_name(column_name [ ,... n ] ) | grupo de archivos | "default" }
Se aplica a: 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 más información, consulte SET QUOTED_IDENTIFIER.
{ 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
Se aplica a: 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 Opciones de ALTER DATABASE SET.
Para habilitar el seguimiento de cambios, la tabla debe tener una clave principal.
CON ( TRACK_COLUMNS_UPDATED = { ON | DESACTIVADO } )
Se aplica a: SQL Server y Azure SQL Database.
Especifica si Motor de base de datos realiza el seguimiento de las columnas sometidas a seguimiento de cambios que se actualizaron. El valor predeterminado es OFF.
CAMBIA [ PARTICIÓN source_partition_number_expression ] A [ schema_name. ] target_table [ PARTICIÓN target_partition_number_expression ]
Se aplica a: 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 de 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 crearon en un formato de solo lectura antes de la versión 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 índices 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" })
Se aplica a: SQL Server. Azure SQL Database no es compatible con 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 para CREATE TABLE. 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 , o bien 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 } ] ) ] } )
Se aplica a: 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 } }
Se aplica a: 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
Se aplica a:solo para Azure SQL Edge
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 } )
Se aplica a: SQL Server y Azure SQL Database.
Especifica los métodos permitidos de extensión de bloqueo para una tabla.
AUTO
Esta opción permite a Motor de base de datos de SQL Server seleccionar la granularidad de la extensión de bloqueo que sea 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, si está examinando una tabla que no tiene ningún índice agrupado en el nivel de aislamiento serializable, Motor de base de datos debe realizar un bloqueo de la 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
Se aplica a: 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 una descripción completa de las opciones de recompilación, consulte ALTER TABLE index_option.
DATA_COMPRESSION
Se aplica a: 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
Se aplica a: 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
Se aplica a: 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 está permitido en la base de datos SQL de Microsoft Fabric.
XML_COMPRESSION
Se aplica a 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
Se aplica a: 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
Se aplica a: 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 )
Se aplica a: 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
Se aplica a: 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.
Si quiere deshabilitar Stretch para una tabla y copiar los datos remotos de ella de Azure a SQL Server, ejecute el siguiente comando. 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 que todos los datos remotos se han copiado desde Azure en SQL Server, se deshabilita Stretch 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 quiere eliminar la tabla remota, tiene que quitarla mediante Azure Portal.
[ FILTER_PREDICATE = { null | predicado } ]
Se aplica a: 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 }
Se aplica a: 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 deshabilite 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
Se aplica a: 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 ]
Se aplica a: 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 }
Se aplica a: 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
Se aplica a: 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}
Se aplica a: 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 de ALTER TABLE index_option en ALTER TABLE table_constraint.
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, utilice INSERT. Para quitar filas de datos, utilice DELETE o TRUNCATE TABLE. Para cambiar los valores de las filas existentes, utilice UPDATE.
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.
En la base de datos SQL en Microsoft Fabric, algunas características de tabla pueden crearse pero no se reflejan en el OneLake de Fabric. Para más información, consulte Limitaciones para el reflejo de bases de datos Fabric SQL.
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
Cambios que especifique en ALTER TABLE implementar inmediatamente. Si los cambios requieren modificaciones de 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 NOT NULL columna 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.
Se aplica a Warehouse en Microsoft Fabric.
ALTER TABLE no puede formar parte de una transacción explícita.
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 la edición Enterprise de SQL Server 2012 (11.x) y versiones posteriores, agregar una NOT NULL columna con un valor predeterminado es una operación en línea cuando el valor predeterminado es una constante en tiempo de ejecución. Esto significa que la operación se completa 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.
Las columnas de tipo varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography o CLR no se pueden agregar en una operación en línea. Una columna no se puede agregar en línea si al hacerlo provoca que el tamaño máximo posible de fila supere el límite de 8.060 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, el número de procesadores empleados para ejecutar una sola ALTER TABLE ADD instrucción (basada en índices) CONSTRAINT o DROP (índice agrupado) CONSTRAINT viene determinada por la opción de configuración grado máximo de paralelismo y la carga de trabajo actual. Si el Motor de base de datos detecta que el sistema está ocupado, el grado de paralelismo de la operación se reduce automáticamente antes de comenzar la ejecución de la instrucción. Puede configurar manualmente el número de procesadores que se usan para ejecutar la instrucción especificando la 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 operaciones SWITCH 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 se usa para las tablas sin particiones. Sin embargo, esta instrucción no puede utilizarse para cambiar la forma en que se realizan las particiones de la tabla misma. Para volver a realizar las particiones de una tabla con particiones, utilice ALTER PARTITION SCHEME y ALTER PARTITION FUNCTION. 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. Se permite agregar una columna. No obstante, no se permite quitar ni cambiar una columna que participa en una vista enlazada a esquema. Si la ALTER TABLE instrucción requiere cambiar una columna usada en una vista enlazada al esquema, ALTER TABLE se produce un error y el motor de base de datos genera un mensaje de error. Para obtener más información acerca de los enlaces a esquemas y vistas indizadas, vea CREATE VIEW.
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. Los índices creados con CREATE INDEX deben quitarse con DROP INDEX. Use la ALTER INDEX instrucción para volver a generar una parte de índice de una definición de restricción; la restricción no tiene que quitarse y agregarse de nuevo con ALTER TABLE.
Todos los índices y restricciones basados en una columna deben eliminarse para que se pueda quitar la 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
MOVE TOno se especifica, la tabla se encuentra en el mismo esquema de partición o grupo de archivos que se definió para el índice clúster.
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. Los índices deshabilitados se deben quitar medianteONLINE = OFF. - Solo un índice puede quitarse cada 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.
Para quitar un índice clúster, se necesita un espacio temporal en disco del mismo tamaño que el del índice clúster existente. Este espacio adicional se libera en cuanto se completa la operación.
Note
Las opciones enumeradas en <drop_clustered_constraint_option> se aplican a índices agrupados en tablas y no se pueden aplicar a índices agrupados en vistas o índices no clúster.
Replicación de cambios de esquema
Cuando se ejecuta ALTER TABLE en una tabla publicada en un publicador de SQL Server, de forma predeterminada, ese cambio se propaga a todos los suscriptores de SQL Server. 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
En las tablas del sistema no se puede habilitar la compresión. Si la tabla es un montón, la operación de recompilación para ONLINE el modo es 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 mediante 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 a fin de regenerar el índice en línea, todas las transacciones activas de bloqueo 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 vigencia del bloqueo para volver a generar el índice en línea es muy corta, si se espera a que las transacciones abiertas en una tabla dada se completen y se bloquean las nuevas transacciones que se inician, se podría afectar significativamente al rendimiento. Esto puede provocar un retraso o un tiempo de espera en la carga de trabajo y limitar mucho el acceso a la tabla base. 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, la especificación de un nombre de tabla con uno de los siguientes formatos produce el error 117 en tiempo de compilación.
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 ha definido 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 AdventureWorks2025 base de datos de ejemplo o AdventureWorksDW2025 , que puede descargar desde la página principal ejemplos de Microsoft SQL Server y proyectos de comunidad .
| 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; colació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 tiene valores proporcionados a través de 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 tanto, WITH NOCHECK se usa para evitar que la restricción se valide en las filas existentes y para poder agregar 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 y la otra columna sigue siendo NULL. A continuación se agrega una restricción DEFAULT a la segunda columna. Para comprobar que se aplica el valor predeterminado, se inserta otro valor en la primera columna y se 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 WITH VALUES no se usa, 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 .
Se aplica a: 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 si esta ya contiene columnas dispersas. El código para crear la tabla T2 es el siguiente.
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
En los ejemplos de esta sección se muestra 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 ContactBackup y, a continuación, se modifica la tabla; primero se agrega una restricción FOREIGN KEY que hace referencia a la tabla Person.Person y, a continuación, se quita la restricción FOREIGN KEY.
CREATE TABLE Person.ContactBackup (ContactID INT);
GO
ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBackup_Contact
FOREIGN KEY (ContactID) REFERENCES Person.Person (BusinessEntityID);
GO
ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBackup_Contact;
GO
DROP TABLE Person.ContactBackup;
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 se puede aumentar el tamaño de columna. Observe también que col_a se define en un índice único. El tamaño de todavía se puede aumentar 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. Primero, se crea una tabla con la intercalación predeterminada del usuario.
CREATE TABLE T3
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) NULL,
C3 INT NULL,
C4 INT
);
GO
Después, la intercalación de la columna C2 se cambia a Latin1_General_BIN. El tipo de datos se requiere, incluso aunque no se cambie.
ALTER TABLE T3
ALTER COLUMN C2 VARCHAR (50) COLLATE Latin1_General_BIN;
GO
D. Cifrado de columnas
El ejemplo siguiente 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
Después, se cifra la columna "C2" con una clave de cifrado de columna, denominada CEK1, y un cifrado aleatorio. Para que la siguiente instrucción se realice correctamente:
- La clave de cifrado de la columna debe estar habilitada para el enclave. Es decir, debe cifrarse con una clave maestra de columna (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.
Se aplica a: 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.
Se aplica a: 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. Esto resulta útil para el archivado o para otras situaciones que requieran menos espacio y en las que pueda permitirse más tiempo para el almacenamiento y recuperación.
Se aplica a: 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.
Se aplica a: 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 .
Se aplica a: 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.
Se aplica a: 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.
Se aplica a: 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.
Se aplica a: 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.
NOCHECK CONSTRAINT se usa con ALTER TABLE para deshabilitar la restricción y permitir una inserción que normalmente infringiría la restricción.
CHECK CONSTRAINT vuelve 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 opción DISABLE TRIGGER de ALTER TABLE para deshabilitar el desencadenador y permitir una inserción que normalmente infringiría el desencadenador. Después se usa 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.
Se aplica a: 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 .
Se aplica a: 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.
Se aplica a: 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 Sistema de la plataforma de análisis (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, no se 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)
- CREAR TABLA (Transact-SQL)
- MESA DE CAÍDA (Transact-SQL)
- ALTER TABLE column_constraint (Transact-SQL)
- ALTER TABLE column_definition (Transact-SQL)
- ALTER TABLE definición_de_columna_calculada (Transact-SQL)
- ALTER TABLE opción_de_índice (Transact-SQL)
- ALTER TABLE table_constraint (Transact-SQL)