Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance
Azure SQLAzure Synapse Analytics
PdW (Analytics Platform System)
Sklad v Microsoft Fabric
Databáze SQL v Microsoft Fabric
Upraví definici tabulky změnou, přidáním nebo vyřazením sloupců a omezení.
ALTER TABLE také znovu přiřazuje a znovu sestavuje oddíly nebo zakazuje a povoluje omezení a triggery.
Note
V současné době se ALTER TABLE ve službě Fabric Warehouse podporuje pouze pro omezení a přidávání sloupců s možnou hodnotou null. Viz syntaxe pro sklad v Microsoft Fabric.
V současnosti nejsou tabulky optimalizované pro paměť dostupné v SQL databázích v Microsoft Fabric.
Syntaxe pro ALTER TABLE tabulky založené na disku a tabulky optimalizované pro paměť se liší. Pomocí následujících odkazů přejdete přímo na příslušný blok syntaxe pro vaše typy tabulek a na odpovídající příklady syntaxe:
Diskové tabulky:
Tabulky optimalizované pro paměť:
Další informace o konvencích syntaxe najdete v tématu Transact-SQL konvence syntaxe.
Syntaxe pro diskové tabulky
ALTER TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
{
ALTER COLUMN column_name
{
[ type_schema_name. ] type_name
[ (
{
precision [ , scale ]
| max
| xml_schema_collection
}
) ]
[ COLLATE collation_name ]
[ NULL | NOT NULL ] [ SPARSE ]
| { ADD | DROP }
{ ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION | SPARSE | HIDDEN }
| { ADD | DROP } MASKED [ WITH ( FUNCTION = ' mask_function ') ]
}
[ WITH ( ONLINE = ON | OFF ) ]
| [ WITH { CHECK | NOCHECK } ]
| ADD
{
<column_definition>
| <computed_column_definition>
| <table_constraint>
| <column_set_definition>
} [ ,...n ]
| [ system_start_time_column_name datetime2 GENERATED ALWAYS AS ROW START
[ HIDDEN ] [ NOT NULL ] [ CONSTRAINT constraint_name ]
DEFAULT constant_expression [WITH VALUES] ,
system_end_time_column_name datetime2 GENERATED ALWAYS AS ROW END
[ HIDDEN ] [ NOT NULL ][ CONSTRAINT constraint_name ]
DEFAULT constant_expression [WITH VALUES] ,
start_transaction_id_column_name bigint GENERATED ALWAYS AS TRANSACTION_ID START
[ HIDDEN ] NOT NULL [ CONSTRAINT constraint_name ]
DEFAULT constant_expression [WITH VALUES],
end_transaction_id_column_name bigint GENERATED ALWAYS AS TRANSACTION_ID END
[ HIDDEN ] NULL [ CONSTRAINT constraint_name ]
DEFAULT constant_expression [WITH VALUES],
start_sequence_number_column_name bigint GENERATED ALWAYS AS SEQUENCE_NUMBER START
[ HIDDEN ] NOT NULL [ CONSTRAINT constraint_name ]
DEFAULT constant_expression [WITH VALUES],
end_sequence_number_column_name bigint GENERATED ALWAYS AS SEQUENCE_NUMBER END
[ HIDDEN ] NULL [ CONSTRAINT constraint_name ]
DEFAULT constant_expression [WITH VALUES]
]
PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )
| DROP
[ {
[ CONSTRAINT ][ IF EXISTS ]
{
constraint_name
[ WITH
( <drop_clustered_constraint_option> [ ,...n ] )
]
} [ ,...n ]
| COLUMN [ IF EXISTS ]
{
column_name
} [ ,...n ]
| PERIOD FOR SYSTEM_TIME
} [ ,...n ] ]
| [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT
{ ALL | constraint_name [ ,...n ] }
| { ENABLE | DISABLE } TRIGGER
{ ALL | trigger_name [ ,...n ] }
| { ENABLE | DISABLE } CHANGE_TRACKING
[ WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } ) ]
| SWITCH [ PARTITION source_partition_number_expression ]
TO target_table
[ PARTITION target_partition_number_expression ]
[ WITH ( <low_priority_lock_wait> ) ]
| SET
(
[ FILESTREAM_ON =
{ partition_scheme_name | filegroup | "default" | "NULL" } ]
| SYSTEM_VERSIONING =
{
OFF
| ON
[ ( HISTORY_TABLE = schema_name . history_table_name
[, DATA_CONSISTENCY_CHECK = { ON | OFF } ]
[, HISTORY_RETENTION_PERIOD =
{
INFINITE | number {DAY | DAYS | WEEK | WEEKS
| MONTH | MONTHS | YEAR | YEARS }
}
]
)
]
}
| DATA_DELETION =
{
OFF
| ON
[( [ FILTER_COLUMN = column_name ]
[, RETENTION_PERIOD = { INFINITE | number { DAY | DAYS | WEEK | WEEKS
| MONTH | MONTHS | YEAR | YEARS } } ]
)]
} )
| REBUILD
[ [PARTITION = ALL]
[ WITH ( <rebuild_option> [ ,...n ] ) ]
| [ PARTITION = partition_number
[ WITH ( <single_partition_rebuild_option> [ ,...n ] ) ]
]
]
| <table_option>
| <filetable_option>
| <stretch_configuration>
}
[ ; ]
-- ALTER TABLE options
<column_set_definition> ::=
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
<drop_clustered_constraint_option> ::=
{
MAXDOP = max_degree_of_parallelism
| ONLINE = { ON | OFF }
| MOVE TO
{ partition_scheme_name ( column_name ) | filegroup | "default" }
}
<table_option> ::=
{
SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
}
<filetable_option> ::=
{
[ { ENABLE | DISABLE } FILETABLE_NAMESPACE ]
[ SET ( FILETABLE_DIRECTORY = directory_name ) ]
}
<stretch_configuration> ::=
{
SET (
REMOTE_DATA_ARCHIVE
{
= ON (<table_stretch_options>)
| = OFF_WITHOUT_DATA_RECOVERY ( MIGRATION_STATE = PAUSED )
| ( <table_stretch_options> [, ...n] )
}
)
}
<table_stretch_options> ::=
{
[ FILTER_PREDICATE = { null | table_predicate_function } , ]
MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }
}
<single_partition_rebuild__option> ::=
{
SORT_IN_TEMPDB = { ON | OFF }
| MAXDOP = max_degree_of_parallelism
| DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE}
| ONLINE = { ON [( <low_priority_lock_wait> ) ] | OFF }
}
<low_priority_lock_wait>::=
{
WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ],
ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )
}
Další informace najdete tady:
- STOL column_constraint
- STOL column_definition
- STOL computed_column_definition
- ALTER TABLE index_option
- ALTER TABLE table_constraint
Syntaxe pro tabulky optimalizované pro paměť
ALTER TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
{
ALTER COLUMN column_name
{
[ type_schema_name. ] type_name
[ (
{
precision [ , scale ]
}
) ]
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
}
| ALTER INDEX index_name
{
[ type_schema_name. ] type_name
REBUILD
[ [ NONCLUSTERED ] WITH ( BUCKET_COUNT = bucket_count )
]
}
| ADD
{
<column_definition>
| <computed_column_definition>
| <table_constraint>
| <table_index>
| <column_index>
} [ ,...n ]
| DROP
[ {
CONSTRAINT [ IF EXISTS ]
{
constraint_name
} [ ,...n ]
| INDEX [ IF EXISTS ]
{
index_name
} [ ,...n ]
| COLUMN [ IF EXISTS ]
{
column_name
} [ ,...n ]
| PERIOD FOR SYSTEM_TIME
} [ ,...n ] ]
| [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT
{ ALL | constraint_name [ ,...n ] }
| { ENABLE | DISABLE } TRIGGER
{ ALL | trigger_name [ ,...n ] }
| SWITCH [ [ PARTITION ] source_partition_number_expression ]
TO target_table
[ PARTITION target_partition_number_expression ]
[ WITH ( <low_priority_lock_wait> ) ]
}
[ ; ]
-- ALTER TABLE options
< table_constraint > ::=
[ CONSTRAINT constraint_name ]
{
{PRIMARY KEY | UNIQUE }
{
NONCLUSTERED (column [ ASC | DESC ] [ ,... n ])
| NONCLUSTERED HASH (column [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
}
| FOREIGN KEY
( column [ ,...n ] )
REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]
| CHECK ( logical_expression )
}
<column_index> ::=
INDEX index_name
{ [ NONCLUSTERED ] | [ NONCLUSTERED ] HASH WITH (BUCKET_COUNT = bucket_count) }
<table_index> ::=
INDEX index_name
{ [ NONCLUSTERED ] HASH (column [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count)
| [ NONCLUSTERED ] (column [ ASC | DESC ] [ ,... n ] )
[ ON filegroup_name | default ]
| CLUSTERED COLUMNSTORE [ WITH ( COMPRESSION_DELAY = { 0 | delay [MINUTES] } ) ]
[ ON filegroup_name | default ]
}
Syntaxe pro Azure Synapse Analytics a paralelní datový sklad
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
Bezserverový fond SQL ve službě Azure Synapse Analytics podporuje pouze externí a dočasných tabulek.
Syntaxe pro sklad v prostředcích infrastruktury
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
Název databáze, ve které byla tabulka vytvořena.
schema_name
Název schématu, do kterého tabulka patří.
table_name
Název tabulky, která se má změnit. Pokud tabulka není v aktuální databázi nebo obsahuje schéma vlastněné aktuálním uživatelem, musíte explicitně zadat databázi a schéma.
ALTERŮV SLOUP
Určuje, že pojmenovaný sloupec se má změnit nebo změnit.
Upravený sloupec nemůže být následující:
Sloupec s časovým razítkem datový typ.
Tabulka
ROWGUIDCOL.Počítaný sloupec nebo použitý ve vypočítaném sloupci.
Používá se ve statistikách vygenerovaných příkazem
CREATE STATISTICS. Aby uživatelé mohli úspěšně uspět, musí spustitDROP STATISTICSstatistikyALTER COLUMN. Spuštěním tohoto dotazu získáte všechny sloupce statistiky a statistiky vytvořené uživatelem pro tabulku.SELECT s.name AS statistics_name, c.name AS column_name, sc.stats_column_id FROM sys.stats AS s INNER JOIN sys.stats_columns AS sc ON s.object_id = sc.object_id AND s.stats_id = sc.stats_id INNER JOIN sys.columns AS c ON sc.object_id = c.object_id AND c.column_id = sc.column_id WHERE s.object_id = OBJECT_ID('<table_name>');Note
Statistiky, které jsou automaticky generovány optimalizátorem dotazů, se automaticky zahodí
ALTER COLUMN.Používá se v
PRIMARY KEYomezení.[FOREIGN KEY] REFERENCESPoužívá se v
CHECKomezení.UNIQUEZměna délky sloupce proměnné délky použitého vCHECKomezení neboUNIQUEomezení je ale povolená.Přidruženo k výchozí definici. Délku, přesnost nebo měřítko sloupce ale můžete změnit, pokud se datový typ nezmění.
Datový typ text, ntexta obrázku sloupce lze změnit pouze následujícími způsoby:
- textové na varchar(max), nvarchar(max)nebo xml
- ntextvarchar(max), nvarchar(max)nebo xml
- varbinary(max)
Některé změny datového typu můžou způsobit změnu dat. Změna nchar nebo nvarchar sloupec může způsobit převod rozšířených znaků například na char nebo varchar. Další informace naleznete v tématu CAST a CONVERT. Snížení přesnosti nebo měřítka sloupce může způsobit zkrácení dat.
Note
Datový typ sloupce dělené tabulky nelze změnit.
Datový typ sloupců zahrnutých v indexu nelze změnit, pokud není sloupec varchar, nvarcharnebo varbinární datový typ a nová velikost se rovná nebo větší než stará velikost.
Sloupec, který je součástí omezení primárního klíče, nelze změnit z NOT NULL hodnoty na NULL.
Při použití funkce Always Encrypted (bez zabezpečených enkláv), pokud je změněný sloupec zašifrovaný ENCRYPTED WITH, můžete datový typ změnit na kompatibilní datový typ (například INT na BIGINT), ale nemůžete změnit žádné nastavení šifrování.
Pokud používáte funkci Always Encrypted se zabezpečenými enklávami, můžete změnit jakékoli nastavení šifrování, pokud šifrovací klíč sloupce chrání sloupec (a nový šifrovací klíč sloupce, pokud měníte klíč), podporují výpočty enklávy (zašifrované hlavními klíči sloupců s podporou enklávy). Podrobnosti najdete v tématu Always Encrypted se zabezpečenými enklávy.
Když upravíte sloupec, databázový stroj sleduje každou změnu přidáním řádku do systémové tabulky a označením předchozí úpravy sloupce jako vyřazeného sloupce. Ve výjimečných případech, kdy upravujete sloupec příliš mnohokrát, může databázový stroj dosáhnout limitu velikosti záznamu. Pokud k tomu dojde, zobrazí se chyba 511 nebo 1708. Abyste těmto chybám předešli, znovu sestavte clusterovaný index v tabulce pravidelně nebo snižte počet úprav sloupců.
column_name
Název sloupce, který se má změnit, přidat nebo vynechat. Maximální column_name je 128 znaků. U nových sloupců můžete vynechat column_name pro sloupce vytvořené pomocí časového razítka datového typu. Název časové razítko se použije, pokud nezadáte column_name pro sloupec časové razítko datového typu.
Note
Nové sloupce se přidají po změně všech existujících sloupců v tabulce.
[ type_schema_name. ] type_name
Nový datový typ pro změněný sloupec nebo datový typ přidaného sloupce. Nemůžete zadat type_name pro existující sloupce dělených tabulek. type_name může být některý z následujících typů:
- Systémový datový typ SYSTÉMU SQL Server.
- Datový typ aliasu založený na systémovém datovém typu SQL Serveru. Datové typy aliasů
CREATE TYPEvytvoříte příkazem před jejich použitím v definici tabulky. - Uživatelem definovaný typ rozhraní .NET Framework a schéma, do kterého patří. Před použitím definice tabulky vytvoříte uživatelem definované typy s
CREATE TYPEpříkazem.
Níže jsou uvedená kritéria pro type_name změněného sloupce:
- Předchozí datový typ se musí implicitně převést na nový datový typ.
- type_name nemůže být časové razítko.
- ANSI_NULL výchozí hodnoty jsou vždy zapnuté
ALTER COLUMN; pokud není zadaný, sloupec má hodnotu null. -
ANSI_PADDINGodsazení je vždyONproALTER COLUMN. - Pokud je upraveným sloupcem sloupec identity, new_data_type musí být datový typ, který podporuje vlastnost identity.
- Aktuální nastavení
SET ARITHABORTje ignorováno.ALTER TABLEfunguje tak, jako byARITHABORTbyla nastavena naONhodnotu .
Note
COLLATE Pokud není klauzule zadaná, změna datového typu sloupce způsobí změnu kolace na výchozí kolaci databáze.
precision
Přesnost zadaného datového typu. Další informace o platnýchhodnotách
scale
Měřítko pro zadaný datový typ. Další informace o platných hodnotách měřítka naleznete v tématu Přesnost, měřítko a délka.
max
Platí pouze pro varchar, nvarchara varbinární datové typy pro ukládání 2^31-1 bajtů znaků, binárních dat a dat Unicode.
xml_schema_collection
Platí pro: SQL Server a Azure SQL Database.
Platí pouze pro xml datový typ pro přidružení schématu XML k typu. Před zadáním sloupce xml do kolekce schématu nejprve vytvoříte kolekci schématu v databázi pomocí CREATE XML SCHEMA COLLECTION.
< COLLATION_NAME> COLLATE
Určuje novou kolaci pro změněný sloupec. Pokud není zadaný, přiřadí se sloupci výchozí kolace databáze. Název kolace může být buď název kolace Systému Windows, nebo název kolace SQL. Seznam a další informace naleznete v tématu Název kolace systému Windows a název kolace SYSTÉMU SQL Server.
Klauzule COLLATE změní kolace pouze sloupců datových typů char, varchar, nchar a nvarchar . Chcete-li změnit kolaci sloupce datového typu aliasu definovaný uživatelem, použijte samostatné ALTER TABLE příkazy ke změně sloupce na systémový datový typ SYSTÉMU SQL Server. Potom změňte kolaci a změňte sloupec zpět na datový typ aliasu.
ALTER COLUMN nemůže mít změnu kolace, pokud existuje jedna nebo více následujících podmínek:
- Změněný
CHECKsloupec odkazuje na omezení,FOREIGN KEYomezení nebo počítané sloupce. - Ve sloupci se vytvoří libovolný index, statistika nebo fulltextový index. Pokud se změní kolace sloupce, statistika vytvořená automaticky u sloupce se zahodí.
- Zobrazení vázané na schéma nebo funkce odkazuje na sloupec.
Další informace o podporovaných kolacích naleznete v tématu COLLATE.
NULL | NE NULL
Určuje, jestli sloupec může přijímat hodnoty null. Sloupce, které nepovolují hodnoty null, se přidají jenom v ALTER TABLE případě, že mají zadanou výchozí hodnotu nebo pokud je tabulka prázdná. Pro počítané sloupce můžete zadat NOT NULL pouze v případě, že jste zadali PERSISTEDtaké . Pokud nový sloupec umožňuje hodnoty null a nezadáte výchozí hodnotu, nový sloupec obsahuje hodnotu null pro každý řádek v tabulce. Pokud nový sloupec umožňuje hodnoty null a přidáte výchozí definici s novým sloupcem, můžete použít WITH VALUES k uložení výchozí hodnoty do nového sloupce pro každý existující řádek v tabulce.
Pokud nový sloupec nepovoluje hodnoty null a tabulka není prázdná, musíte do nového sloupce přidat DEFAULT definici. A nový sloupec se automaticky načte s výchozí hodnotou v nových sloupcích v každém existujícím řádku.
NULL
ALTER COLUMN Pokud chcete vynutit, NOT NULL aby sloupec povolil hodnoty null, s výjimkou sloupců v PRIMARY KEY omezeních. Můžete zadat NOT NULLALTER COLUMN pouze v případě, že sloupec neobsahuje žádné hodnoty null. Hodnoty null musí být před povolením aktualizovány na určitou hodnotu ALTER COLUMNNOT NULL , například:
UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL;
ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR (20) NOT NULL;
Když vytvoříte nebo změníte tabulku s CREATE TABLE příkazy nebo ALTER TABLE příkazy, ovlivní nastavení databáze a relace a případně přepíše hodnotu null datového typu, který se používá v definici sloupce. Ujistěte se, že vždy explicitně definujete sloupec jako NULL nebo NOT NULL pro nekomprimované sloupce.
Pokud přidáte sloupec s uživatelem definovaným datovým typem, nezapomeňte definovat sloupec se stejnou hodnotou null jako uživatelem definovaný datový typ. A zadejte výchozí hodnotu sloupce. Další informace naleznete v tématu CREATE TABLE.
Note
Je-li NULL zadána nebo NOT NULL je zadána pomocí ALTER COLUMNparametru , new_data_type [(přesnost [; měřítko ])] musí být zadána také. Pokud se datový typ, přesnost a měřítko nezmění, zadejte hodnoty aktuálního sloupce.
[ {PŘIDAT | DROP} ROWGUIDCOL ]
Platí pro: SQL Server a Azure SQL Database.
Určuje, že ROWGUIDCOL vlastnost je přidána nebo vyřazena ze zadaného sloupce.
ROWGUIDCOL označuje, že sloupec je sloupec guid řádku. Jako sloupec můžete nastavit pouze jeden sloupec uniqueidentifier pro tabulku ROWGUIDCOL . A vlastnost můžete přiřadit ROWGUIDCOL pouze ke sloupci uniqueidentifier . Nemůžete přiřadit ROWGUIDCOL sloupec uživatelem definovaného datového typu.
ROWGUIDCOL nevynucuje jedinečnost hodnot uložených ve sloupci a negeneruje automaticky hodnoty pro nové řádky vložené do tabulky. K vygenerování jedinečných hodnot pro každý sloupec použijte funkci NEWID() nebo NEWSEQUENTIALID() v příkazech INSERT. Můžete také zadat funkci NEWID() nebo NEWSEQUENTIALID() jako výchozí pro sloupec.
[ {ADD | DROP} TRVALÉ ]
Určuje, že PERSISTED vlastnost je přidána nebo vyřazena ze zadaného sloupce. Sloupec musí být počítaný sloupec definovaný deterministickým výrazem. U sloupců zadaných jako PERSISTEDdatabázový stroj fyzicky ukládá vypočítané hodnoty v tabulce a aktualizuje hodnoty, pokud se aktualizují všechny další sloupce, na kterých závisí vypočítaný sloupec. Když označíte počítaný sloupec jako PERSISTED, můžete vytvořit indexy na počítaných sloupcích definovaných ve výrazech, které jsou deterministické, ale nejsou přesné. Další informace najdete v tématu Indexy ve vypočítaných sloupcích.
SET QUOTED_IDENTIFIER musí být ON , když vytváříte nebo měníte indexy ve vypočítaných sloupcích nebo indexovaných zobrazeních. Další informace naleznete v tématu SET QUOTED_IDENTIFIER.
Každý počítaný sloupec, který se používá jako sloupec dělení v dělené tabulce, musí být explicitně označen PERSISTED.
Note
Ve službě Fabric SQL Database jsou počítané sloupce povolené, ale v současné době nejsou zrcadlené na Fabric OneLake.
DROP NOT FOR REPLICATION
Platí pro: SQL Server a Azure SQL Database.
Určuje, že hodnoty se při provádění operací vložení agentů replikace zvýší ve sloupcích identit. Tuto klauzuli můžete zadat pouze v případě, že column_name je sloupec identity.
SPARSE
Označuje, že sloupec je řídký sloupec. Úložiště řídkých sloupců je optimalizované pro hodnoty null. Řídké sloupce nemůžete nastavit jako NOT NULL. Při převodu sloupce z řídké na nesparse nebo z nesparse na řídkou, tato možnost uzamkne tabulku po dobu trvání provádění příkazu. Možná budete muset klauzuli REBUILD použít k uvolnění jakýchkoli úspor místa. Další omezení a další informace o řídkých sloupcích najdete v tématu Použití řídkých sloupců.
PŘIDEJ MASKOVANÉ ( FUNKCE = 'mask_function')
Platí pro: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.
Určuje dynamickou masku dat. mask_function je název funkce maskování s příslušnými parametry. K dispozici jsou tři funkce:
- default()
- email()
- partial()
- random()
Vyžaduje ALTER ANY MASK oprávnění.
Pokud chcete masku odstranit, použijte DROP MASKED. Parametry funkce najdete v tématu Dynamické maskování dat.
Přidání a odstranění masky vyžaduje ALTER ANY MASK oprávnění.
WITH ( ONLINE = ON | OFF) <, jak platí pro změnu> sloupce
Platí pro: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.
Umožňuje provádět mnoho akcí alter column, zatímco tabulka zůstává k dispozici. Výchozí hodnota je OFF. U změn sloupce souvisejících s datovým typem, délkou nebo přesností, nulovostí, řídkými a kolací můžete spustit online změny sloupce.
Online alter column umožňuje uživatelům vytvořeným a automatickým statistikám odkazovat na změněný sloupec po dobu trvání ALTER COLUMN operace, což umožňuje, aby dotazy běžely obvyklým způsobem. Na konci operace se zahodí automatické statistiky, které odkazují na sloupec, a statistiky vytvořené uživatelem se zneplatní. Uživatel musí po dokončení operace ručně aktualizovat statistiky generované uživatelem. Pokud je sloupec součástí výrazu filtru pro jakékoli statistiky nebo indexy, nemůžete provést operaci změny sloupce.
Při spuštění operace online změny sloupce je zablokovaná jakákoli operace DDL, která by mohla záviset na daném sloupci (například vytváření nebo úpravách indexů, zobrazení atd.), nebo selže s příslušnou chybou. Toto chování zaručuje, že online alter column selžou kvůli závislostem zavedeným při spuštění operace.
Změna sloupce z
NOT NULLnaNULLnení podporována jako online operace, pokud se na změněný sloupec odkazuje neclusterované indexy.Online
ALTERse nepodporuje, pokud se na sloupec odkazuje omezením kontroly aALTERoperace omezuje přesnost sloupce (číselná hodnota nebo datum a čas).Možnost
WAIT_AT_LOW_PRIORITYnelze použít s online změnou sloupce.ALTER COLUMN ... ADD/DROP PERSISTEDse nepodporuje pro online změnu sloupce.ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATIONnení ovlivněný sloupcem online změn.Online alter column nepodporuje změnu tabulky, kde je povolené sledování změn nebo které je vydavatelem replikace sloučení.
Online alter column nepodporuje změny datových typů CLR nebo CLR.
Online alter column nepodporuje změnu datového typu XML, který má jinou kolekci schématu než aktuální kolekce schématu.
Online alter column nezmenšuje omezení, kdy je možné sloupec změnit. Odkazy podle indexů a statistik atd. můžou způsobit selhání změny.
Online alter column nepodporuje souběžné změny více než jednoho sloupce.
Sloupec online změn nemá žádný vliv na dočasnou tabulku s verzí systému.
ALTERsloupec se nespustí jako online bez ohledu na to, kterou hodnotu jste zadali proONLINEmožnost.
Online alter column má podobné požadavky, omezení a funkce jako online opětovné sestavení indexu, mezi které patří:
- Opětovné sestavení online indexu není podporováno, pokud tabulka obsahuje starší sloupce LOB nebo filestream nebo pokud tabulka obsahuje index columnstore. Stejná omezení platí pro online alter column.
- Upravený sloupec vyžaduje dvojnásobek přidělení místa pro původní sloupec a nově vytvořený skrytý sloupec.
- Strategie uzamčení během online operace alter column se řídí stejným vzorem uzamčení, který se používá pro sestavení online indexu.
WITH CHECK | S KONTROLOU NOCHECK
Určuje, jestli se data v tabulce neověřují proti nově přidanému nebo opětovnému povolení FOREIGN KEY nebo CHECK omezení. Pokud ho nezadáte, WITH CHECK předpokládá se pro nová omezení a WITH NOCHECK předpokládá se u znovu povolených omezení.
Pokud nechcete ověřovat nová CHECK nebo FOREIGN KEY omezení pro existující data, použijte WITH NOCHECK. Nedoporučujeme to dělat, s výjimkou výjimečných případů. Nové omezení se vyhodnotí ve všech pozdějších aktualizacích dat. Všechna porušení omezení potlačovaná WITH NOCHECK při přidání omezení můžou způsobit selhání budoucích aktualizací, pokud aktualizují řádky dat, která nedodržují omezení. Optimalizátor dotazů nebere v úvahu omezení, která jsou definována WITH NOCHECK. Tato omezení se ignorují, dokud nebudou povolena pomocí ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL. Další informace naleznete v tématu Zakázání omezení cizího klíče s příkazy INSERT a UPDATE.
ALTER INDEX index_name
Určuje, že se má změnit nebo změnit počet kbelíků pro index_name.
Syntaxe ALTER TABLE ... ADD/DROP/ALTER INDEX je podporována pouze pro tabulky optimalizované pro paměť.
Important
Bez použití ALTER TABLE příkazu nejsou příkazy CREATE INDEX, DROP INDEX, ALTER INDEX a PAD_INDEX podporovány pro indexy v tabulkách optimalizovaných pro paměť.
ADD
Určuje, že se přidají definice jednoho nebo více sloupců, definice počítaného sloupce nebo omezení tabulky. Nebo se přidají sloupce, které systém používá pro správu verzí systému. Pro tabulky optimalizované pro paměť můžete přidat index.
Note
Nové sloupce se přidají po změně všech existujících sloupců v tabulce.
Important
Bez použití ALTER TABLE příkazu nejsou příkazy CREATE INDEX, DROP INDEX, ALTER INDEX a PAD_INDEX podporovány pro indexy v tabulkách optimalizovaných pro paměť.
OBDOBÍ PRO SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )
Platí pro: SQL Server 2017 (14.x) a novější verze a Azure SQL Database.
Určuje názvy sloupců, které systém používá k zaznamenání časového období, pro které je záznam platný. Jako součást argumentu ADD PERIOD FOR SYSTEM_TIME můžete zadat existující sloupce nebo vytvořit nové sloupce. Nastavte sloupce s datovým typem datetime2 a definujte je jako NOT NULL. Pokud definujete sloupec tečky jako NULL, zobrazí se chybové výsledky. Můžete definovat column_constraint nebo Zadat výchozí hodnoty pro sloupce system_start_time a system_end_time. Podívejte se na příklad A v následujících system versioning příklady, které ukazují použití výchozí hodnoty pro sloupec system_end_time.
Tento argument s argumentem SET SYSTEM_VERSIONING použijte k vytvoření existující tabulky jako dočasné tabulky. Další informace naleznete v části Dočasné tabulky a Začínáme s dočasnými tabulkami.
Od SQL Serveru 2017 (14.x) můžou uživatelé označit jeden nebo oba sloupce období příznakem HIDDEN , aby tyto sloupce implicitně skrývaly tak, aby SELECT * FROM <table_name> nevracely hodnotu sloupců. Ve výchozím nastavení nejsou sloupce období skryté. Aby bylo možné je použít, musí být skryté sloupce explicitně zahrnuty do všech dotazů, které přímo odkazují na dočasnou tabulku.
DROP
Určuje, že dojde k vyřazení jedné nebo více definic sloupců, definic počítaného sloupce nebo omezení tabulky nebo k vyřazení specifikace sloupců, které systém používá pro správu verzí systému.
Note
Sloupce vynechané v tabulkách registru jsou odstraněny pouze obnovitelné odstranění. Vyřazený sloupec zůstane v tabulce registru, ale je označený jako vyřazený sloupec nastavením dropped_ledger_table sloupce na sys.tables1hodnotu . Zobrazení registru zahozené tabulky registru je také označeno jako vyřazené nastavením sloupce dropped_ledger_view v sys.tables na 1. Vyřazená tabulka registru, její tabulka historie a její zobrazení registru se přejmenují přidáním předpony (MSSQL_DroppedLedgerTable, MSSQL_DroppedLedgerHistory, MSSQL_DroppedLedgerView) a připojením identifikátoru GUID k původnímu názvu.
CONSTRAINT_NAME CONSTRAINT
Určuje, že constraint_name se z tabulky odebere. Můžete uvést několik omezení.
Uživatelem definovaný nebo systémový název omezení můžete určit dotazováním zobrazení katalogu sys.check_constraint, sys.default_constraints, sys.key_constraintsa sys.foreign_keys katalogu.
PRIMARY KEY Omezení nelze vynechat, pokud v tabulce existuje index XML.
INDEX index_name
Určuje, že index_name se z tabulky odeberou.
Syntaxe ALTER TABLE ... ADD/DROP/ALTER INDEX je podporována pouze pro tabulky optimalizované pro paměť.
Important
Bez použití ALTER TABLE příkazu nejsou příkazy CREATE INDEX, DROP INDEX, ALTER INDEX a PAD_INDEX podporovány pro indexy v tabulkách optimalizovaných pro paměť.
COLUMN_NAME SLOUPCE
Určuje, že constraint_name nebo column_name se z tabulky odeberou. Můžete uvést více sloupců.
Sloupec nejde vyhodit, když je:
- Používá se v indexu, ať už jako klíčový sloupec, nebo jako
INCLUDE - Používá se v sadě
CHECK,FOREIGN KEY,UNIQUEneboPRIMARY KEYomezení. - Přidruženo k výchozímu nastavení definovanému klíčovým slovem
DEFAULTnebo vázanému na výchozí objekt. - Svázané s pravidlem
Note
Vyřazení sloupce neodebere místo na disku sloupce. Pokud se velikost řádku tabulky blíží nebo překročila, bude pravděpodobně nutné uvolnit místo na disku vyřazeného sloupce. Uvolněte místo vytvořením clusterovaného indexu v tabulce nebo opětovným sestavením existujícího clusterovaného indexu pomocí ALTER INDEX. Informace o dopadu vyřazení datových typů LOB naleznete v tomto blogový záznam CSS.
OBDOBÍ PRO SYSTEM_TIME
Platí pro: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.
Zahodí specifikaci sloupců, které systém používá pro správu verzí systému.
S <drop_clustered_constraint_option>
Určuje, že jsou nastaveny jednu nebo více možností omezení s vyřazeným clusterem.
MAXDOP = max_degree_of_parallelism
Platí pro: SQL Server a Azure SQL Database.
Přepíše maximální stupeň paralelismu možnost konfigurace pouze po dobu trvání operace. Další informace naleznete v tématu Konfigurace serveru: maximální stupeň paralelismu.
MAXDOP Pomocí možnosti omezte počet procesorů používaných při paralelním provádění plánu. Maximum je 64 procesorů.
max_degree_of_parallelism může být jedna z následujících hodnot:
1Potlačí generování paralelního plánu.
>1Omezí maximální počet procesorů použitých v paralelní operaci indexu na zadané číslo.
0(výchozí)Používá skutečný počet procesorů nebo méně na základě aktuální systémové úlohy.
Další informace najdete v tématu Konfigurace operací paralelního indexu.
Note
Paralelní operace indexu nejsou k dispozici v každé edici SQL Serveru. Další informace naleznete v tématu Edice a podporované funkce SQL Server 2022.
ONLINE = { ON | OFF } <, jak se vztahuje na drop_clustered_constraint_option>
Určuje, jestli jsou podkladové tabulky a přidružené indexy dostupné pro dotazy a úpravy dat během operace indexu. Výchozí hodnota je OFF. Můžete spustit REBUILD jako ONLINE operaci.
ON
Dlouhodobé zámky tabulek se neudržují po dobu trvání operace indexu. Během hlavní fáze operace indexu se ve zdrojové tabulce uchovává pouze zámek Sdílení záměru (
IS). Toto chování umožňuje pokračovat v dotazech nebo aktualizacích podkladové tabulky a indexů. Na začátku operace se na zdrojovém objektu po krátkou dobu uchovává zámek Shared (S). Na konci operace se po krátkou dobu získá zámek S (Shared), pokud se vytváří neclusterovaný index. Nebo se zámek Sch-M (úprava schématu) získá při vytvoření nebo vyřazení clusterovaného indexu online a při vytvoření clusterovaného nebo neclusterovaného indexu.ONLINENelze nastavit, kdyžONse index vytváří v místní dočasné tabulce. Je povolena pouze operace opětovného sestavení haldy s jedním vláknem.Chcete-li spustit DDL pro
SWITCHopětovné sestavení indexu nebo online index, musí být dokončeny všechny aktivní blokující transakce spuštěné v konkrétní tabulce. Při provádění operace opětovnéhoSWITCHsestavení zabrání spuštění nových transakcí a může výrazně ovlivnit propustnost úloh a dočasně zpozdit přístup k podkladové tabulce.OFF
Zámky tabulek platí pro dobu trvání operace indexu. Operace offline indexu, která vytvoří, znovu sestaví nebo zahodí clusterovaný index nebo znovu sestaví nebo zamkne neclusterovaný index, získá v tabulce zámek schématu (Sch-M). Tento zámek brání všem uživatelům v přístupu k podkladové tabulce po dobu trvání operace. Operace offline indexu, která vytvoří neclusterovaný index, získá v tabulce zámek Shared (S). Tento zámek zabraňuje aktualizacím podkladové tabulky, ale umožňuje operace čtení, jako
SELECTjsou příkazy. Operace opětovného sestavení haldy s více vlákny jsou povolené.Další informace naleznete v tématu Jak fungují online operace indexu.
Note
Online indexovací operace nejsou dostupné v každé edici SQL Serveru. Další informace naleznete v tématu Edice a podporované funkce SQL Server 2022.
PŘESUNOUT NA { partition_scheme_name(column_name [ ,...n ] ) | skupiny souborů | "default" }
Platí pro: SQL Server a Azure SQL Database.
Určuje umístění pro přesunutí datových řádků aktuálně na úrovni listu clusterovaného indexu. Tabulka se přesune do nového umístění. Tato možnost se vztahuje pouze na omezení, která vytvářejí clusterovaný index.
Note
V tomto kontextu default není klíčové slovo. Jedná se o identifikátor výchozí skupiny souborů, který musí být oddělený jako in MOVE TO "default" nebo MOVE TO [default]. Pokud "default" je tato možnost zadaná, QUOTED_IDENTIFIER musí být ON pro aktuální relaci. Toto je výchozí nastavení. Další informace naleznete v tématu SET QUOTED_IDENTIFIER.
{ CHECK | NOCHECK } OMEZENÍ
Určuje, že constraint_name je povolená nebo zakázaná. Tuto možnost lze použít pouze s omezeními FOREIGN KEYCHECK . Po NOCHECK zadání se omezení zakáže a budoucí vložení nebo aktualizace sloupce nebudou ověřeny proti podmínkám omezení.
DEFAULT, PRIMARY KEYa UNIQUE omezení nelze zakázat.
ALL
Určuje, že všechna omezení jsou zakázána s
NOCHECKmožností nebo povolenouCHECKmožností.
{ ENABLE | ZAKÁZAT } TRIGGER
Určuje, že trigger_name je povolená nebo zakázaná. Když je trigger zakázaný, je stále definovaný pro tabulku. Pokud INSERTse však příkazy UPDATEnebo DELETE příkazy spustí v tabulce, akce v triggeru se neprovedou, dokud se aktivační událost znovu nepovolí.
ALL
Určuje, že všechny triggery v tabulce jsou povolené nebo zakázané.
trigger_name
Určuje název triggeru, který se má zakázat nebo povolit.
{ ENABLE | VYPNOUT } CHANGE_TRACKING
Platí pro: SQL Server a Azure SQL Database.
Určuje, jestli je pro tabulku povoleno sledování změn. Ve výchozím nastavení je sledování změn zakázané.
Tato možnost je dostupná jenom v případě, že je pro databázi povolené sledování změn. Další informace naleznete v tématu ALTER DATABASE SET možnosti.
Pokud chcete povolit sledování změn, musí mít tabulka primární klíč.
S ( TRACK_COLUMNS_UPDATED = { ON | VYPNUTO } )
Platí pro: SQL Server a Azure SQL Database.
Určuje, zda byly aktualizovány stopy databázového stroje, které změnily sledované sloupce. Výchozí hodnota je OFF.
PŘEPNOUT [ PARTITION source_partition_number_expression ] NA [ schema_name. ] target_table [ ODDÍL target_partition_number_expression ]
Platí pro: SQL Server a Azure SQL Database.
Přepne blok dat jedním z následujících způsobů:
- Znovu přiřazuje všechna data tabulky jako oddíl k již existující dělené tabulce.
- Přepne oddíl z jedné dělené tabulky do jiné.
- Znovu přiřazuje všechna data v jednom oddílu dělené tabulky k existující nedělené tabulce.
Pokud tabulka je dělená tabulka, je nutné zadat source_partition_number_expression. Pokud je target_table rozdělený na oddíly, je nutné zadat target_partition_number_expression. Při opětovném přiřazení dat tabulky jako oddílu k již existující dělené tabulce nebo přepnutí oddílu z jedné dělené tabulky na jinou musí cílový oddíl existovat a musí být prázdný.
Při opětovném přiřazení dat jednoho oddílu pro vytvoření jedné tabulky musí cílová tabulka již existovat a musí být prázdná. Zdrojová tabulka nebo oddíl i cílová tabulka nebo oddíl musí být umístěné ve stejné skupině souborů. Odpovídající indexy nebo oddíly indexu musí být také umístěny ve stejné skupině souborů. Pro přepínání oddílů platí mnoho dalších omezení. tabulky a target_table nemůžou být stejné. target_table může být identifikátor s více částmi.
source_partition_number_expression i target_partition_number_expression jsou konstantní výrazy, které mohou odkazovat na proměnné a funkce. Patří mezi ně proměnné typu definované uživatelem a uživatelem definované funkce. Nemůžou odkazovat na výrazy Transact-SQL.
Dělená tabulka s clusterovaným indexem columnstore se chová jako dělená halda:
- Primární klíč musí obsahovat klíč oddílu.
- Jedinečný index musí obsahovat klíč oddílu. Zahrnutí klíče oddílu s existujícím jedinečným indexem ale může změnit jedinečnost.
- Pokud chcete přepnout oddíly, musí všechny neclusterované indexy obsahovat klíč oddílu.
Omezení SWITCH při použití replikace najdete v tématu Replikace dělených tabulek a indexů.
Neclusterované indexy columnstore byly vytvořeny ve formátu jen pro čtení před SQL Serverem 2016 (13.x) a pro SQL Database před verzí V12. Před spuštěním jakékoli PARTITION operace je nutné znovu sestavit neclusterované indexy columnstore do aktuálního formátu (který je aktualizovatelný).
Limitations
Pokud jsou obě tabulky rozdělené stejně, včetně neclusterovaných indexů a cílová tabulka neobsahuje žádné neclusterované indexy, může se zobrazit chyba 4907.
Příklad výstupu:
Msg 4907, Level 16, State 1, Line 38
'ALTER TABLE SWITCH' statement failed. The table 'MyDB.dbo.PrtTable1' has 4 partitions while index 'MS1' has 6 partitions.
SET ( FILESTREAM_ON = { partition_scheme_name filestream_filegroup_name | | "default" | "NULL" })
Platí pro: SQL Server. Azure SQL Database nepodporuje FILESTREAM.
Určuje, kde jsou uložena data FILESTREAM.
ALTER TABLE klauzule SET FILESTREAM_ON bude úspěšná pouze v případě, že tabulka neobsahuje žádné sloupce FILESTREAM. Sloupce FILESTREAM můžete přidat pomocí druhého ALTER TABLE příkazu.
Pokud zadáte partition_scheme_name, použijí se pravidla pro CREATE TABLE. Ujistěte se, že tabulka je již rozdělena pro data řádků a schéma oddílů používá stejnou funkci oddílu a sloupce jako schéma oddílů FILESTREAM.
filestream_filegroup_name určuje název skupiny souborů FILESTREAM. Skupina souborů musí mít jeden soubor definovaný pro skupinu souborů pomocí příkazu CREATE DATABASE nebo ALTER DATABASE nebo dojde k chybě.
"default" určuje filegroup FILESTREAM se DEFAULT sadou vlastností. Pokud neexistuje žádná skupina souborů FILESTREAM, zobrazí se chyba.
"NULL" určuje, že všechny odkazy na filegroups filegroups pro tabulku jsou odebrány. Nejprve je nutné vynechat všechny sloupce FILESTREAM. Slouží SET FILESTREAM_ON = "NULL" k odstranění všech dat FILESTREAM přidružených k tabulce.
SET ( SYSTEM_VERSIONING = { VYPNUTO | ON [ ( HISTORY_TABLE = schema_name . history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | VYPNUTO } ] ) ) } )
Platí pro: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.
Buď zakáže nebo povolí správu systémových verzí tabulky. Aby bylo možné povolit systémovou správu verzí tabulky, systém ověří, že jsou splněny požadavky na datové typy, omezení nullability a omezení primárního klíče pro správu verzí systému. Systém zaznamenává historii každého záznamu v tabulce se systémovou verzí v samostatné tabulce historie.
HISTORY_TABLE Pokud se argument nepoužívá, název této tabulky historie je MSSQL_TemporalHistoryFor<primary_table_object_id>. Pokud tabulka historie neexistuje, systém vygeneruje novou tabulku historie odpovídající schématu aktuální tabulky, vytvoří propojení mezi těmito dvěma tabulkami a umožní systému zaznamenávat historii každého záznamu v aktuální tabulce v tabulce historie. Pokud použijete argument HISTORY_TABLE k vytvoření propojení a použití existující tabulky historie, systém vytvoří propojení mezi aktuální tabulkou a zadanou tabulkou. Při vytváření odkazu na existující tabulku historie můžete provést kontrolu konzistence dat. Tato kontrola konzistence dat zajišťuje, že se existující záznamy nepřekrývají. Spuštění kontroly konzistence dat je výchozí. Pomocí argumentu SYSTEM_VERSIONING = ON v tabulce definované pomocí klauzule PERIOD FOR SYSTEM_TIME vytvořte existující tabulku jako dočasnou tabulku. Další informace naleznete v části Dočasné tabulky.
HISTORY_RETENTION_PERIOD = { INFINITE | číslo { DEN | DNY | TÝDEN | TÝDNY | MĚSÍC | MĚSÍCE | ROK | YEARS } }
platí pro: SQL Server 2017 (14.x) a Azure SQL Database.
Určuje konečné nebo nekonečné uchovávání historických dat v dočasné tabulce. Pokud je vynecháno, předpokládá se nekonečné uchovávání.
DATA_DELETION
platí pro: Azure SQL Edge pouze
Umožňuje vyčištění starých nebo starých dat z tabulek v databázi na základě zásad uchovávání informací. Další informace najdete v tématu Povolení a zakázáníuchovávání dat . Aby bylo možné povolit uchovávání dat, musí být zadány následující parametry.
FILTER_COLUMN = { column_name }
Určuje sloupec, který se má použít k určení, jestli jsou řádky v tabulce zastaralé nebo ne. Pro sloupec filtru jsou povoleny následující datové typy.
- date
- datetime
- datetime2
- smalldatetime
- datetimeoffset
RETENTION_PERIOD = { INFINITE | číslo { DEN | DNY | TÝDEN | TÝDNY | MĚSÍC | MĚSÍCE | ROK | YEARS } }
Určuje zásady doby uchovávání informací pro tabulku. Doba uchovávání je určena jako kombinace kladné celočíselné hodnoty a jednotky části kalendářního data.
SET ( LOCK_ESCALATION = { AUTO | TABULKA | DISABLE } )
Platí pro: SQL Server a Azure SQL Database.
Určuje povolené metody eskalace zámku pro tabulku.
AUTO
Tato možnost umožňuje databázovému stroji SQL Serveru vybrat členitost eskalace zámku, která je vhodná pro schéma tabulky.
Pokud je tabulka rozdělená na oddíly, je eskalace zámku povolena na členitost haldy nebo B-tree (HoBT). Jinými slovy, eskalace je povolená na úrovni oddílu. Po eskalaci zámku na úroveň HoBT nebude zámek eskalován později na
TABLEčlenitost.Pokud tabulka není rozdělená na oddíly, eskalace zámku se provede s
TABLEčlenitostí.
TABLE
Eskalace zámku se provádí v členitosti na úrovni tabulky bez ohledu na to, jestli je tabulka rozdělená na oddíly, nebo ne.
TABLEje výchozí hodnota.DISABLE
Ve většině případů zabraňuje eskalaci zámku. Zámky na úrovni tabulky nejsou zcela zakázány. Když například prohledáváte tabulku, která nemá žádný clusterovaný index pod úrovní serializovatelné izolace, databázový stroj musí kvůli ochraně integrity dat vzít zámek tabulky.
REBUILD
REBUILD WITH Syntaxe slouží k opětovnému sestavení celé tabulky včetně všech oddílů v dělené tabulce. Pokud tabulka obsahuje clusterovaný index, REBUILD možnost znovu sestaví clusterovaný index.
REBUILD lze spustit jako ONLINE operaci.
REBUILD PARTITION Syntaxe slouží k opětovnému sestavení jednoho oddílu v dělené tabulce.
PARTITION = VŠE
Platí pro: SQL Server a Azure SQL Database.
Při změně nastavení komprese oddílů znovu sestaví všechny oddíly.
PŘESTAVBA S ( <rebuild_option> )
Všechny možnosti platí pro tabulku s clusterovaným indexem. Pokud tabulka nemá clusterovaný index, struktura haldy je ovlivněna pouze některými možnostmi.
Pokud se při operaci nezadá REBUILD konkrétní nastavení komprese, použije se aktuální nastavení komprese pro oddíl. Pokud chcete vrátit aktuální nastavení, zadejte dotaz na sloupec data_compression v zobrazení katalogu sys.partitions.
Úplný popis možností opětovného sestavení najdete v tématu ALTER TABLE index_option.
DATA_COMPRESSION
Platí pro: SQL Server a Azure SQL Database.
Určuje možnost komprese dat pro zadanou tabulku, číslo oddílu nebo rozsah oddílů. Možnosti jsou následující:
NONE
Tabulky nebo zadané oddíly nejsou komprimované. Tato možnost se nevztahuje na tabulky columnstore.
VESLOVAT
Tabulky nebo zadané oddíly se komprimují pomocí komprese řádků. Tato možnost se nevztahuje na tabulky columnstore.
STRÁNKA
Tabulky nebo zadané oddíly se komprimují pomocí komprese stránky. Tato možnost se nevztahuje na tabulky columnstore.
COLUMNSTORE
Platí pro: SQL Server 2014 (12.x) a novější verze a Azure SQL Database.
Platí pouze pro tabulky columnstore.
COLUMNSTOREurčuje dekomprimaci oddílu, který byl komprimován sCOLUMNSTORE_ARCHIVEmožností. Po obnovení se data budou dál komprimovat pomocí komprese columnstore, která se používá pro všechny tabulky columnstore.COLUMNSTORE_ARCHIVE
Platí pro: SQL Server 2014 (12.x) a novější verze a Azure SQL Database.
Platí pouze pro tabulky columnstore, které jsou tabulky uložené s clusterovaným indexem columnstore.
COLUMNSTORE_ARCHIVEdále zkomprimuje zadaný oddíl na menší velikost. Tuto možnost použijte pro archivaci nebo jiné situace, které vyžadují méně úložiště a mohou si dovolit více času pro ukládání a načítání.Pokud chcete znovu sestavit více oddílů najednou, přečtěte si index_option. Pokud tabulka nemá clusterovaný index, změna komprese dat znovu sestaví haldu a neclusterované indexy. Další informace o kompresi naleznete v tématu Komprese dat.
ALTER TABLE REBUILD PARTITION WITH DATA COMPRESSION = ROWPAGEnebo není povoleno v SQL databázi v Microsoft Fabric.
XML_COMPRESSION
platí pro: SQL Server 2022 (16.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance.
Určuje možnost komprese XML pro všechny xml sloupce datového typu v tabulce. Možnosti jsou následující:
ON
Sloupce používající datový typ xml jsou komprimované.
OFF
Sloupce používající xml datový typ nejsou komprimované.
ONLINE = { ON | OFF } <, jak platí pro single_partition_rebuild_option>
Určuje, jestli je během operace indexu k dispozici jeden oddíl podkladových tabulek a přidružených indexů pro dotazy a úpravy dat. Výchozí hodnota je OFF. Můžete spustit REBUILD jako ONLINE operaci.
ON
Dlouhodobé zámky tabulek se neudržují po dobu trvání operace indexu. Na začátku opětovného sestavení indexu se vyžaduje zámek S-Lock v tabulce a Sch-M uzamčení tabulky na konci opětovného sestavení indexu online. I když oba zámky jsou krátké zámky metadat, Sch-M zámek musí čekat na dokončení všech blokujících transakcí. Během doby čekání Sch-M zámek blokuje všechny ostatní transakce, které čekají za tímto zámkem při přístupu ke stejné tabulce.
Note
Opětovné sestavení online indexu může nastavit
low_priority_lock_waitmožnosti popsané dále v této části.OFF
Zámky tabulek se použijí po dobu trvání operace indexu. Tím zabráníte všem uživatelům přístup k podkladové tabulce po dobu trvání operace.
column_set_name COLUMN_SET XML PRO ALL_SPARSE_COLUMNS
Platí pro: SQL Server a Azure SQL Database.
Název sady sloupců. Sada sloupců je netypová reprezentace XML, která kombinuje všechny řídké sloupce tabulky do strukturovaného výstupu. Sadu sloupců nelze přidat do tabulky, která obsahuje řídké sloupce. Další informace o sadách sloupců najdete v tématu Použití sad sloupců.
{ ENABLE | VYPNOUT } FILETABLE_NAMESPACE
Platí pro: SQL Server.
Povolí nebo zakáže systémově definovaná omezení pro FileTable. Lze použít pouze se Souborovou tabulkou.
SET ( FILETABLE_DIRECTORY = directory_name )
Platí pro: SQL Server. Azure SQL Database nepodporuje FileTable.
Určuje název adresáře FileTable kompatibilní s Windows. Tento název by měl být jedinečný mezi všemi názvy adresářů FileTable v databázi. Porovnání jedinečnosti nerozlišuje malá a velká písmena bez ohledu na nastavení kolace SQL. Lze použít pouze se Souborovou tabulkou.
REMOTE_DATA_ARCHIVE
Platí pro: SQL Server 2017 (14.x) a novější verze.
Povolí nebo zakáže funkci Stretch Database pro tabulku. Další informace naleznete v tématu Stretch Database.
Important
Funkce Stretch Database je v SQL Serveru 2022 (16.x) a Azure SQL Database zastaralá. Tato funkce bude odebrána v budoucí verzi databázového stroje. Nepoužívejte tuto funkci v nové vývojové práci a naplánujte úpravu aplikací, které tuto funkci aktuálně používají.
Povolení funkce Stretch Database pro tabulku
Když funkci Stretch pro tabulku povolíte zadáním ON, musíte také určit, MIGRATION_STATE = OUTBOUND začít migrovat data okamžitě, nebo MIGRATION_STATE = PAUSED odložení migrace dat. Výchozí hodnota je MIGRATION_STATE = OUTBOUND. Další informace o povolení funkce Stretch pro tabulku naleznete v tématu Enable Stretch Database pro tabulku.
Prerequisites. Před povolením funkce Stretch pro tabulku musíte povolit funkci Stretch na serveru a v databázi. Další informace najdete v tématu Povolení funkce Stretch Database pro databázi.
Permissions. Povolení funkce Stretch pro databázi nebo tabulku vyžaduje db_owner oprávnění. Povolení funkce Stretch pro tabulku také vyžaduje ALTER oprávnění k tabulce.
Zakázání funkce Stretch Database pro tabulku
Když funkci Stretch pro tabulku zakážete, máte dvě možnosti pro vzdálená data, která už byla migrována do Azure. Další informace najdete v tématu Zakázání funkce Stretch Database a vrácení vzdálených dat.
Pokud chcete funkci Stretch pro tabulku zakázat a zkopírovat vzdálená data tabulky z Azure zpět na SQL Server, spusťte následující příkaz. Tento příkaz nejde zrušit.
ALTER TABLE <table_name> SET ( REMOTE_DATA_ARCHIVE ( MIGRATION_STATE = INBOUND ) ) ;
Tato operace nese náklady na přenos dat a nedá se zrušit. Další informace najdete v tématu Podrobnosti o cenách přenosů dat.
Po zkopírování všech vzdálených dat z Azure zpět do SQL Serveru je funkce Stretch pro tabulku zakázaná.
Pokud chcete funkci Stretch pro tabulku zakázat a vzdálená data opustit, spusťte následující příkaz.
ALTER TABLE <table_name> SET ( REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY ( MIGRATION_STATE = PAUSED ) ) ;
Po zakázání funkce Stretch Database pro tabulku se migrace dat zastaví a výsledky dotazu už nebudou obsahovat výsledky ze vzdálené tabulky.
Zakázání funkce Stretch neodebere vzdálenou tabulku. Pokud chcete vzdálenou tabulku odstranit, můžete ji odstranit pomocí webu Azure Portal.
[ FILTER_PREDICATE = { null | predikát } ]
Platí pro: SQL Server 2017 (14.x) a novější verze.
Volitelně určuje predikát filtru pro výběr řádků, které se mají migrovat z tabulky, která obsahuje historická i aktuální data. Predikát musí volat deterministické vložené funkce s hodnotou tabulky. Další informace najdete v tématu Povolení funkce Stretch Database pro tabulku a Výběr řádků, které chcete migrovat pomocí funkce filtru – Stretch Database.
Important
Pokud zadáte predikát filtru, který se provádí špatně, migrace dat také funguje špatně. Funkce Stretch Database použije predikát filtru na tabulku pomocí operátoru CROSS APPLY .
Pokud nezadáte predikát filtru, celá tabulka se migruje.
Když zadáte predikát filtru, musíte také zadat MIGRATION_STATE.
MIGRATION_STATE = { ODCHOZÍ | PŘÍCHOZÍ | POZASTAVENO }
Platí pro: SQL Server 2017 (14.x) a novější verze.
Zadejte
OUTBOUNDpro migraci dat z SQL Serveru do Azure.Zadejte
INBOUNDpro zkopírování vzdálených dat tabulky z Azure zpět do SQL Serveru a zakázání funkce Stretch pro tabulku. Další informace najdete v tématu Zakázání funkce Stretch Database a vrácení vzdálených dat.Tato operace nese náklady na přenos dat a nedá se zrušit.
Zadejte
PAUSEDk pozastavení nebo odložení migrace dat. Další informace naleznete v tématu Pozastavení a obnovení migrace dat – Stretch Database.
WAIT_AT_LOW_PRIORITY
Platí pro: SQL Server 2014 (12.x) a novější verze a Azure SQL Database.
Opětovné sestavení online indexu musí čekat na blokující operace v této tabulce.
WAIT_AT_LOW_PRIORITY označuje, že operace opětovného sestavení online indexu čeká na zámky s nízkou prioritou, což umožňuje jiným operacím pokračovat, zatímco operace sestavení online indexu čeká. Vynechání WAIT AT LOW PRIORITY možnosti je stejné jako WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).
MAX_DURATION = čas [ MINUTY ]
Platí pro: SQL Server 2014 (12.x) a novější verze a Azure SQL Database.
Doba čekání, což je celočíselná hodnota zadaná v minutách, že SWITCH opětovné sestavení indexu nebo online indexu čeká při spuštění příkazu DDL s nízkou prioritou. Pokud je operace zablokovaná po MAX_DURATION tuto dobu, spustí se jedna z ABORT_AFTER_WAIT akcí.
MAX_DURATION čas je vždy v minutách a můžete vynechat slovo MINUTES.
ABORT_AFTER_WAIT = { NONE | SELF | BLOKÁTORY }
Platí pro: SQL Server 2014 (12.x) a novější verze a Azure SQL Database.
NONE
Pokračujte v čekání na zámek s normální (pravidelnou) prioritou.
SELF
Ukončete operaci opětovného
SWITCHsestavení DDL nebo online indexu, která se právě spouští, aniž byste museli provádět žádnou akci.BLOCKERS
Ukončete všechny uživatelské transakce, které aktuálně blokují operaci DDL opětovného sestavení indexu
SWITCHnebo online indexu, aby operace nemohla pokračovat.Vyžaduje
ALTER ANY CONNECTIONoprávnění.
POKUD EXISTUJE
Platí pro: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.
Podmíněně zahodí sloupec nebo omezení jenom v případě, že už existuje.
RESUMABLE = { ON | VYPNUTO}
Platí pro: SQL Server 2022 (16.x) a novější verze.
Určuje, zda je operace ALTER TABLE ADD CONSTRAINT obnovitelná. Operace přidání omezení tabulky se dá obnovit, když ON. Operace přidání omezení tabulky není při OFFobnovitelná. Výchozí hodnota je OFF. Možnost RESUMABLE lze použít jako součást ALTER TABLE index_option v ALTER TABLE table_constraint.
MAX_DURATION při použití s RESUMABLE = ON (vyžaduje ONLINE = ON) označuje čas (celočíselná hodnota zadaná v minutách), že se před pozastavením provede operace obnovení online přidání omezení. Pokud není zadáno, operace pokračuje až do dokončení.
Další informace o povolení a používání resumable ALTER TABLE ADD CONSTRAINT operací naleznete v tématu Obnovitelné přidání omezení tabulky.
Remarks
Chcete-li přidat nové řádky dat, použijte INSERT. Chcete-li odebrat řádky dat, použijte DELETE nebo TRUNCATE TABLE. Pokud chcete změnit hodnoty v existujících řádcích, použijte
Pokud jsou v mezipaměti procedur nějaké plány provádění, které odkazují na tabulku, ALTER TABLE označí je, aby se znovu zkompilovaly při dalším spuštění.
V SQL databázi v Microsoft Fabric lze některé tabulkové funkce vytvářet, ale nejsou zrcadleny do Fabric OneLake. Pro více informací viz Omezení pro zrcadlení databází Fabric SQL.
Změna velikosti sloupce
Délku, přesnost nebo měřítko sloupce můžete změnit zadáním nové velikosti datového typu sloupce. Použijte klauzuli ALTER COLUMN . Pokud data ve sloupci existují, nová velikost nemůže být menší než maximální velikost dat. Kromě toho nelze definovat sloupec v indexu, pokud není sloupec varchar, nvarchar nebo varbinary a index není výsledkem PRIMARY KEY omezení. Podívejte se na příklad v krátké části s názvem Altering a Column Definition.
Zámky a ALTER TABLE
Změny, které zadáte v ALTER TABLE implementaci okamžitě. Pokud změny vyžadují úpravy řádků v tabulce, ALTER TABLE aktualizujte řádky.
ALTER TABLE získá zámek schématu (Sch-M) v tabulce, aby se zajistilo, že žádná další připojení nebudou během změny odkazovat na metadata tabulky, s výjimkou operací online indexu, které vyžadují krátký zámek Sch-M na konci. V ALTER TABLE...SWITCH operaci se zámek získá ve zdrojové i cílové tabulce. Změny provedené v tabulce jsou protokolovány a plně obnovitelné. Změny, které mají vliv na všechny řádky ve velkých tabulkách, například vyřazení sloupce nebo v některých edicích SQL Serveru, přidání NOT NULL sloupce s výchozí hodnotou, může trvat dlouhou dobu, než se dokončí a vygeneruje mnoho záznamů protokolu. Spusťte tyto ALTER TABLE příkazy se stejnou opatrností jako jakýkoli INSERTpříkaz nebo UPDATEpříkaz, DELETE který ovlivňuje mnoho řádků.
platí pro Warehouse v Microsoft Fabric.
ALTER TABLE nemůže být součástí explicitní transakce.
Rozšířené události (XEvents) pro přepínač oddílů
Následující události XEvent se vztahují k ALTER TABLE ... SWITCH PARTITION a online index znovu sestaví.
- lock_request_priority_state
- process_killed_by_abort_blockers
- ddl_with_wait_at_low_priority
Přidání sloupců NOT NULL jako online operace
V edici Enterprise a novějších verzích SQL Serveru 2012 (11.x) je přidání NOT NULL sloupce s výchozí hodnotou online operace, pokud je výchozí hodnota konstanta modulu runtime. To znamená, že operace je dokončena téměř okamžitě i přes počet řádků v tabulce, protože stávající řádky v tabulce se během operace neaktualizují. Místo toho je výchozí hodnota uložená pouze v metadatech tabulky a podle potřeby se tato hodnota vyhledá v dotazech, které přistupují k těmto řádkům. Toto chování je automatické. K implementaci online operace nad ADD COLUMN rámec syntaxe není nutná žádná další syntaxe. Konstanta modulu runtime je výraz, který vytváří stejnou hodnotu za běhu pro každý řádek v tabulce bez ohledu na jeho determinismus. Například konstantní výraz "My temporary data"nebo systémová funkce GETUTCDATETIME() jsou konstanty modulu runtime. Naproti tomu funkce NEWID() nebo NEWSEQUENTIALID() nejsou konstanty modulu runtime, protože pro každý řádek v tabulce se vytvoří jedinečná hodnota.
NOT NULL Přidání sloupce s výchozí hodnotou, která není konstantou modulu runtime, se vždy spouští offline a po dobu trvání operace se získá výhradní zámek (Sch-M).
Zatímco existující řádky odkazují na hodnotu uloženou v metadatech, výchozí hodnota je uložena na řádku pro všechny nové řádky, které jsou vloženy, a nezadávají jinou hodnotu sloupce. Výchozí hodnota uložená v metadatech se při aktualizaci řádku přesune na existující řádek (i když v příkazu není zadaný UPDATE skutečný sloupec), nebo pokud se znovu sestaví tabulka nebo clusterovaný index.
Sloupce typu varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography nebo CLR uživatelem definované typy nejde přidat do online operace. Sloupec nejde přidat online, pokud tak učiníte, způsobí, že maximální možná velikost řádku překročí limit 8 060 bajtů. Sloupec se v tomto případě přidá jako offline operace.
Paralelní spuštění plánu
V edici ENTERPRISE a novějších verzích SQL Serveru 2012 (11.x) je počet procesorů používaných ke spuštění jednoho ALTER TABLE ADD (indexovaného) CONSTRAINT nebo DROP (clusterovaného indexu) CONSTRAINT určen maximálním stupněm konfigurace paralelismu a aktuální úlohou. Pokud databázový stroj zjistí, že systém je zaneprázdněn, stupeň paralelismu operace se automaticky sníží před spuštěním příkazu. Zadáním možnosti můžete ručně nakonfigurovat počet procesorů, které se používají ke spuštění příkazu MAXDOP . Další informace naleznete v tématu Konfigurace serveru: maximální stupeň paralelismu.
Dělené tabulky
Kromě provádění operací SWITCH, které zahrnují dělené tabulky, použijte ALTER TABLE ke změně stavu sloupců, omezení a triggerů dělené tabulky stejně jako u tabulek, které nejsou rozdělené. Tento příkaz se ale nedá použít ke změně způsobu dělení samotné tabulky. Pokud chcete předělit dělenou tabulku, použijte ALTER PARTITION SCHEME a ALTER PARTITION FUNCTION. Kromě toho nemůžete změnit datový typ sloupce dělené tabulky.
Omezení tabulek s zobrazeními vázaných schématem
Omezení, která platí pro ALTER TABLE příkazy u tabulek se zobrazeními vázanými na schéma, jsou stejná jako omezení, která se aktuálně používají při úpravách tabulek pomocí jednoduchého indexu. Přidání sloupce je povolené. Odebrání nebo změna sloupce, který se účastní jakéhokoli zobrazení vázaného na schéma, ale není povolené. Pokud příkaz ALTER TABLE vyžaduje změnu sloupce použitého v zobrazení vázaném na schéma, ALTER TABLE selže a databázový stroj vyvolá chybovou zprávu. Další informace o vazbě schématu a indexovaných zobrazeních naleznete v tématu CREATE VIEW.
Přidání nebo odebrání aktivačních událostí u základních tabulek není ovlivněno vytvořením zobrazení vázaného na schéma, které odkazuje na tabulky.
Indexy a ALTER TABLE
Indexy vytvořené jako součást omezení se při vyřazení omezení zahodí. Indexy, které byly vytvořeny pomocí CREATE INDEX , musí být vyřazeny s DROP INDEX. Pomocí příkazu Příkaz ALTER INDEX znovu sestavíte indexovou část definice omezení. Omezení nemusí být zahozeno a znovu přidáno s ALTER TABLE.
Před odebráním sloupce je nutné odebrat všechny indexy a omezení na základě sloupce.
Když odstraníte omezení, které vytvořilo clusterovaný index, budou řádky dat uložené na úrovni listu clusterovaného indexu uloženy v neclusterované tabulce. Můžete odstranit clusterovaný index a přesunout výslednou tabulku do jiné skupiny souborů nebo schématu oddílů v jedné transakci zadáním MOVE TO možnosti. Možnost MOVE TO má následující omezení:
MOVE TOnení platný pro indexovaná zobrazení nebo neclusterované indexy.Schéma oddílů nebo skupina souborů již musí existovat.
Pokud
MOVE TOnení zadáno, tabulka se nachází ve stejném schématu oddílů nebo ve skupině souborů, jako byla definovaná pro clusterovaný index.
Při vyřazení clusterovaného indexu zadejte ONLINE = ON možnost, aby DROP INDEX transakce neblokovala dotazy a úpravy podkladových dat a přidružených neclusterovaných indexů.
ONLINE = ON má následující omezení:
-
ONLINE = ONnení platný pro clusterované indexy, které jsou také zakázané. Zakázané indexy musí být vyřazeny pomocí .ONLINE = OFF - Současně lze vynechat pouze jeden index.
-
ONLINE = ONnení platný pro indexovaná zobrazení, neclusterované indexy nebo indexy v místních dočasných tabulkách. -
ONLINE = ONnení platný pro indexy columnstore.
K vyřazení clusterovaného indexu se vyžaduje dočasné místo na disku, které odpovídá velikosti existujícího clusterovaného indexu. Toto další místo se uvolní hned po dokončení operace.
Note
Možnosti uvedené v části <drop_clustered_constraint_option> Platí pro clusterované indexy v tabulkách a nelze je použít u clusterovaných indexů v zobrazeních nebo neclusterovaných indexech.
Replikace změn schématu
Když spustíte ALTER TABLE publikovanou tabulku v aplikaci SQL Server Publisher, ve výchozím nastavení se tato změna rozšíří na všechny předplatitele SQL Serveru. Tato funkce má určitá omezení. Můžete ho zakázat. Další informace naleznete v tématu provádění změn schématu v databázích publikace.
Komprese dat
Systémové tabulky nelze povolit pro kompresi. Pokud je tabulka haldou, operace opětovného sestavení pro ONLINE režim je jedno vlákno. Režim použití OFFLINE pro operaci opětovného sestavení haldy s více vlákny Další informace o kompresi dat naleznete v tématu Komprese dat.
Pokud chcete vyhodnotit, jak změna stavu komprese ovlivňuje tabulku, index nebo oddíl, použijte uloženou proceduru sp_estimate_data_compression_savings systému.
Pro dělené tabulky platí následující omezení:
- Pokud tabulka obsahuje nerovné indexy, nemůžete změnit nastavení komprese jednoho oddílu.
-
ALTER TABLE <table> REBUILD PARTITION... syntaxe znovu sestaví zadaný oddíl. -
ALTER TABLE <table> REBUILD WITH... syntaxe znovu sestaví všechny oddíly.
Přetažení ntextových sloupců
Při vyřazení sloupců pomocí zastaralého datového typu ntext dojde k vyčištění odstraněných dat jako serializovaná operace na všech řádcích. Vyčištění může vyžadovat velké množství času. Při vyřazení ntextového sloupce v tabulce s velkým množstvím řádků nejprve aktualizujte sloupec ntext na NULL hodnotu a potom sloupec vypusťte. Tuto možnost můžete spustit s paralelními operacemi a zrychlit ji.
Opětovné sestavení online indexu
Chcete-li spustit příkaz DDL pro opětovné sestavení online indexu, musí být dokončeny všechny aktivní blokující transakce spuštěné v konkrétní tabulce. Při spuštění online indexu zablokuje všechny nové transakce, které jsou připravené začít spouštět v této tabulce. I když doba trvání zámku pro opětovné sestavení online indexu je krátká, čekání na dokončení všech otevřených transakcí v dané tabulce a blokování nových transakcí, které se mají spustit, může výrazně ovlivnit propustnost. To může způsobit zpomalení úlohy nebo vypršení časového limitu a výrazně omezit přístup k podkladové tabulce. Tato WAIT_AT_LOW_PRIORITY možnost umožňuje DBA spravovat zámek S a Sch-M zámky vyžadované pro opětovné sestavení online indexu. Ve všech třech případech: NONE, SELFa BLOCKERS, pokud během doby čekání ((MAX_DURATION = n [minutes])) neexistují žádné blokující aktivity, online opětovné sestavení indexu se spustí okamžitě bez čekání a příkaz DDL se dokončí.
Podpora kompatibility
Příkaz ALTER TABLE podporuje pouze názvy dvou částí (schema.object) tabulek. V SQL Serveru zadáním názvu tabulky pomocí následujících formátů v době kompilace selže s chybou 117.
server.database.schema.table.database.schema.table..schema.table
V dřívějších verzích zadejte formát server.database.schema.table vrátil chybu 4902. Zadání formátu .database.schema.table nebo formátu ..schema.table bylo úspěšné.
Pokud chcete tento problém vyřešit, odeberte použití předpony čtyřdílné části.
Permissions
Vyžaduje ALTER oprávnění k tabulce.
ALTER TABLE oprávnění platí pro obě tabulky zahrnuté v ALTER TABLE SWITCH příkazu. Všechna přepíná data dědí zabezpečení cílové tabulky.
Pokud jste v příkazu definovali nějaké sloupce ALTER TABLE , které mají být uživatelem definovaným typem nebo datovým typem aliasu CLR (Common Language Runtime), REFERENCES je vyžadováno oprávnění k danému typu.
Přidání nebo změna sloupce, který aktualizuje řádky tabulky, vyžaduje UPDATE oprávnění k tabulce. Například přidání NOT NULL sloupce s výchozí hodnotou nebo přidáním sloupce identity, pokud tabulka není prázdná.
Examples
Ukázky kódu v tomto článku používají AdventureWorks2025 ukázkovou databázi, AdventureWorksDW2025 kterou si můžete stáhnout z domovské stránky Ukázky a projekty komunity Microsoft SQL Serveru .
| Category | Doporučené prvky syntaxe |
|---|---|
| Přidání sloupců a omezení |
ADD; PRIMARY KEY s možnostmi indexu, řídkými sloupci a sadami sloupců |
| vyřazení sloupců a omezení | DROP |
| změna definice sloupce | změnit datový typ; změnit velikost sloupce; kolace |
| změna definice tabulky |
DATA_COMPRESSION; SWITCH PARTITION; ; LOCK ESCALATION sledování změn |
| Zakázání a povolení omezení a triggerů |
CHECK; NO CHECK; ; ENABLE TRIGGERDISABLE TRIGGER |
| Online operace | ONLINE |
| Správa verzí systému | SYSTEM_VERSIONING |
Přidání sloupců a omezení
Příklady v této části ukazují přidání sloupců a omezení do tabulky.
A. Přidání nového sloupce
Následující příklad přidá sloupec, který umožňuje hodnoty null a nemá žádné hodnoty zadané prostřednictvím DEFAULT definice. V novém sloupci má NULLkaždý řádek .
CREATE TABLE dbo.doc_exa (column_a INT);
GO
ALTER TABLE dbo.doc_exa
ADD column_b VARCHAR (20) NULL;
GO
B. Přidání sloupce s omezením
Následující příklad přidá nový sloupec s omezením UNIQUE.
CREATE TABLE dbo.doc_exc (column_a INT);
GO
ALTER TABLE dbo.doc_exc
ADD column_b VARCHAR (20) NULL
CONSTRAINT exb_unique UNIQUE;
GO
EXECUTE sp_help doc_exc;
GO
DROP TABLE dbo.doc_exc;
GO
C. Přidání neověřeného omezení CHECK do existujícího sloupce
Následující příklad přidá omezení do existujícího sloupce v tabulce. Sloupec má hodnotu, která porušuje omezení. Proto WITH NOCHECK slouží k zabránění ověření omezení u existujících řádků a k povolení přidání omezení.
CREATE TABLE dbo.doc_exd (column_a INT);
GO
INSERT INTO dbo.doc_exd VALUES (-1);
GO
ALTER TABLE dbo.doc_exd WITH NOCHECK
ADD CONSTRAINT exd_check CHECK (column_a > 1);
GO
EXECUTE sp_help doc_exd;
GO
DROP TABLE dbo.doc_exd;
GO
D. Přidání omezení DEFAULT do existujícího sloupce
Následující příklad vytvoří tabulku se dvěma sloupci a vloží hodnotu do prvního sloupce a druhý sloupec zůstane NULL. Do druhého sloupce se pak přidá omezení DEFAULT. Pokud chcete ověřit, že se použije výchozí hodnota, vloží se do prvního sloupce další hodnota a tabulka se dotazuje.
CREATE TABLE dbo.doc_exz
(
column_a INT,
column_b INT
);
GO
INSERT INTO dbo.doc_exz (column_a) VALUES (7);
GO
ALTER TABLE dbo.doc_exz
ADD CONSTRAINT col_b_def
DEFAULT 50 FOR column_b;
GO
INSERT INTO dbo.doc_exz (column_a) VALUES (10);
GO
SELECT * FROM dbo.doc_exz;
GO
DROP TABLE dbo.doc_exz;
GO
E. Přidání několika sloupců s omezeními
Následující příklad přidá několik sloupců s omezeními definovanými novým sloupcem. První nový sloupec má vlastnost IDENTITY. Každý řádek v tabulce má ve sloupci identity nové přírůstkové hodnoty.
CREATE TABLE dbo.doc_exe
(
column_a INT
CONSTRAINT column_a_un UNIQUE
);
GO
ALTER TABLE dbo.doc_exe
-- Add 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. Přidání sloupce s možnou hodnotou null s výchozími hodnotami
Následující příklad přidá sloupec s možnou hodnotou null s definicí DEFAULT a používá WITH VALUES k zadání hodnot pro každý existující řádek v tabulce. Pokud WITH VALUES se nepoužívá, každý řádek má hodnotu NULL v novém sloupci.
CREATE TABLE dbo.doc_exf (column_a INT);
GO
INSERT INTO dbo.doc_exf VALUES (1);
GO
ALTER TABLE dbo.doc_exf
ADD AddDate SMALLDATETIME
CONSTRAINT AddDateDflt DEFAULT GETDATE() WITH VALUES NULL;
GO
DROP TABLE dbo.doc_exf;
GO
G. Vytvoření omezení PRIMÁRNÍHO KLÍČE s možnostmi indexu nebo komprese dat
Následující příklad vytvoří PRIMARY KEY omezení PK_TransactionHistoryArchive_TransactionID a nastaví možnosti FILLFACTOR, ONLINEa PAD_INDEX. Výsledný clusterovaný index má stejný název jako omezení.
Platí pro: SQL Server a 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
Tento podobný příklad používá kompresi stránky při použití clusterovaného primárního klíče.
USE AdventureWorks2022;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID
PRIMARY KEY CLUSTERED (TransactionID) WITH (DATA_COMPRESSION = PAGE);
GO
H. Přidání zhuštěného sloupce
Následující příklady ukazují přidání a úpravy řídkých sloupců v tabulce T1. Kód pro vytvoření tabulky T1 je následující.
CREATE TABLE T1
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) SPARSE NULL,
C3 INT SPARSE NULL,
C4 INT
);
GO
Pokud chcete přidat další zhuštěný sloupec C5, spusťte následující příkaz.
ALTER TABLE T1
ADD C5 CHAR (100) SPARSE NULL;
GO
Chcete-li převést C4 neřídký sloupec na řídký sloupec, spusťte následující příkaz.
ALTER TABLE T1
ALTER COLUMN C4 ADD SPARSE;
GO
Chcete-li převést C4 řídký sloupec na sloupec, který neníparse, spusťte následující příkaz.
ALTER TABLE T1
ALTER COLUMN C4 DROP SPARSE;
GO
I. Přidání sady sloupců
Následující příklady ukazují přidání sloupce do tabulky T2. Sadu sloupců nelze přidat do tabulky, která už obsahuje řídké sloupce. Kód pro vytvoření tabulky T2 je následující.
CREATE TABLE T2
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) NULL,
C3 INT NULL,
C4 INT
);
GO
Následující tři příkazy přidají sadu sloupců s názvem CSa potom upraví sloupce C2 a C3 na SPARSE.
ALTER TABLE T2
ADD CS XML COLUMN_SET FOR ALL_SPARSE_COLUMNS;
GO
ALTER TABLE T2
ALTER COLUMN C2 ADD SPARSE;
GO
ALTER TABLE T2
ALTER COLUMN C3 ADD SPARSE;
GO
J. Přidání šifrovaného sloupce
Následující příkaz přidá šifrovaný sloupec s názvem PromotionCode.
ALTER TABLE Customers
ADD PromotionCode NVARCHAR (100)
ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = MyCEK,
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
);
K. Přidání primárního klíče s obnovitelnou operací
Operace obnovení ALTER TABLE pro přidání primárního klíče clusterovaného ve sloupci (a) s MAX_DURATION 240 minut.
ALTER TABLE table1
ADD CONSTRAINT PK_Constrain PRIMARY KEY CLUSTERED (a)
WITH (ONLINE = ON, MAXDOP = 2, RESUMABLE = ON, MAX_DURATION = 240);
Vyřazení sloupců a omezení
Příklady v této části ukazují vyřazení sloupců a omezení.
A. Přetažení sloupce nebo sloupců
První příklad upraví tabulku tak, aby odebrala sloupec. Druhý příklad odebere více sloupců.
CREATE TABLE dbo.doc_exb
(
column_a INT,
column_b VARCHAR (20) NULL,
column_c DATETIME,
column_d INT
);
GO
-- Remove a single column.
ALTER TABLE dbo.doc_exb DROP COLUMN column_b;
GO
-- Remove multiple columns.
ALTER TABLE dbo.doc_exb DROP COLUMN column_c, column_d;
B. Omezení a sloupce přetažení
První příklad odebere omezení UNIQUE z tabulky. Druhý příklad odebere dvě omezení a jeden sloupec.
CREATE TABLE dbo.doc_exc
(
column_a INT NOT NULL
CONSTRAINT my_constraint UNIQUE
);
GO
-- Example 1. Remove a single constraint.
ALTER TABLE dbo.doc_exc DROP my_constraint;
GO
DROP TABLE dbo.doc_exc;
GO
CREATE TABLE dbo.doc_exc
(
column_a INT NOT NULL
CONSTRAINT my_constraint UNIQUE,
column_b INT NOT NULL
CONSTRAINT my_pk_constraint PRIMARY KEY
);
GO
-- Example 2. Remove two constraints and one column
-- The keyword CONSTRAINT is optional. The keyword COLUMN is required.
ALTER TABLE dbo.doc_exc
DROP CONSTRAINT my_constraint, my_pk_constraint, COLUMN column_b;
GO
C. Vyřazení omezení PRIMÁRNÍHO KLÍČE v režimu ONLINE
Následující příklad odstraní PRIMARY KEY omezení s možností nastavenou ONLINE na ON.
ALTER TABLE Production.TransactionHistoryArchive
DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID
WITH (ONLINE = ON);
GO
D. Přidání a vyřazení omezení CIZÍHO KLÍČE
Následující příklad vytvoří tabulku ContactBackupa potom změní tabulku, nejprve přidáním FOREIGN KEY omezení, které odkazuje na tabulku Person.Person, a potom přetažením omezení FOREIGN KEY.
CREATE TABLE Person.ContactBackup (ContactID INT);
GO
ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBackup_Contact
FOREIGN KEY (ContactID) REFERENCES Person.Person (BusinessEntityID);
GO
ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBackup_Contact;
GO
DROP TABLE Person.ContactBackup;
Změna definice sloupce
A. Změna datového typu sloupce
Následující příklad změní sloupec tabulky z INT na DECIMAL.
CREATE TABLE dbo.doc_exy (column_a INT);
GO
INSERT INTO dbo.doc_exy (column_a) VALUES (10);
GO
ALTER TABLE dbo.doc_exy ALTER COLUMN column_a DECIMAL (5, 2);
GO
DROP TABLE dbo.doc_exy;
GO
B. Změna velikosti sloupce
Následující příklad zvětšuje velikost sloupce varchar a přesnost a měřítko sloupce desetinných míst. Vzhledem k tomu, že sloupce obsahují data, je možné velikost sloupce zvětšit pouze. Všimněte si také, že col_a je definován v jedinečném indexu. Velikost col_a je stále možné zvětšit, protože datový typ je varchar a index není výsledkem PRIMARY KEY omezení.
-- Create a two-column table with a unique index on the varchar column.
CREATE TABLE dbo.doc_exy
(
col_a VARCHAR (5) UNIQUE NOT NULL,
col_b DECIMAL (4, 2)
);
GO
INSERT INTO dbo.doc_exy VALUES ('Test', 99.99);
GO
-- Verify the current column size.
SELECT name,
TYPE_NAME(system_type_id),
max_length,
precision,
scale
FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.doc_exy');
GO
-- Increase the size of the varchar column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_a VARCHAR (25);
GO
-- Increase the scale and precision of the decimal column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_b DECIMAL (10, 4);
GO
-- Insert a new row.
INSERT INTO dbo.doc_exy VALUES ('MyNewColumnSize', 99999.9999);
GO
-- Verify the current column size.
SELECT name,
TYPE_NAME(system_type_id),
max_length,
precision,
scale
FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.doc_exy');
C. Změna kolace sloupců
Následující příklad ukazuje, jak změnit kolaci sloupce. Nejprve se vytvoří tabulka s výchozí kolací uživatele.
CREATE TABLE T3
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) NULL,
C3 INT NULL,
C4 INT
);
GO
V dalším kroku se kolace sloupce C2 změní na Latin1_General_BIN. Datový typ je povinný, i když se nezmění.
ALTER TABLE T3
ALTER COLUMN C2 VARCHAR (50) COLLATE Latin1_General_BIN;
GO
D. Šifrování sloupce
Následující příklad ukazuje, jak zašifrovat sloupec pomocí Always Encrypted se zabezpečenými enklávy.
Nejprve se vytvoří tabulka bez šifrovaných sloupců.
CREATE TABLE T3
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) NULL,
C3 INT NULL,
C4 INT
);
GO
Dále se sloupec C2 zašifruje šifrovacím klíčem sloupce s názvem CEK1a randomizovaným šifrováním. Pro úspěšné provedení následujícího příkazu:
- Šifrovací klíč sloupce musí být povolený pro enklávu. To znamená, že se musí šifrovat pomocí hlavního klíče sloupce (CMK), který umožňuje výpočty enklávy.
- Cílová instance SQL Serveru musí podporovat funkci Always Encrypted se zabezpečenými enklávy.
- Příkaz musí být vydán prostřednictvím připojení nastaveného pro Always Encrypted se zabezpečenými enklávy a pomocí podporovaného klientského ovladače.
- Volající aplikace musí mít přístup k CMK a chránit
CEK1.
ALTER TABLE T3 ALTER COLUMN C2 VARCHAR (50) ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = [CEK1],
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
) NULL;
GO
Změna definice tabulky
Příklady v této části ukazují, jak změnit definici tabulky.
A. Úprava tabulky pro změnu komprese
Následující příklad změní kompresi tabulky, která není součástí. Haldu nebo clusterovaný index se znovu sestaví. Pokud je tabulka haldou, všechny neclusterované indexy se znovu sestaví.
ALTER TABLE T1 REBUILD
WITH (DATA_COMPRESSION = PAGE);
Následující příklad změní kompresi dělené tabulky. Syntaxe REBUILD PARTITION = 1 způsobí, že se znovu sestaví jenom číslo oddílu 1.
Platí pro: SQL Server.
ALTER TABLE PartitionTable1 REBUILD PARTITION = 1
WITH (DATA_COMPRESSION = NONE);
GO
Stejná operace pomocí následující alternativní syntaxe způsobí, že se všechny oddíly v tabulce znovu sestaví.
Platí pro: SQL Server.
ALTER TABLE PartitionTable1 REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = PAGE ON PARTITIONS (1));
Další příklady komprese dat najdete v tématu Komprese dat.
B. Úprava tabulky columnstore za účelem změny archivní komprese
Následující příklad dále komprimuje oddíl tabulky columnstore použitím dalšího algoritmu komprese. Tato komprese zmenší tabulku na menší velikost, ale také zvětší čas potřebný pro ukládání a načítání. To je užitečné pro archivaci nebo v situacích, které vyžadují méně místa a mohou si dovolit více času pro ukládání a načítání.
Platí pro: SQL Server 2014 (12.x) a novější verze a Azure SQL Database.
ALTER TABLE PartitionTable1 REBUILD PARTITION = 1
WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);
GO
Následující příklad dekomprimuje oddíl tabulky columnstore, který byl komprimován s COLUMNSTORE_ARCHIVE možností. Po obnovení se data budou dál komprimovat pomocí komprese columnstore, která se používá pro všechny tabulky columnstore.
Platí pro: SQL Server 2014 (12.x) a novější verze a Azure SQL Database.
ALTER TABLE PartitionTable1 REBUILD PARTITION = 1
WITH (DATA_COMPRESSION = COLUMNSTORE);
GO
C. Přepínání oddílů mezi tabulkami
Následující příklad vytvoří dělenou tabulku za předpokladu, že schéma oddílů myRangePS1 je již vytvořeno v databázi. Dále se vytvoří nesedělená tabulka se stejnou strukturou jako dělená tabulka a ve stejné skupině souborů jako PARTITION 2 tabulky PartitionTable. Data PARTITION 2 tabulky PartitionTable se pak přepnou do tabulky NonPartitionTable.
CREATE TABLE PartitionTable
(
col1 INT,
col2 CHAR (10)
) ON myRangePS1 (col1);
GO
CREATE TABLE NonPartitionTable
(
col1 INT,
col2 CHAR (10)
) ON test2fg;
GO
ALTER TABLE PartitionTable SWITCH PARTITION 2 TO NonPartitionTable;
GO
D. Povolit eskalaci zámku u dělených tabulek
Následující příklad umožňuje eskalaci zámku na úrovni oddílu v dělené tabulce. Pokud tabulka není rozdělená na oddíly, je eskalace zámku nastavená TABLE na úrovni.
Platí pro: SQL Server a Azure SQL Database.
ALTER TABLE dbo.T1 SET (LOCK_ESCALATION = AUTO);
GO
E. Konfigurace sledování změn v tabulce
Následující příklad umožňuje sledování změn v tabulce Person.Person.
Platí pro: SQL Server a Azure SQL Database.
USE AdventureWorks2022;
ALTER TABLE Person.Person ENABLE CHANGE_TRACKING;
Následující příklad umožňuje sledování změn a umožňuje sledování sloupců, které se aktualizují během změny.
Platí pro: SQL Server.
USE AdventureWorks2022;
GO
ALTER TABLE Person.Person ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON);
Následující příklad zakáže sledování změn v tabulce Person.Person.
Platí pro: SQL Server a Azure SQL Database.
USE AdventureWorks2022;
GO
ALTER TABLE Person.Person DISABLE CHANGE_TRACKING;
Zakázání a povolení omezení a triggerů
A. Zakázání a opětovné povolení omezení
Následující příklad zakáže omezení, které omezuje platy přijaté v datech.
NOCHECK CONSTRAINT se používá s ALTER TABLE k zakázání omezení a povolení vložení, které by obvykle porušovalo omezení.
CHECK CONSTRAINT omezení znovu povolí.
CREATE TABLE dbo.cnst_example
(
id INT NOT NULL,
name VARCHAR (10) NOT NULL,
salary MONEY NOT NULL
CONSTRAINT salary_cap CHECK (salary < 100000)
);
-- Valid inserts
INSERT INTO dbo.cnst_example VALUES (1, 'Joe Brown', 65000);
INSERT INTO dbo.cnst_example VALUES (2, 'Mary Smith', 75000);
-- This insert violates the constraint.
INSERT INTO dbo.cnst_example VALUES (3, 'Pat Jones', 105000);
-- Disable the constraint and try again.
ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (3, 'Pat Jones', 105000);
-- Re-enable the constraint and try another insert; this fails.
ALTER TABLE dbo.cnst_example CHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (4, 'Eric James', 110000);
B. Zakázání a opětovné povolení triggeru
Následující příklad používá DISABLE TRIGGER možnost ALTER TABLE zakázat trigger a povolit vložení, které by obvykle porušovalo trigger.
ENABLE TRIGGER se pak použije k opětovnému povolení triggeru.
CREATE TABLE dbo.trig_example
(
id INT,
name VARCHAR (12),
salary MONEY
);
GO
-- Create the trigger.
CREATE TRIGGER dbo.trig1
ON dbo.trig_example
FOR INSERT
AS IF (SELECT COUNT(*)
FROM INSERTED
WHERE salary > 100000) > 0
BEGIN
PRINT 'TRIG1 Error: you attempted to insert a salary > $100,000';
ROLLBACK;
END
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (1, 'Pat Smith', 100001);
GO
-- Disable the trigger.
ALTER TABLE dbo.trig_example DISABLE TRIGGER trig1;
GO
-- Try an insert that would typically violate the trigger.
INSERT INTO dbo.trig_example VALUES (2, 'Chuck Jones', 100001);
GO
-- Re-enable the trigger.
ALTER TABLE dbo.trig_example ENABLE TRIGGER trig1;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (3, 'Mary Booth', 100001);
GO
Online operace
A. Online opětovné sestavení indexu s využitím možností čekání s nízkou prioritou
Následující příklad ukazuje, jak provést online opětovné sestavení indexu určující možnosti čekání s nízkou prioritou.
Platí pro: SQL Server 2014 (12.x) a novější verze a Azure SQL Database.
ALTER TABLE T1 REBUILD WITH (
PAD_INDEX = ON,
ONLINE = ON (
WAIT_AT_LOW_PRIORITY (MAX_DURATION = 4 MINUTES, ABORT_AFTER_WAIT = BLOCKERS)
)
);
B. Online sloupec oltárů
Následující příklad ukazuje, jak spustit operaci alter column s ONLINE možností.
Platí pro: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.
CREATE TABLE dbo.doc_exy (column_a INT);
GO
INSERT INTO dbo.doc_exy (column_a) VALUES (10);
GO
ALTER TABLE dbo.doc_exy
ALTER COLUMN column_a DECIMAL (5, 2) WITH (ONLINE = ON);
GO
EXECUTE sp_help doc_exy;
DROP TABLE dbo.doc_exy;
GO
Správa verzí systému
Následující čtyři příklady vám pomůžou seznámit se syntaxí pro používání systémových verzí. Další pomoc najdete v tématu Začínáme se systémovými dočasnými tabulkami.
Platí pro: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.
A. Přidání správy systémových verzí do existujících tabulek
Následující příklad ukazuje, jak přidat systémovou správu verzí do existující tabulky a vytvořit budoucí tabulku historie. Tento příklad předpokládá, že existuje existující tabulka s názvem InsurancePolicy s definovaným primárním klíčem. Tento příklad naplní nově vytvořené sloupce období pro správu verzí systému pomocí výchozích hodnot pro počáteční a koncové časy, protože tyto hodnoty nemohou být null. V tomto příkladu se HIDDEN klauzule používá k zajištění žádného účinku na existující aplikace, které pracují s aktuální tabulkou. Používá také HISTORY_RETENTION_PERIOD službu, která je k dispozici pouze ve službě 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. Migrace existujícího řešení pro použití správy verzí systému
Následující příklad ukazuje, jak migrovat na správu verzí systému z řešení, které používá triggery k napodobování dočasné podpory. Příklad předpokládá, že existuje existující řešení, které používá ProjectTask tabulku a ProjectTaskHistory tabulku pro stávající řešení, které používá Changed Date sloupce a Revised Date sloupce pro období, že tyto sloupce období nepoužívají datový typ datetime2 a že ProjectTask tabulka má definovaný primární klíč.
-- Drop existing trigger
DROP TRIGGER ProjectTask_HistoryTrigger;
-- Adjust the schema for current and history table
-- Change data types for existing period columns
ALTER TABLE ProjectTask ALTER COLUMN [Changed Date] DATETIME2 NOT NULL;
ALTER TABLE ProjectTask ALTER COLUMN [Revised Date] DATETIME2 NOT NULL;
ALTER TABLE ProjectTaskHistory ALTER COLUMN [Changed Date] DATETIME2 NOT NULL;
ALTER TABLE ProjectTaskHistory ALTER COLUMN [Revised Date] DATETIME2 NOT NULL;
-- Add SYSTEM_TIME period and set system versioning with linking two existing tables
-- (a certain set of data checks happen in the background)
ALTER TABLE ProjectTask
ADD PERIOD FOR SYSTEM_TIME ([Changed Date], [Revised Date]);
ALTER TABLE ProjectTask SET (
SYSTEM_VERSIONING = ON (
HISTORY_TABLE=dbo.ProjectTaskHistory, DATA_CONSISTENCY_CHECK=ON
)
);
C. Zakázání a opětovné povolení správy verzí systému pro změnu schématu tabulky
Tento příklad ukazuje, jak zakázat správu verzí systému v tabulce Department, přidat sloupec a znovu povolit správu verzí systému. K úpravě schématu tabulky se vyžaduje zakázání správy verzí systému. Pomocí těchto kroků v rámci transakce zabráníte aktualizacím obou tabulek při aktualizaci schématu tabulky, což dbA umožňuje přeskočit kontrolu konzistence dat při opětovném povolení správy verzí systému a získat výhodu výkonu. Úlohy, jako je vytváření statistik, přepínání oddílů nebo použití komprese u jedné nebo obou tabulek, nevyžadují zakázání správy verzí systému.
BEGIN TRAN
/* Takes schema lock on both tables */
ALTER TABLE Department
SET (SYSTEM_VERSIONING = OFF) ;
/* expand table schema for temporal table */
ALTER TABLE Department
ADD Col5 int NOT NULL DEFAULT 0 ;
/* Expand table schema for history table */
ALTER TABLE DepartmentHistory
ADD Col5 int NOT NULL DEFAULT 0 ;
/* Re-establish versioning again*/
ALTER TABLE Department
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE=dbo.DepartmentHistory,
DATA_CONSISTENCY_CHECK = OFF)) ;
COMMIT
D. Odebrání správy verzí systému
Tento příklad ukazuje, jak úplně odebrat správu verzí systému z tabulky Oddělení a odstranit DepartmentHistory tabulku. Volitelně můžete chtít také vyřadit sloupce období používané systémem k záznamu informací o správě verzí systému. V době, kdy je povolená správa systémových verzí, nemůžete odstranit tabulky Department ani tabulky DepartmentHistory.
ALTER TABLE Department
SET (SYSTEM_VERSIONING = OFF);
ALTER TABLE Department
DROP PERIOD FOR SYSTEM_TIME;
DROP TABLE DepartmentHistory;
Příklady: Azure Synapse Analytics a Analytický platformový systém (PDW)
Následující příklady A až C používají tabulku FactResellerSales v databázi AdventureWorksPDW2022.
A. Určení, jestli je tabulka rozdělená na oddíly
Následující dotaz vrátí jeden nebo více řádků, pokud je tabulka FactResellerSales rozdělena. Pokud tabulka není rozdělená na oddíly, nebudou vráceny žádné řádky.
SELECT *
FROM sys.partitions AS p
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. Určení hodnot hranic pro dělenou tabulku
Následující dotaz vrátí hodnoty hranic pro každý oddíl v tabulce FactResellerSales.
SELECT t.name AS TableName,
i.name AS IndexName,
p.partition_number,
p.partition_id,
i.data_space_id,
f.function_id,
f.type_desc,
r.boundary_id,
r.value AS BoundaryValue
FROM sys.tables AS t
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. Určení sloupce oddílu pro dělenou tabulku
Následující dotaz vrátí název sloupce dělení tabulky FactResellerSales .
SELECT t.object_id AS Object_ID,
t.name AS TableName,
ic.column_id AS PartitioningColumnID,
c.name AS PartitioningColumnName
FROM sys.tables AS t
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. Sloučení dvou oddílů
Následující příklad sloučí dva oddíly v tabulce.
Tabulka Customer má následující definici:
CREATE TABLE Customer
(
id INT NOT NULL,
lastName VARCHAR (20),
orderCount INT,
orderDate DATE
)
WITH (
DISTRIBUTION = HASH(id),
PARTITION(orderCount RANGE LEFT
FOR VALUES (1, 5, 10, 25, 50, 100)
)
);
Následující příkaz kombinuje hranice oddílů 10 a 25.
ALTER TABLE Customer MERGE RANGE (10);
Nový DDL tabulky je následující:
CREATE TABLE Customer
(
id INT NOT NULL,
lastName VARCHAR (20),
orderCount INT,
orderDate DATE
)
WITH (
DISTRIBUTION = HASH(id),
PARTITION(orderCount RANGE LEFT
FOR VALUES (1, 5, 25, 50, 100)
)
);
E. Rozdělení oddílu
Následující příklad rozdělí oddíl na tabulku.
Tabulka Customer obsahuje následující DDL:
DROP TABLE Customer;
CREATE TABLE Customer
(
id INT NOT NULL,
lastName VARCHAR (20),
orderCount INT,
orderDate DATE
)
WITH (
DISTRIBUTION = HASH(id),
PARTITION(orderCount RANGE LEFT
FOR VALUES (1, 5, 10, 25, 50, 100)
)
);
Následující příkaz vytvoří nový oddíl vázaný na hodnotu 75 v rozmezí od 50 do 100.
ALTER TABLE Customer SPLIT RANGE (75);
Nový DDL tabulky je následující:
CREATE TABLE Customer (
id INT NOT NULL,
lastName VARCHAR(20),
orderCount INT,
orderDate DATE)
WITH DISTRIBUTION = HASH(id),
PARTITION ( orderCount (RANGE LEFT
FOR VALUES (1, 5, 10, 25, 50, 75, 100))) ;
F. Přesunutí oddílu do tabulky historie pomocí přepínače
Následující příklad přesune data v oddílu tabulky Orders do oddílu v tabulce OrdersHistory.
Tabulka Orders obsahuje následující DDL:
CREATE TABLE Orders
(
id INT,
city VARCHAR (25),
lastUpdateDate DATE,
orderDate DATE
)
WITH (
DISTRIBUTION = HASH(id),
PARTITION(orderDate RANGE RIGHT
FOR VALUES ('2004-01-01', '2005-01-01', '2006-01-01', '2007-01-01')
)
);
V tomto příkladu má tabulka Orders následující oddíly. Každý oddíl obsahuje data.
| Partition | Obsahuje data? | Rozsah hranic |
|---|---|---|
| 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 |
- Oddíl 1 (obsahuje data):
OrderDate < '2004-01-01' - Oddíl 2 (obsahuje data):
'2004-01-01' <= OrderDate < '2005-01-01' - Oddíl 3 (obsahuje data):
'2005-01-01' <= OrderDate< '2006-01-01' - Oddíl 4 (obsahuje data):
'2006-01-01'<= OrderDate < '2007-01-01' - Oddíl 5 (obsahuje data):
'2007-01-01' <= OrderDate
Tabulka OrdersHistory obsahuje následující DDL, který má stejné sloupce a názvy sloupců jako Orders tabulka. Oba se distribuují hodnotou hash ve sloupci id.
CREATE TABLE OrdersHistory
(
id INT,
city VARCHAR (25),
lastUpdateDate DATE,
orderDate DATE
)
WITH (
DISTRIBUTION = HASH(id),
PARTITION(orderDate RANGE RIGHT
FOR VALUES ('2004-01-01')
)
);
I když názvy sloupců a sloupců musí být stejné, hranice oddílů nemusí být stejné. V tomto příkladu má tabulka OrdersHistory následující dva oddíly a oba oddíly jsou prázdné:
- Oddíl 1 (bez dat):
OrderDate < '2004-01-01' - Oddíl 2 (prázdný):
'2004-01-01' <= OrderDate
U předchozích dvou tabulek následující příkaz přesune všechny řádky s OrderDate < '2004-01-01' z tabulky Orders do tabulky OrdersHistory.
ALTER TABLE Orders SWITCH PARTITION 1 TO OrdersHistory PARTITION 1;
V důsledku toho je první oddíl v Orders prázdný a první oddíl v OrdersHistory obsahuje data. Tabulky se teď zobrazují takto:
tabulka Orders
- Oddíl 1 (prázdný):
OrderDate < '2004-01-01' - Oddíl 2 (obsahuje data):
'2004-01-01' <= OrderDate < '2005-01-01' - Oddíl 3 (obsahuje data):
'2005-01-01' <= OrderDate< '2006-01-01' - Oddíl 4 (obsahuje data):
'2006-01-01'<= OrderDate < '2007-01-01' - Oddíl 5 (obsahuje data):
'2007-01-01' <= OrderDate
tabulka OrdersHistory
- Oddíl 1 (obsahuje data):
OrderDate < '2004-01-01' - Oddíl 2 (prázdný):
'2004-01-01' <= OrderDate
Pokud chcete tabulku vyčistit Orders , můžete prázdný oddíl odebrat sloučením oddílů 1 a 2 následujícím způsobem:
ALTER TABLE Orders MERGE RANGE ('2004-01-01');
Po sloučení má tabulka Orders následující oddíly:
tabulka Orders
- Oddíl 1 (obsahuje data):
OrderDate < '2005-01-01' - Oddíl 2 (obsahuje data):
'2005-01-01' <= OrderDate< '2006-01-01' - Oddíl 3 (obsahuje data):
'2006-01-01'<= OrderDate < '2007-01-01' - Oddíl 4 (obsahuje data):
'2007-01-01' <= OrderDate
Předpokládejme, že další rok projde a jste připraveni archivovat rok 2005. Prázdný oddíl můžete přidělit pro rok 2005 v tabulce OrdersHistory rozdělením prázdného oddílu následujícím způsobem:
ALTER TABLE OrdersHistory SPLIT RANGE ('2005-01-01');
Po rozdělení má tabulka OrdersHistory následující oddíly:
tabulka OrdersHistory
- Oddíl 1 (obsahuje data):
OrderDate < '2004-01-01' - Oddíl 2 (prázdný):
'2004-01-01' < '2005-01-01' - Oddíl 3 (prázdný):
'2005-01-01' <= OrderDate
Související obsah
- sys.tables
- sp_rename
- sp_help
- EVENTDATA (Transact-SQL)
- VYTVOŘIT TABULKU (Transact-SQL)
- DROP TABLE (Transact-SQL)
- STOL column_constraint (Transact-SQL)
- STOL column_definition (Transact-SQL)
- ZMĚNIT TABULKU definice_vypočítaného_sloupce (Transact-SQL)
- STOL index_option (Transact-SQL)
- ZMĚNIT TABULKU table_constraint (Transact-SQL)