Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Magazyn w usłudze Microsoft Fabric
Baza danych SQL w usłudze Microsoft Fabric
Modyfikuje definicję tabeli, zmieniając, dodając lub upuszczając kolumny i ograniczenia.
ALTER TABLE ponownie przypisuje i ponownie kompiluje partycje lub wyłącza i włącza ograniczenia i wyzwalacze.
Note
Obecnie ALTER TABLE w magazynie sieci szkieletowej jest obsługiwana tylko w przypadku ograniczeń i dodawania kolumn dopuszczanych do wartości null. Zobacz Składnia magazynu w usłudze Microsoft Fabric.
Obecnie tabele zoptymalizowane pod pamięć nie są dostępne w bazie SQL w Microsoft Fabric.
Składnia dla ALTER TABLE programu różni się w przypadku tabel opartych na dyskach i tabel zoptymalizowanych pod kątem pamięci. Skorzystaj z poniższych linków, aby przejść bezpośrednio do odpowiedniego bloku składni dla typów tabel i do odpowiednich przykładów składni:
Tabele oparte na dyskach:
Tabele zoptymalizowane pod kątem pamięci:
Aby uzyskać więcej informacji na temat konwencji składni, zobacz Transact-SQL konwencje składni.
Składnia tabel opartych na dyskach
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 } )
}
Aby uzyskać więcej informacji, zobacz:
- STOŁ ALTEROWY column_constraint
- STOŁ OLTAROWY column_definition
- STOŁ ALTEROWY computed_column_definition
- ALTER TABLE index_option
- ZMIEŃ TABELĘ ograniczenie_tabeli
Składnia tabel zoptymalizowanych pod kątem pamięci
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 ]
}
Składnia dla usług Azure Synapse Analytics i Parallel Data Warehouse
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
Bezserwerowa pula SQL w usłudze Azure Synapse Analytics obsługuje tylko zewnętrznych i tymczasowych tabel.
Składnia magazynu w sieci szkieletowej
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
Nazwa bazy danych, w której została utworzona tabela.
schema_name
Nazwa schematu, do którego należy tabela.
table_name
Nazwa tabeli, która ma zostać zmieniona. Jeśli tabela nie znajduje się w bieżącej bazie danych lub znajduje się w schemacie należącym do bieżącego użytkownika, musisz jawnie określić bazę danych i schemat.
KOLUMNA ALTEROWA
Określa, że nazwana kolumna ma zostać zmieniona lub zmieniona.
Zmodyfikowana kolumna nie może być:
Kolumna z sygnaturą czasową typ danych.
Element
ROWGUIDCOLdla tabeli.Obliczona kolumna lub używana w obliczonej kolumnie.
Używane w statystykach generowanych przez instrukcję
CREATE STATISTICS. Użytkownicy muszą uruchomićDROP STATISTICSpolecenie , aby usunąć statystyki przed powodzeniemALTER COLUMN. Uruchom to zapytanie, aby pobrać wszystkie kolumny statystyk i statystyk dla tabeli przez użytkownika.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
Statystyki generowane automatycznie przez optymalizator zapytań są automatycznie porzucane przez
ALTER COLUMNelement .Używane w ograniczeniu
PRIMARY KEYlub[FOREIGN KEY] REFERENCES.Używane w ograniczeniu
CHECKlubUNIQUE. Jednak zmiana długości kolumny o zmiennej długości używanej w ograniczeniuCHECKlubUNIQUEjest dozwolona.Skojarzone z definicją domyślną. Jednak długość, precyzja lub skala kolumny można zmienić, jeśli typ danych nie zostanie zmieniony.
Typ danych tekstu, ntexti kolumn obrazu można zmienić tylko w następujący sposób:
- tekstvarchar(max), nvarchar(max)lub xml
- ntextvarchar(max), nvarchar(max)lub xml
- obrazuvarbinary(max)
Niektóre zmiany typu danych mogą spowodować zmianę danych. Na przykład zmiana kolumny nchar lub nvarchar na char lub varcharmoże spowodować konwersję znaków rozszerzonych. Aby uzyskać więcej informacji, zobacz CAST i CONVERT. Zmniejszenie dokładności lub skali kolumny może spowodować obcięcie danych.
Note
Nie można zmienić typu danych kolumny tabeli partycjonowanej.
Nie można zmienić typu danych kolumn zawartych w indeksie, chyba że kolumna jest varchar, nvarcharlub varbinary typu danych, a nowy rozmiar jest równy lub większy niż stary rozmiar.
Nie można zmienić kolumny zawartej w ograniczeniu klucza podstawowego z NOT NULL na NULL.
W przypadku używania funkcji Always Encrypted (bez bezpiecznych enklaw), jeśli modyfikowana kolumna jest szyfrowana ENCRYPTED WITHprzy użyciu metody , możesz zmienić typ danych na zgodny typ danych (np INT . na BIGINT), ale nie można zmienić żadnych ustawień szyfrowania.
W przypadku używania funkcji Always Encrypted z bezpiecznymi enklawami można zmienić dowolne ustawienie szyfrowania, jeśli klucz szyfrowania kolumny chroni kolumnę (i nowy klucz szyfrowania kolumny, jeśli zmieniasz klucz) obsługuje obliczenia enklaw (zaszyfrowane przy użyciu kluczy głównych kolumn z obsługą enklawy). Aby uzyskać szczegółowe informacje, zobacz Always Encrypted z bezpiecznymi enklawami.
Podczas modyfikowania kolumny aparat bazy danych śledzi każdą modyfikację, dodając wiersz w tabeli systemowej i oznaczając poprzednią modyfikację kolumny jako porzuconą kolumnę. W rzadkich przypadkach modyfikowanie kolumny jest zbyt wiele razy, aparat bazy danych może osiągnąć limit rozmiaru rekordu. W takim przypadku zostanie wyświetlony błąd 511 lub 1708. Aby uniknąć tych błędów, należy okresowo ponownie skompilować indeks klastrowany w tabeli lub zmniejszyć liczbę modyfikacji kolumn.
column_name
Nazwa kolumny, która ma zostać zmieniona, dodana lub porzucona. Maksymalna column_name wynosi 128 znaków. W przypadku nowych kolumn można pominąć column_name dla kolumn utworzonych przy użyciu znacznika czasu typu danych. Nazwa sygnatury czasowej jest używana, jeśli nie określisz column_name dla sygnatury czasowej kolumny typu danych.
Note
Nowe kolumny są dodawane po zmianie wszystkich istniejących kolumn w tabeli.
[ type_schema_name. ] type_name
Nowy typ danych dla zmienionej kolumny lub typ danych dla dodanej kolumny. Nie można określić type_name dla istniejących kolumn tabel partycjonowanych. type_name może być jednym z następujących typów:
- Typ danych systemowych programu SQL Server.
- Typ danych aliasu oparty na typie danych systemowych programu SQL Server. Typy danych aliasu są tworzone za pomocą instrukcji
CREATE TYPE, zanim będą one używane w definicji tabeli. - Typ zdefiniowany przez użytkownika programu .NET Framework i schemat, do którego należy. Typy zdefiniowane przez użytkownika są tworzone za pomocą instrukcji
CREATE TYPE, zanim będą mogły być używane w definicji tabeli.
Poniżej przedstawiono kryteria type_name zmienionej kolumny:
- Poprzedni typ danych musi być niejawnie konwertowany na nowy typ danych.
- type_name nie można sygnatury czasowej.
- ANSI_NULL wartości domyślne są zawsze włączone dla
ALTER COLUMNparametru ; jeśli nie określono, kolumna jest dopuszczana do wartości null. -
ANSI_PADDINGDopełnienie jest zawszeONprzeznaczone dla elementuALTER COLUMN. - Jeśli zmodyfikowana kolumna jest kolumną tożsamości, new_data_type musi być typem danych obsługującym właściwość tożsamości.
- Bieżące ustawienie dla
SET ARITHABORTelementu jest ignorowane.ALTER TABLEdziała tak, jakbyARITHABORTustawiono wartośćON.
Note
Jeśli klauzula COLLATE nie zostanie określona, zmiana typu danych kolumny spowoduje zmianę sortowania na domyślne sortowanie bazy danych.
precision
Precyzja określonego typu danych. Aby uzyskać więcej informacji na temat prawidłowych wartości dokładności, zobacz Precyzja, skala i długość.
scale
Skala dla określonego typu danych. Aby uzyskać więcej informacji na temat prawidłowych wartości skalowania, zobacz Precyzja, skala i długość.
max
Dotyczy tylko varchar, nvarchari typów danych do przechowywania 2^31–1 bajtów znaków, danych binarnych i danych Unicode.
xml_schema_collection
Dotyczy: SQL Server i Azure SQL Database.
Dotyczy tylko typu danych xml
SORTOWANIE <collation_name>
Określa nowe sortowanie dla zmienionej kolumny. Jeśli nie zostanie określona, kolumna zostanie przypisana do domyślnego sortowania bazy danych. Nazwa sortowania może być nazwą sortowania systemu Windows lub nazwą sortowania SQL. Aby uzyskać listę i więcej informacji, zobacz Nazwa sortowania systemu Windows i Nazwa sortowania programu SQL Server.
Klauzula COLLATE zmienia sortowania tylko kolumn typów danych char, varchar, nchar i nvarchar. Aby zmienić sortowanie kolumny typu danych aliasu zdefiniowanego przez użytkownika, użyj oddzielnych ALTER TABLE instrukcji, aby zmienić kolumnę na typ danych systemowych programu SQL Server. Następnie zmień sortowanie i zmień kolumnę z powrotem na typ danych aliasu.
ALTER COLUMN nie może mieć zmiany sortowania, jeśli istnieje co najmniej jeden z następujących warunków:
- Ograniczenie
CHECK,FOREIGN KEYograniczenie lub obliczone kolumny odwołują się do zmienionej kolumny. - Każdy indeks, statystyka lub indeks pełnotekstowy są tworzone w kolumnie. Statystyki utworzone automatycznie w zmienionej kolumnie zostaną porzucone, jeśli sortowanie kolumn zostanie zmienione.
- Widok lub funkcja powiązana ze schematem odwołuje się do kolumny.
Aby uzyskać więcej informacji na temat obsługiwanych sortowania, zobacz COLLATE.
NULL | NIE NULL
Określa, czy kolumna może akceptować wartości null. Kolumny, które nie zezwalają na wartości null, są dodawane ALTER TABLE tylko wtedy, gdy mają wartość domyślną określoną lub jeśli tabela jest pusta. Można określić NOT NULL dla kolumn obliczeniowych tylko wtedy, gdy określono również wartość PERSISTED. Jeśli nowa kolumna zezwala na wartości null i nie określisz wartości domyślnej, nowa kolumna zawiera wartość null dla każdego wiersza w tabeli. Jeśli nowa kolumna zezwala na wartości null i dodajesz domyślną definicję z nową kolumną, możesz użyć WITH VALUES do przechowywania wartości domyślnej w nowej kolumnie dla każdego istniejącego wiersza w tabeli.
Jeśli nowa kolumna nie zezwala na wartości null, a tabela nie jest pusta, musisz dodać definicję DEFAULT z nową kolumną. Nowa kolumna zostanie automatycznie załadowana z wartością domyślną w nowych kolumnach w każdym istniejącym wierszu.
Możesz określić NULL wartość , ALTER COLUMN aby wymusić, aby kolumna NOT NULL zezwalała na wartości null, z wyjątkiem kolumn w PRIMARY KEY ograniczeniach. Można określić NOT NULL tylko wtedy ALTER COLUMN , gdy kolumna nie zawiera wartości null. Wartości null należy zaktualizować do pewnej wartości przed zezwoleniem ALTER COLUMNNOT NULL , na przykład:
UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL;
ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR (20) NOT NULL;
Podczas tworzenia lub zmieniania tabeli za pomocą CREATE TABLE instrukcji or ALTER TABLE ustawienia bazy danych i sesji wpływają i ewentualnie zastępują wartość null typu danych używanego w definicji kolumny. Upewnij się, że zawsze jawnie definiujesz kolumnę jako NULL kolumnę lub NOT NULL dla kolumn niekompilowanych.
Jeśli dodasz kolumnę z typem danych zdefiniowanym przez użytkownika, zdefiniuj kolumnę z taką samą wartością null jak typ danych zdefiniowany przez użytkownika. Następnie określ wartość domyślną dla kolumny. Aby uzyskać więcej informacji, zobacz CREATE TABLE.
Note
Jeśli NULL parametr lub NOT NULL jest określony z parametrem ALTER COLUMN, należy również określić new_data_type [(precyzja [, skala ])]. Jeśli typ danych, precyzja i skala nie są zmieniane, określ bieżące wartości kolumn.
[ {ADD | DROP} ROWGUIDCOL ]
Dotyczy: SQL Server i Azure SQL Database.
Określa, że ROWGUIDCOL właściwość jest dodawana do określonej kolumny lub porzucana z określonej kolumny.
ROWGUIDCOL wskazuje, że kolumna jest kolumną GUID wiersza. Jako kolumnę można ustawić tylko jedną unikatową kolumnę unikatową na tabelę ROWGUIDCOL . Można również przypisać ROWGUIDCOL właściwość tylko do kolumny uniqueidentifier . Nie można przypisać ROWGUIDCOL do kolumny typu danych zdefiniowanego przez użytkownika.
ROWGUIDCOL Nie wymusza unikatowości wartości przechowywanych w kolumnie i nie generuje automatycznie wartości dla nowych wierszy wstawionych do tabeli. Aby wygenerować unikatowe wartości dla każdej kolumny, użyj funkcji NEWID() lub NEWSEQUENTIALID() w instrukcjach INSERT. Możesz też określić funkcję NEWID() lub NEWSEQUENTIALID() jako domyślną dla kolumny.
[ {ADD | DROP} UTRWALONE ]
Określa, że PERSISTED właściwość jest dodawana do określonej kolumny lub porzucana z określonej kolumny. Kolumna musi być obliczoną kolumną zdefiniowaną za pomocą wyrażenia deterministycznego. W przypadku kolumn określonych jako PERSISTEDaparat bazy danych fizycznie przechowuje obliczone wartości w tabeli i aktualizuje wartości, gdy są aktualizowane inne kolumny, od których zależy obliczona kolumna. Oznaczając obliczoną kolumnę jako PERSISTED, można utworzyć indeksy dla obliczonych kolumn zdefiniowanych na wyrażeniach deterministycznych, ale nie precyzyjnych. Aby uzyskać więcej informacji, zobacz Indeksy dla obliczonych kolumn.
SET QUOTED_IDENTIFIER element musi znajdować się ON podczas tworzenia lub zmieniania indeksów w kolumnach obliczeniowych lub widokach indeksowanych. Aby uzyskać więcej informacji, zobacz SET QUOTED_IDENTIFIER.
Każda obliczona kolumna używana jako kolumna partycjonowania tabeli partycjonowanej musi być jawnie oznaczona .PERSISTED
Note
W bazie danych SQL sieci szkieletowej kolumny obliczeniowe są dozwolone, ale obecnie nie są dublowane w usłudze Fabric OneLake.
UPUŚĆ NIE DLA REPLIKACJI
Dotyczy: SQL Server i Azure SQL Database.
Określa, że wartości są zwiększane w kolumnach tożsamości podczas wykonywania operacji wstawiania przez agentów replikacji. Tę klauzulę można określić tylko wtedy, gdy column_name jest kolumną tożsamości.
SPARSE
Wskazuje, że kolumna jest rozrzedliwą kolumną. Przechowywanie rozrzedzonych kolumn jest zoptymalizowane pod kątem wartości null. Nie można ustawić rozrzedzona kolumn jako NOT NULL. W przypadku konwertowania kolumny z rozrzednia na nieparzystą lub z nieparzystego na rozrzednia ta opcja blokuje tabelę na czas wykonywania polecenia. Może być konieczne użycie klauzuli w REBUILD celu odzyskania wszelkich oszczędności miejsca. Aby uzyskać dodatkowe ograniczenia i więcej informacji o rozrzednych kolumnach, zobacz Use sparse columns (Używanie rozrzednych kolumn).
DODAJ MASKOWANY PRZEZ ( FUNKCJA = 'mask_function')
Dotyczy: SQL Server 2016 (13.x) i nowsze wersje oraz Azure SQL Database.
Określa dynamiczną maskę danych. mask_function jest nazwą funkcji maskowania z odpowiednimi parametrami. Dostępne są trzy funkcje:
- default()
- email()
- partial()
- random()
Wymaga ALTER ANY MASK uprawnień.
Aby usunąć maskę, użyj DROP MASKED. Aby uzyskać informacje o parametrach funkcji, zobacz Dynamiczne maskowanie danych.
Dodaj i upuść maskę wymaga ALTER ANY MASK uprawnień.
WITH ( ONLINE = ON | OFF) <jak ma zastosowanie do zmiany> kolumny
Dotyczy: SQL Server 2016 (13.x) i nowsze wersje oraz Azure SQL Database.
Umożliwia wykonywanie wielu akcji zmiany kolumny, gdy tabela pozostaje dostępna. Wartość domyślna to OFF. Możesz uruchomić polecenie alter column online w celu zmiany kolumny związane z typem danych, długością kolumny lub precyzją, wartością null, rozrzedżeniem i sortowaniem.
Zmiana kolumny online umożliwia użytkownikowi tworzenie i autostatystyka odwołuje się do zmienionej kolumny na czas trwania ALTER COLUMN operacji, co pozwala na uruchamianie zapytań w zwykły sposób. Na końcu operacji autostaty odwołujące się do kolumny są porzucane, a statystyki utworzone przez użytkownika są unieważniane. Użytkownik musi ręcznie zaktualizować statystyki wygenerowane przez użytkownika po zakończeniu operacji. Jeśli kolumna jest częścią wyrażenia filtru dla żadnych statystyk lub indeksów, nie można wykonać operacji zmiany kolumny.
Gdy operacja zmiany kolumny online jest uruchomiona, każda operacja DDL, która może zależeć od tej kolumny (takiej jak tworzenie lub modyfikowanie indeksów, widoków itp.) jest blokowana lub kończy się niepowodzeniem z odpowiednim błędem. To zachowanie gwarantuje, że zmiana kolumny online nie zakończy się niepowodzeniem z powodu zależności wprowadzonych podczas działania operacji.
Zmiana kolumny z
NOT NULLnaNULLnie jest obsługiwana jako operacja online, gdy zmieniona kolumna jest przywoływana przez indeksy nieklastrowane.Tryb online
ALTERnie jest obsługiwany, gdy kolumna jest przywoływana przez ograniczenie sprawdzania, aALTERoperacja ogranicza dokładność kolumny (numeryczne lub data/godzina).Nie można użyć opcji
WAIT_AT_LOW_PRIORITYz kolumną alter online.ALTER COLUMN ... ADD/DROP PERSISTEDnie jest obsługiwana w przypadku kolumny zmiany online.ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATIONnie ma wpływu na kolumnę zmiany online.Zmiana kolumny w trybie online nie obsługuje zmiany tabeli, w której jest włączone śledzenie zmian lub jest wydawcą replikacji scalania.
Zmiana kolumny w trybie online nie obsługuje zmiany typów danych CLR ani z tych typów.
Zmiana kolumny w trybie online nie obsługuje zmiany typu danych XML, który ma kolekcję schematów inną niż bieżąca kolekcja schematów.
Zmiana kolumny online nie zmniejsza ograniczeń dotyczących zmiany kolumny. Odwołania według indeksu/statystyk i tak dalej mogą spowodować niepowodzenie zmiany.
Zmiana kolumny w trybie online nie obsługuje jednoczesnego zmieniania więcej niż jednej kolumny.
Zmiana kolumny w trybie online nie ma wpływu na tabelę czasową w wersji systemowej.
ALTERkolumna nie jest uruchamiana jako online, niezależnie od tego, która wartość została określona dlaONLINEopcji.
Zmiana kolumny online ma podobne wymagania, ograniczenia i funkcje podczas ponownego kompilowania indeksu online, co obejmuje:
- Ponowne kompilowanie indeksu online nie jest obsługiwane, gdy tabela zawiera starsze kolumny LOB lub filestream lub gdy tabela ma indeks magazynu kolumn. Te same ograniczenia dotyczą zmiany kolumny online.
- Zmieniona istniejąca kolumna wymaga dwukrotnego przydziału miejsca dla oryginalnej kolumny i dla nowo utworzonej ukrytej kolumny.
- Strategia blokowania podczas operacji online zmiany kolumny jest zgodna z tym samym wzorcem blokowania używanym do kompilacji indeksu online.
ZA POMOCĄ SPRAWDZANIA | Z NOCHECK
Określa, czy dane w tabeli są lub nie są weryfikowane względem nowo dodanego lub ponownie włączonego FOREIGN KEY lub CHECK ograniczonego. Jeśli nie określisz, przyjmuje się, WITH CHECK że dla nowych ograniczeń przyjęto WITH NOCHECK założenie ponownego włączenia ograniczeń.
Jeśli nie chcesz weryfikować nowych CHECK lub FOREIGN KEY ograniczeń względem istniejących danych, użyj polecenia WITH NOCHECK. Nie zalecamy tego robić, z wyjątkiem rzadkich przypadków. Nowe ograniczenie jest oceniane we wszystkich późniejszych aktualizacjach danych. Wszelkie naruszenia ograniczeń, które są pomijane przez WITH NOCHECK dodanie ograniczenia, mogą spowodować niepowodzenie przyszłych aktualizacji, jeśli aktualizują wiersze z danymi, które nie są zgodne z ograniczeniem. Optymalizator zapytań nie uwzględnia ograniczeń zdefiniowanych przez WITH NOCHECKprogram . Takie ograniczenia są ignorowane do momentu ich ponownego włączenia przy użyciu ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL. Aby uzyskać więcej informacji, zobacz Wyłączanie ograniczeń klucza obcego za pomocą instrukcji INSERT i UPDATE.
INDEKS ALTERA index_name
Określa, że liczba zasobników dla index_name ma zostać zmieniona lub zmieniona.
Składnia ALTER TABLE ... ADD/DROP/ALTER INDEX jest obsługiwana tylko w przypadku tabel zoptymalizowanych pod kątem pamięci.
Important
Bez użycia instrukcji ALTER TABLE instrukcje CREATE INDEX, DROP INDEX, ALTER INDEX i PAD_INDEX nie są obsługiwane w przypadku indeksów w tabelach zoptymalizowanych pod kątem pamięci.
ADD
Określa, że dodawane są co najmniej jedna definicja kolumny, obliczone definicje kolumn lub ograniczenia tabeli. Można też dodać kolumny używane przez system do przechowywania wersji systemu. W przypadku tabel zoptymalizowanych pod kątem pamięci można dodać indeks.
Note
Nowe kolumny są dodawane po zmianie wszystkich istniejących kolumn w tabeli.
Important
Bez użycia instrukcji ALTER TABLE instrukcje CREATE INDEX, DROP INDEX, ALTER INDEX i PAD_INDEX nie są obsługiwane w przypadku indeksów w tabelach zoptymalizowanych pod kątem pamięci.
OKRES DLA SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )
Dotyczy: SQL Server 2017 (14.x) i nowsze wersje oraz Azure SQL Database.
Określa nazwy kolumn używanych przez system do rejestrowania okresu, dla którego rekord jest prawidłowy. Możesz określić istniejące kolumny lub utworzyć nowe kolumny jako część argumentu ADD PERIOD FOR SYSTEM_TIME . Skonfiguruj kolumny z typem danych datetime2 i zdefiniuj je jako NOT NULL. Jeśli zdefiniujesz kolumnę kropki jako NULL, wynik błędu. Można zdefiniować column_constraint i/lub Określić wartości domyślne kolumn dla kolumn system_start_time i system_end_time. Zobacz Przykład A w poniższych przykładach obsługi wersji systemu, które pokazują użycie wartości domyślnej dla kolumny system_end_time.
Użyj tego argumentu z argumentem SET SYSTEM_VERSIONING , aby utworzyć istniejącą tabelę czasową. Aby uzyskać więcej informacji, zobacz Tabele czasowe i Wprowadzenie do tabel czasowych.
Począwszy od programu SQL Server 2017 (14.x), użytkownicy mogą oznaczyć jedną lub obie kolumny kropką z flagą HIDDEN , aby niejawnie ukryć te kolumny, tak aby SELECT * FROM <table_name> nie zwracały wartości dla kolumn. Domyślnie kolumny kropki nie są ukryte. Aby można było używać, ukryte kolumny muszą być jawnie uwzględnione we wszystkich zapytaniach, które bezpośrednio odwołują się do tabeli czasowej.
DROP
Określa, że usunięto co najmniej jedną definicję kolumny, obliczone definicje kolumn lub ograniczenia tabeli albo usunąć specyfikację kolumn używanych przez system do przechowywania wersji systemu.
Note
Kolumny porzucone w tabelach rejestru są usuwane nietrwale. Porzucona kolumna pozostaje w tabeli rejestru, ale jest oznaczona jako porzucona kolumna przez ustawienie dropped_ledger_table kolumny na sys.tables1 wartość . Widok rejestru usuniętej tabeli rejestru jest również oznaczony jako porzucony przez ustawienie kolumny dropped_ledger_view w sys.tables na wartość 1. Zmieniono nazwę usuniętej tabeli rejestru, jej tabeli historii i widoku rejestru przez dodanie prefiksu (MSSQL_DroppedLedgerTable, MSSQL_DroppedLedgerHistory, MSSQL_DroppedLedgerView) i dołączanie identyfikatora GUID do oryginalnej nazwy.
CONSTRAINT_NAME OGRANICZEŃ
Określa, że constraint_name jest usuwana z tabeli. Można wymienić wiele ograniczeń.
Można określić zdefiniowaną przez użytkownika lub podaną przez system nazwę ograniczenia, wykonując zapytanie dotyczące widoków katalogu sys.check_constraint, sys.default_constraints, sys.key_constraintsi sys.foreign_keys.
PRIMARY KEY Nie można porzucić ograniczenia, jeśli w tabeli istnieje indeks XML.
INDEX_NAME INDEKSU
Określa, że index_name jest usuwana z tabeli.
Składnia ALTER TABLE ... ADD/DROP/ALTER INDEX jest obsługiwana tylko w przypadku tabel zoptymalizowanych pod kątem pamięci.
Important
Bez użycia instrukcji ALTER TABLE instrukcje CREATE INDEX, DROP INDEX, ALTER INDEX i PAD_INDEX nie są obsługiwane w przypadku indeksów w tabelach zoptymalizowanych pod kątem pamięci.
column_name KOLUMNY
Określa, że constraint_name lub column_name jest usuwany z tabeli. Można wymienić wiele kolumn.
Nie można porzucić kolumny, gdy jest:
- Używany w indeksie, niezależnie od tego, czy jest to kolumna klucza, czy jako
INCLUDE - Używany w ograniczeniu
CHECK,FOREIGN KEY,UNIQUElubPRIMARY KEY. - Skojarzona z wartością domyślną zdefiniowaną za pomocą słowa kluczowego
DEFAULTlub powiązana z obiektem domyślnym. - Powiązana z regułą.
Note
Usunięcie kolumny nie powoduje odzyskania miejsca na dysku kolumny. Może być konieczne odzyskanie miejsca na dysku usuniętej kolumny, gdy rozmiar wiersza tabeli zbliża się lub przekracza limit. Odzyskaj miejsce, tworząc indeks klastrowany w tabeli lub ponownie kompilując istniejący indeks klastrowany przy użyciu ALTER INDEX. Aby uzyskać informacje o wpływie upuszczania typów danych BIZNESOWYCH, zobacz ten wpis w blogu CSS.
OKRES DLA SYSTEM_TIME
Dotyczy: SQL Server 2016 (13.x) i nowsze wersje oraz Azure SQL Database.
Pomiń specyfikację kolumn używanych przez system do przechowywania wersji systemu.
Z <drop_clustered_constraint_option>
Określa, że ustawiono co najmniej jedną opcję ograniczenia klastra.
MAXDOP = max_degree_of_parallelism
Dotyczy: SQL Server i Azure SQL Database.
Zastępuje maksymalny stopień równoległości opcji konfiguracji tylko przez czas trwania operacji. Aby uzyskać więcej informacji, zobacz Konfiguracja serwera: maksymalny stopień równoległości.
MAXDOP Użyj opcji , aby ograniczyć liczbę procesorów używanych w równoległym wykonywaniu planu. Maksymalna wartość to 64 procesory.
max_degree_of_parallelism może być jedną z następujących wartości:
1Pomija generowanie planu równoległego.
>1Ogranicza maksymalną liczbę procesorów używanych w operacji indeksowania równoległego do określonej liczby.
0(ustawienie domyślne)Używa rzeczywistej liczby procesorów lub mniej na podstawie bieżącego obciążenia systemu.
Aby uzyskać więcej informacji, zobacz Configure Parallel Index Operations.
Note
Operacje indeksowania równoległego nie są dostępne w każdej wersji programu SQL Server. Aby uzyskać więcej informacji, zobacz Editions and supported features of SQL Server 2022.
ONLINE = { ON | OFF } <jak ma zastosowanie do drop_clustered_constraint_option>
Określa, czy tabele bazowe i skojarzone indeksy są dostępne dla zapytań i modyfikacji danych podczas operacji indeksu. Wartość domyślna to OFF. Możesz uruchomić REBUILD jako operację ONLINE .
ON
Długoterminowe blokady tabeli nie są przechowywane przez czas trwania operacji indeksu. W fazie głównej operacji indeksowania blokada udziału intencji (
IS) jest przechowywana w tabeli źródłowej. To zachowanie umożliwia kontynuowanie zapytań lub aktualizacji podstawowej tabeli i indeksów. Na początku operacji blokada współużytkowanego (S) jest przechowywana na obiekcie źródłowym przez krótki czas. Na końcu operacji przez krótki czas jest uzyskiwana blokada S (współdzielona) w źródle, jeśli tworzony jest indeks nieklastrowany. Można też uzyskać blokadę Sch-M (modyfikacja schematu) podczas tworzenia lub porzucania indeksu klastrowanego w trybie online i odbudowy indeksu klastrowanego lub nieklastrowanego.ONLINENie można ustawić wartości naONwartość , gdy indeks jest tworzony w lokalnej tabeli tymczasowej. Dozwolone jest tylko jednowątkowa operacja ponownego kompilowania stert.Aby uruchomić rozszerzenie DDL dla
SWITCHlub ponowne kompilowanie indeksu online, należy ukończyć wszystkie aktywne transakcje blokujące uruchomione w określonej tabeli. Podczas wykonywaniaSWITCHoperacji lub ponownej kompilacji uniemożliwia uruchamianie nowych transakcji i może znacząco wpłynąć na przepływność obciążenia i tymczasowo opóźnić dostęp do tabeli bazowej.OFF
Blokady tabeli mają zastosowanie do czasu trwania operacji indeksu. Operacja indeksu w trybie offline, która tworzy, kompiluje lub usuwa indeks klastrowany albo usuwa indeks nieklastrowany, uzyskuje modyfikację schematu (Sch-M) blokady w tabeli. Ta blokada uniemożliwia wszystkim użytkownikom dostęp do tabeli bazowej przez czas trwania operacji. Operacja indeksu offline, która tworzy indeks nieklastrowany, uzyskuje blokadę współużytkowaną (S) w tabeli. Ta blokada uniemożliwia aktualizowanie tabeli bazowej, ale umożliwia wykonywanie operacji odczytu, takich jak
SELECTinstrukcje. Operacje odbudowy sterta wielowątkowego są dozwolone.Aby uzyskać więcej informacji, zobacz Jak działają operacje indeksowania online.
Note
Operacje indeksowania online nie są dostępne w każdej wersji programu SQL Server. Aby uzyskać więcej informacji, zobacz Editions and supported features of SQL Server 2022.
MOVE TO { partition_scheme_name(column_name [ ,... n ] ) | filegroup | "default" }
Dotyczy: SQL Server i Azure SQL Database.
Określa lokalizację przenoszenia wierszy danych obecnie na poziomie liścia indeksu klastrowanego. Tabela zostanie przeniesiona do nowej lokalizacji. Ta opcja ma zastosowanie tylko do ograniczeń, które tworzą indeks klastrowany.
Note
W tym kontekście default nie jest słowem kluczowym. Jest to identyfikator domyślnej grupy plików i musi być rozdzielany, tak jak w pliku MOVE TO "default" lub MOVE TO [default]. Jeśli "default" jest określona QUOTED_IDENTIFIER , opcja musi być ON dla bieżącej sesji. Jest to ustawienie domyślne. Aby uzyskać więcej informacji, zobacz SET QUOTED_IDENTIFIER.
{ CHECK | NOCHECK } OGRANICZENIE
Określa, że constraint_name jest włączona lub wyłączona. Tej opcji można używać tylko z FOREIGN KEY ograniczeniami i CHECK . Gdy NOCHECK zostanie określony, ograniczenie jest wyłączone, a przyszłe wstawki lub aktualizacje do kolumny nie są weryfikowane względem warunków ograniczeń.
DEFAULTNie można wyłączyć ograniczeń , PRIMARY KEYi UNIQUE .
ALL
Określa, że wszystkie ograniczenia są wyłączone z opcją
NOCHECKlub włączone z opcjąCHECK.
{ WŁĄCZ | WYŁĄCZ } WYZWALACZ
Określa, że trigger_name jest włączona lub wyłączona. Gdy wyzwalacz jest wyłączony, nadal jest zdefiniowany dla tabeli. Jednak gdy INSERTinstrukcje , UPDATElub DELETE są uruchamiane względem tabeli, akcje w wyzwalaczu nie są wykonywane do momentu ponownego włączenia wyzwalacza.
ALL
Określa, że wszystkie wyzwalacze w tabeli są włączone lub wyłączone.
trigger_name
Określa nazwę wyzwalacza do wyłączenia lub włączenia.
{ WŁĄCZ | WYŁĄCZ } CHANGE_TRACKING
Dotyczy: SQL Server i Azure SQL Database.
Określa, czy śledzenie zmian jest włączone dla tabeli. Domyślnie śledzenie zmian jest wyłączone.
Ta opcja jest dostępna tylko wtedy, gdy śledzenie zmian jest włączone dla bazy danych. Aby uzyskać więcej informacji, zobacz ALTER DATABASE SET options (OPCJE ALTER DATABASE SET).
Aby włączyć śledzenie zmian, tabela musi mieć klucz podstawowy.
WITH ( TRACK_COLUMNS_UPDATED = { ON | WYŁĄCZ } )
Dotyczy: SQL Server i Azure SQL Database.
Określa, czy aparat bazy danych śledzi, które zmiany śledzone kolumny zostały zaktualizowane. Wartość domyślna to OFF.
PRZEŁĄCZ [ PARTYCJA source_partition_number_expression ] NA [ schema_name. ] target_table [ PARTYCJA target_partition_number_expression ]
Dotyczy: SQL Server i Azure SQL Database.
Przełącza blok danych na jeden z następujących sposobów:
- Ponownie przypisuje wszystkie dane tabeli jako partycję do istniejącej tabeli partycjonowanej.
- Przełącza partycję z jednej partycjonowanej tabeli na inną.
- Ponownie przypisuje wszystkie dane w jednej partycji tabeli partycjonowanej do istniejącej tabeli bez partycji.
Jeśli tabeli jest tabelą partycjonowaną, należy określić source_partition_number_expression. Jeśli target_table jest partycjonowana, musisz określić target_partition_number_expression. W przypadku ponownego przypisania danych tabeli jako partycji do istniejącej tabeli partycjonowanej lub przełączenia partycji z jednej tabeli partycjonowanej na inną partycja musi istnieć partycja docelowa i musi być pusta.
Podczas ponownego przypisania danych jednej partycji w celu utworzenia pojedynczej tabeli tabela docelowa musi już istnieć i musi być pusta. Zarówno tabela źródłowa, jak i partycja, a tabela docelowa lub partycja muszą znajdować się w tej samej grupie plików. Odpowiednie indeksy lub partycje indeksu muszą również znajdować się w tej samej grupie plików. Wiele dodatkowych ograniczeń dotyczy przełączania partycji. tabeli i target_table nie mogą być takie same. target_table może być identyfikatorem wieloczęściowym.
Zarówno source_partition_number_expression, jak i target_partition_number_expression to wyrażenia stałe, które mogą odwoływać się do zmiennych i funkcji. Obejmują one zmienne typu zdefiniowane przez użytkownika i funkcje zdefiniowane przez użytkownika. Nie mogą odwoływać się do Transact-SQL wyrażeń.
Partycjonowana tabela z klastrowanym indeksem magazynu kolumn zachowuje się jak partycjonowana sterta:
- Klucz podstawowy musi zawierać klucz partycji.
- Unikatowy indeks musi zawierać klucz partycji. Jednak dołączenie klucza partycji z istniejącym indeksem unikatowym może zmienić unikatowość.
- Aby przełączyć partycje, wszystkie indeksy nieklastrowane muszą zawierać klucz partycji.
Aby uzyskać SWITCH ograniczenia podczas korzystania z replikacji, zobacz Replikowanie tabel i indeksów podzielonych na partycje.
Indeksy magazynu kolumn nieklastrowanych zostały wbudowane w format tylko do odczytu przed programem SQL Server 2016 (13.x) i dla usługi SQL Database przed wersją V12. Przed uruchomieniem jakichkolwiek PARTITION operacji należy ponownie skompilować nieklastrowane indeksy magazynu kolumn do bieżącego formatu (który można zaktualizować).
Limitations
Jeśli obie tabele są partycjonowane identycznie, w tym indeksy nieklastrowane, a tabela docelowa nie ma żadnych indeksów nieklastrowanych, może zostać wyświetlony błąd 4907.
Przykładowe dane wyjściowe:
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 | "domyślne" | "NULL" })
Dotyczy: SQL Server. Usługa Azure SQL Database nie obsługuje FILESTREAM.
Określa, gdzie są przechowywane dane FILESTREAM.
ALTER TABLE klauzula SET FILESTREAM_ON kończy się powodzeniem tylko wtedy, gdy tabela nie ma kolumn FILESTREAM. Kolumny FILESTREAM można dodać przy użyciu drugiej ALTER TABLE instrukcji.
Jeśli określisz partition_scheme_name, mają zastosowanie reguły CREATE TABLE. Upewnij się, że tabela jest już partycjonowana dla danych wierszy, a schemat partycji używa tej samej funkcji partycji i kolumn co schemat partycji FILESTREAM.
filestream_filegroup_name określa nazwę grupy plików FILESTREAM. Grupa plików musi mieć jeden plik zdefiniowany dla grupy plików przy użyciu instrukcji CREATE DATABASE lub ALTER DATABASE albo występuje błąd.
"default" określa grupę plików FILESTREAM z zestawem DEFAULT właściwości. Jeśli nie ma grupy plików FILESTREAM, zostanie wyświetlony błąd.
"NULL" określa, że wszystkie odwołania do plików FILESTREAM dla tabeli są usuwane. Najpierw należy porzucić wszystkie kolumny FILESTREAM. Służy SET FILESTREAM_ON = "NULL" do usuwania wszystkich danych FILESTREAM skojarzonych z tabelą.
USTAW ( SYSTEM_VERSIONING = { WYŁĄCZ | ON [ ( HISTORY_TABLE = schema_name . history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | WYŁĄCZ } ] ) ) } )
Dotyczy: SQL Server 2016 (13.x) i nowsze wersje oraz Azure SQL Database.
Albo wyłącza lub włącza przechowywanie wersji systemu tabeli. Aby włączyć przechowywanie wersji systemu tabeli, system sprawdza, czy są spełnione wymagania dotyczące typów danych, ograniczenia wartości null i ograniczenia klucza podstawowego dla przechowywania wersji systemu. System rejestruje historię każdego rekordu w tabeli systemowej w oddzielnej tabeli historii.
HISTORY_TABLE Jeśli argument nie jest używany, nazwa tej tabeli historii to MSSQL_TemporalHistoryFor<primary_table_object_id>. Jeśli tabela historii nie istnieje, system generuje nową tabelę historii zgodną ze schematem bieżącej tabeli, tworzy połączenie między dwiema tabelami i umożliwia systemowi rejestrowanie historii każdego rekordu w bieżącej tabeli w tabeli historii. Jeśli użyjesz argumentu HISTORY_TABLE, aby utworzyć link do istniejącej tabeli historii i użyć jej, system utworzy łącze między bieżącą tabelą a określoną tabelą. Podczas tworzenia linku do istniejącej tabeli historii możesz przeprowadzić sprawdzanie spójności danych. Ten sprawdzanie spójności danych gwarantuje, że istniejące rekordy nie nakładają się na siebie. Uruchamianie sprawdzania spójności danych jest ustawieniem domyślnym. Użyj argumentu SYSTEM_VERSIONING = ON w tabeli zdefiniowanej za pomocą klauzuli PERIOD FOR SYSTEM_TIME, aby istniejąca tabela stanie się tabelą czasową. Aby uzyskać więcej informacji, zobacz Tabele czasowe.
HISTORY_RETENTION_PERIOD = { INFINITE | number { DAY | DNI | TYDZIEŃ | TYGODNIE | MIESIĄC | MIESIĄCE | ROK | YEARS } }
Dotyczy: SQL Server 2017 (14.x) i Azure SQL Database.
Określa skończone lub nieskończone przechowywanie danych historycznych w tabeli czasowej. W przypadku pominięcia przyjmuje się, że przyjmuje się nieskończone przechowywanie.
DATA_DELETION
Dotyczy: azure SQL Edge tylko
Umożliwia czyszczenie starych lub przestarzałych danych z tabel w bazie danych na podstawie zasad przechowywania. Aby uzyskać więcej informacji, zobacz Włączanie i wyłączanie przechowywania danych. Aby można było włączyć przechowywanie danych, należy określić następujące parametry.
FILTER_COLUMN = { column_name }
Określa kolumnę, która ma być używana do określenia, czy wiersze w tabeli są przestarzałe, czy nie. Następujące typy danych są dozwolone dla kolumny filtru.
- date
- data/godzina
- data/godzina2
- smalldatetime
- datetimeoffset
RETENTION_PERIOD = { INFINITE | number { DAY | DNI | TYDZIEŃ | TYGODNIE | MIESIĄC | MIESIĄCE | ROK | YEARS } }
Określa zasady okresu przechowywania dla tabeli. Okres przechowywania jest określany jako kombinacja dodatniej wartości całkowitej i jednostki części daty.
SET ( LOCK_ESCALATION = { AUTO | TABELA | WYŁĄCZ } )
Dotyczy: SQL Server i Azure SQL Database.
Określa dozwolone metody eskalacji blokady dla tabeli.
AUTO
Ta opcja umożliwia aparatowi bazy danych programu SQL Server wybranie stopnia szczegółowości eskalacji blokady odpowiedniego dla schematu tabeli.
Jeśli tabela jest podzielona na partycje, stopień szczegółowości stosu lub drzewa B(HoBT) może być blokowany. Innymi słowy, eskalacja jest dozwolona na poziomie partycji. Po eskalacji blokady na poziom HoBT blokada nie zostanie później eskalowana do
TABLEstopnia szczegółowości.Jeśli tabela nie jest partycjonowana, eskalacja blokady jest wykonywana z dokładnością
TABLE.
TABLE
Eskalacja blokady jest wykonywana z dokładnością na poziomie tabeli niezależnie od tego, czy tabela jest partycjonowana, czy nie partycjonowana.
TABLEjest wartością domyślną.DISABLE
Zapobiega eskalacji blokady w większości przypadków. Blokady na poziomie tabeli nie są całkowicie niedozwolone. Na przykład podczas skanowania tabeli, która nie ma indeksu klastrowanego na poziomie izolacji możliwej do serializacji, aparat bazy danych musi zablokować tabelę, aby chronić integralność danych.
REBUILD
Użyj składni, REBUILD WITH aby ponownie skompilować całą tabelę, w tym wszystkie partycje w tabeli podzielonej na partycje. Jeśli tabela ma indeks klastrowany, REBUILD opcja ponownie kompiluje indeks klastrowany.
REBUILD można uruchomić jako operację ONLINE .
Użyj składni, REBUILD PARTITION aby ponownie skompilować pojedynczą partycję w tabeli partycjonowanej.
PARTYCJA = WSZYSTKO
Dotyczy: SQL Server i Azure SQL Database.
Ponowne kompilowanie wszystkich partycji podczas zmieniania ustawień kompresji partycji.
PONOWNE KOMPILOWANIE ZA POMOCĄ ( <rebuild_option> )
Wszystkie opcje dotyczą tabeli z indeksem klastrowanym. Jeśli tabela nie ma indeksu klastrowanego, struktura stert ma wpływ tylko na niektóre opcje.
Jeśli określone ustawienie kompresji nie zostanie określone z operacją REBUILD , zostanie użyte bieżące ustawienie kompresji dla partycji. Aby zwrócić bieżące ustawienie, wykonaj zapytanie względem kolumny data_compression w widoku wykazu sys.partitions.
Aby uzyskać pełne opisy opcji ponownego kompilowania, zobacz ALTER TABLE index_option.
DATA_COMPRESSION
Dotyczy: SQL Server i Azure SQL Database.
Określa opcję kompresji danych dla określonej tabeli, numeru partycji lub zakresu partycji. Opcje są następujące:
NONE
Tabele lub określone partycje nie są kompresowane. Ta opcja nie ma zastosowania do tabel magazynu kolumn.
SZEREG
Tabele lub określone partycje są kompresowane przy użyciu kompresji wierszy. Ta opcja nie ma zastosowania do tabel magazynu kolumn.
STRONA
Tabele lub określone partycje są kompresowane przy użyciu kompresji strony. Ta opcja nie ma zastosowania do tabel magazynu kolumn.
COLUMNSTORE
Dotyczy: SQL Server 2014 (12.x) i nowsze wersje oraz Azure SQL Database.
Dotyczy tylko tabel magazynu kolumn.
COLUMNSTOREokreśla dekompresowanie partycji, która została skompresowana za pomocąCOLUMNSTORE_ARCHIVEopcji . Po przywróceniu danych będzie ona nadal kompresowana przy użyciu kompresji magazynu kolumn, która jest używana dla wszystkich tabel magazynu kolumn.COLUMNSTORE_ARCHIVE
Dotyczy: SQL Server 2014 (12.x) i nowsze wersje oraz Azure SQL Database.
Dotyczy tylko tabel magazynu kolumn, które są tabelami przechowywanymi w klastrowanym indeksie magazynu kolumn.
COLUMNSTORE_ARCHIVEdodatkowo kompresuje określoną partycję do mniejszego rozmiaru. Użyj tej opcji w przypadku archiwizacji lub innych sytuacji, które wymagają mniejszej ilości miejsca do magazynowania i mogą pozwolić sobie na więcej czasu na przechowywanie i pobieranie.Aby ponownie skompilować wiele partycji w tym samym czasie, zobacz index_option. Jeśli tabela nie ma indeksu klastrowanego, zmiana kompresji danych ponownie kompiluje stertę i indeksy nieklastrowane. Aby uzyskać więcej informacji na temat kompresji, zobacz Kompresja danych.
ALTER TABLE REBUILD PARTITION WITH DATA COMPRESSION = ROWPAGElub nie jest dozwolony w bazie danych SQL w Microsoft Fabric.
XML_COMPRESSION
Dotyczy: SQL Server 2022 (16.x) i nowsze wersje, Azure SQL Database i Azure SQL Managed Instance.
Określa opcję kompresji XML dla wszystkich kolumn typu danych xml xml w tabeli. Opcje są następujące:
ON
Kolumny używające xml typu danych są kompresowane.
OFF
Kolumny używające typu danych xml nie są kompresowane.
ONLINE = { ON | OFF } <zgodnie z single_partition_rebuild_option>
Określa, czy pojedyncza partycja bazowych tabel i skojarzonych indeksów jest dostępna dla zapytań i modyfikacji danych podczas operacji indeksowania. Wartość domyślna to OFF. Możesz uruchomić REBUILD jako operację ONLINE .
ON
Długoterminowe blokady tabeli nie są przechowywane przez czas trwania operacji indeksu. Blokada S w tabeli jest wymagana na początku odbudowy indeksu i blokada Sch-M na końcu ponownego kompilowania indeksu online. Mimo że obie blokady są krótkimi blokadami metadanych, Sch-M blokada musi czekać na zakończenie wszystkich transakcji blokujących. W czasie oczekiwania Sch-M blokada blokuje wszystkie inne transakcje, które oczekują za tą blokadą podczas uzyskiwania dostępu do tej samej tabeli.
Note
Ponowne kompilowanie indeksu online może ustawić opcje
low_priority_lock_waitopisane w dalszej części tej sekcji.OFF
Blokady tabeli są stosowane do czasu trwania operacji indeksu. Zapobiega to dostępowi wszystkich użytkowników do tabeli bazowej przez czas trwania operacji.
COLUMN_SET XML column_set_name FOR ALL_SPARSE_COLUMNS
Dotyczy: SQL Server i Azure SQL Database.
Nazwa zestawu kolumn. Zestaw kolumn to nietypowa reprezentacja XML, która łączy wszystkie rozrzedzone kolumny tabeli w dane wyjściowe ze strukturą. Nie można dodać zestawu kolumn do tabeli zawierającej rozrzedzona kolumna. Aby uzyskać więcej informacji na temat zestawów kolumn, zobacz Używanie zestawów kolumn.
{ WŁĄCZ | WYŁĄCZ } FILETABLE_NAMESPACE
Dotyczy: SQL Server.
Włącza lub wyłącza ograniczenia zdefiniowane przez system w tabeli FileTable. Można używać tylko z tabelą FileTable.
SET ( FILETABLE_DIRECTORY = directory_name )
Dotyczy: SQL Server. Usługa Azure SQL Database nie obsługuje tabeli FileTable.
Określa nazwę katalogu FileTable zgodną z systemem Windows. Ta nazwa powinna być unikatowa wśród wszystkich nazw katalogów FileTable w bazie danych. Porównanie unikatowości jest niewrażliwe na wielkość liter, pomimo ustawień sortowania SQL. Można używać tylko z tabelą FileTable.
REMOTE_DATA_ARCHIVE
Dotyczy: SQL Server 2017 (14.x) i nowsze wersje.
Włącza lub wyłącza bazę danych Stretch dla tabeli. Aby uzyskać więcej informacji, zobacz Stretch Database.
Important
Baza danych Stretch jest przestarzała w programie SQL Server 2022 (16.x) i usłudze Azure SQL Database. Ta funkcja zostanie usunięta w przyszłej wersji aparatu bazy danych. Unikaj używania tej funkcji w nowych pracach programistycznych i zaplanuj modyfikowanie aplikacji, które obecnie korzystają z tej funkcji.
Włączanie bazy danych Stretch dla tabeli
Po włączeniu funkcji Stretch dla tabeli przez określenie ONnależy również określić MIGRATION_STATE = OUTBOUND, aby natychmiast rozpocząć migrację danych, lub MIGRATION_STATE = PAUSED odroczyć migrację danych. Wartość domyślna to MIGRATION_STATE = OUTBOUND. Aby uzyskać więcej informacji na temat włączania funkcji Stretch dla tabeli, zobacz Enable Stretch Database for a table.
Prerequisites. Przed włączeniem programu Stretch dla tabeli należy włączyć usługę Stretch na serwerze i w bazie danych. Aby uzyskać więcej informacji, zobacz Enable Stretch Database for a database.
Permissions. Włączenie programu Stretch dla bazy danych lub tabeli wymaga db_owner uprawnień. Włączenie funkcji Stretch dla tabeli wymaga ALTER również uprawnień w tabeli.
Wyłączanie bazy danych Stretch dla tabeli
Po wyłączeniu funkcji Stretch dla tabeli masz dwie opcje dla danych zdalnych, które zostały już zmigrowane na platformę Azure. Aby uzyskać więcej informacji, zobacz Disable Stretch Database and bring back remote data.
Aby wyłączyć usługę Stretch dla tabeli i skopiować dane zdalne dla tabeli z platformy Azure z powrotem do programu SQL Server, uruchom następujące polecenie. Nie można anulować tego polecenia.
ALTER TABLE <table_name> SET ( REMOTE_DATA_ARCHIVE ( MIGRATION_STATE = INBOUND ) ) ;
Ta operacja wiąże się z kosztami transferu danych i nie można jej anulować. Aby uzyskać więcej informacji, zobacz Szczegóły cennika transferu danych.
Po skopiowaniu wszystkich danych zdalnych z platformy Azure z powrotem do programu SQL Server usługa Stretch jest wyłączona dla tabeli.
Aby wyłączyć usługę Stretch dla tabeli i porzucić dane zdalne, uruchom następujące polecenie.
ALTER TABLE <table_name> SET ( REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY ( MIGRATION_STATE = PAUSED ) ) ;
Po wyłączeniu bazy danych Stretch dla tabeli migracja danych zostanie zatrzymana i wyniki zapytania nie będą już uwzględniać wyników z tabeli zdalnej.
Wyłączenie funkcji Stretch nie powoduje usunięcia tabeli zdalnej. Jeśli chcesz usunąć tabelę zdalną, upuść ją przy użyciu witryny Azure Portal.
[ FILTER_PREDICATE = { null | predykat } ]
Dotyczy: SQL Server 2017 (14.x) i nowsze wersje.
Opcjonalnie określa predykat filtru, aby wybrać wiersze do migracji z tabeli zawierającej zarówno dane historyczne, jak i bieżące. Predykat musi wywołać deterministyczną funkcję wartości tabeli wbudowanej. Aby uzyskać więcej informacji, zobacz Enable Stretch Database for a table and Select rows to migrate by using a filter function - Stretch Database.
Important
Jeśli podasz predykat filtru, który działa źle, migracja danych również działa źle. Baza danych Stretch stosuje predykat filtru do tabeli przy użyciu CROSS APPLY operatora .
Jeśli nie określisz predykatu filtru, cała tabela zostanie zmigrowana.
Po określeniu predykatu filtru należy również określić wartość MIGRATION_STATE.
MIGRATION_STATE = { OUTBOUND | RUCH PRZYCHODZĄCY | WSTRZYMANO }
Dotyczy: SQL Server 2017 (14.x) i nowsze wersje.
Określ
OUTBOUND, aby przeprowadzić migrację danych z programu SQL Server na platformę Azure.Określ
INBOUND, aby skopiować dane zdalne dla tabeli z platformy Azure z powrotem do programu SQL Server i wyłączyć funkcję Stretch dla tabeli. Aby uzyskać więcej informacji, zobacz Disable Stretch Database and bring back remote data.Ta operacja wiąże się z kosztami transferu danych i nie można jej anulować.
Określ
PAUSED, aby wstrzymać lub odłożyć migrację danych. Aby uzyskać więcej informacji, zobacz Wstrzymaj i wznawiaj migrację danych — Baza danych Stretch.
WAIT_AT_LOW_PRIORITY
Dotyczy: SQL Server 2014 (12.x) i nowsze wersje oraz Azure SQL Database.
Ponowne kompilowanie indeksu w trybie online musi czekać na operacje blokowania w tej tabeli.
WAIT_AT_LOW_PRIORITY wskazuje, że operacja ponownego kompilowania indeksu online czeka na blokady o niskim priorytcie, co umożliwia wykonywanie innych operacji podczas oczekiwania na operację kompilacji indeksu online. Pominięcie WAIT AT LOW PRIORITY opcji jest takie samo jak WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).
MAX_DURATION = czas [ MINUTY ]
Dotyczy: SQL Server 2014 (12.x) i nowsze wersje oraz Azure SQL Database.
Czas oczekiwania, czyli wartość całkowita określona w minutach, SWITCH że ponowne kompilowanie indeksu lub online blokuje oczekiwanie z niskim priorytetem podczas uruchamiania polecenia DDL. Jeśli operacja zostanie zablokowana przez MAX_DURATION ten czas, zostanie uruchomiona ABORT_AFTER_WAIT jedna z akcji.
MAX_DURATION czas jest zawsze w minutach i można pominąć słowo MINUTES.
ABORT_AFTER_WAIT = { NONE | SELF | BLOKOWANIA }
Dotyczy: SQL Server 2014 (12.x) i nowsze wersje oraz Azure SQL Database.
NONE
Kontynuuj oczekiwanie na blokadę z normalnym (regularnym) priorytetem.
SELF
Zamknij obecnie uruchamianą operację DDL ponownego kompilowania indeksu
SWITCHlub online bez wykonywania żadnych akcji.BLOCKERS
Zabij wszystkie transakcje użytkownika, które obecnie blokują operację DDL indeksu
SWITCHlub online, aby operacja mogła kontynuować.Wymaga
ALTER ANY CONNECTIONuprawnień.
JEŚLI ISTNIEJE
Dotyczy: SQL Server 2016 (13.x) i nowsze wersje oraz Azure SQL Database.
Warunkowo odrzuca kolumnę lub ograniczenie tylko wtedy, gdy już istnieje.
WZNAWIANIE = { WŁ. | WYŁ.}
Dotyczy: SQL Server 2022 (16.x) i nowsze wersje.
Określa, czy operacja ALTER TABLE ADD CONSTRAINT jest wznawiana. Operacja dodawania ograniczeń tabeli jest wznawiana, gdy ON. Operacja dodawania ograniczeń tabeli nie jest wznawiana, gdy OFF. Wartość domyślna to OFF. Opcja RESUMABLE może być używana jako część ALTER TABLE index_option w ALTER TABLE table_constraint.
MAX_DURATION w przypadku użycia z RESUMABLE = ON (wymaga ONLINE = ON) wskazuje czas (wartość całkowita określona w minutach), że wznawiana operacja dodawania ograniczeń online jest wykonywana przed wstrzymaniem. Jeśli nie zostanie określony, operacja będzie kontynuowana do momentu ukończenia.
Aby uzyskać więcej informacji na temat włączania i używania operacji wznawianych ALTER TABLE ADD CONSTRAINT , zobacz Wznawianie ograniczeń tabeli.
Remarks
Aby dodać nowe wiersze danych, użyj INSERT. Aby usunąć wiersze danych, użyj DELETE lub TRUNCATE TABLE. Aby zmienić wartości w istniejących wierszach, użyj UPDATE.
Jeśli istnieją plany wykonywania w pamięci podręcznej procedury odwołującej się do tabeli, ALTER TABLE oznacza je do ponownego skompilowania podczas następnego wykonywania.
W bazie danych SQL w Microsoft Fabric niektóre funkcje tabel można utworzyć, ale nie są lustrzane w Fabric OneLake. Więcej informacji można znaleźć w artykule Ograniczenia mirroringu baz danych Fabric SQL.
Zmienianie rozmiaru kolumny
Długość, precyzja lub skala kolumny można zmienić, określając nowy rozmiar dla typu danych kolumny. Użyj klauzuli ALTER COLUMN . Jeśli dane istnieją w kolumnie, nowy rozmiar nie może być mniejszy niż maksymalny rozmiar danych. Ponadto nie można zdefiniować kolumny w indeksie, chyba że kolumna jest typu danych varchar, nvarchar lub varbinary , a indeks nie jest wynikiem PRIMARY KEY ograniczenia. Zobacz przykład w krótkiej sekcji zatytułowanej Zmienianie definicji kolumny.
Blokady i ALTER TABLE
Zmiany określone w ALTER TABLE implementacji natychmiast. Jeśli zmiany wymagają modyfikacji wierszy w tabeli, ALTER TABLE zaktualizuje wiersze.
ALTER TABLE uzyskuje modyfikację schematu (Sch-M) blokadę w tabeli, aby upewnić się, że żadne inne połączenia nie odwołują się nawet do metadanych tabeli podczas zmiany, z wyjątkiem operacji indeksu online, które wymagają krótkiej Sch-M blokady na końcu. W operacji ALTER TABLE...SWITCH blokada jest uzyskiwana zarówno w tabelach źródłowych, jak i docelowych. Modyfikacje wprowadzone w tabeli są rejestrowane i w pełni możliwe do odzyskania. Zmiany wpływające na wszystkie wiersze w dużych tabelach, takie jak upuszczenie kolumny lub w niektórych wersjach programu SQL Server, dodanie NOT NULL kolumny z wartością domyślną może zająć dużo czasu i wygenerować wiele rekordów dziennika. Uruchom te ALTER TABLE instrukcje z taką samą starannością jak dowolna INSERTinstrukcja , UPDATElub DELETE , która ma wpływ na wiele wierszy.
Dotyczy magazynu w usłudze Microsoft Fabric.
ALTER TABLE nie może być częścią jawnej transakcji.
Zdarzenia rozszerzone (XEvents) dla przełącznika partycji
Następujące elementy XEvents są związane z ALTER TABLE ... SWITCH PARTITION i ponowne kompilowanie indeksu online.
- lock_request_priority_state
- process_killed_by_abort_blockers
- ddl_with_wait_at_low_priority
Dodawanie kolumn NOT NULL jako operacji online
W programie SQL Server 2012 (11.x) Enterprise edition i nowszych wersjach dodanie NOT NULL kolumny z wartością domyślną jest operacją online, gdy wartość domyślna jest stałą środowiska uruchomieniowego. Oznacza to, że operacja jest wykonywana niemal natychmiast pomimo liczby wierszy w tabeli, ponieważ istniejące wiersze w tabeli nie są aktualizowane podczas operacji. Zamiast tego wartość domyślna jest przechowywana tylko w metadanych tabeli, a wartość jest sprawdzana zgodnie z potrzebami w zapytaniach, które uzyskują dostęp do tych wierszy. To zachowanie jest automatyczne. Do zaimplementowania operacji online poza składnią nie jest wymagana żadna dodatkowa składnia ADD COLUMN . Stała środowiska uruchomieniowego to wyrażenie, które generuje tę samą wartość w czasie wykonywania dla każdego wiersza w tabeli, pomimo jego determinizmu. Na przykład wyrażenie "My temporary data"stałe lub funkcja GETUTCDATETIME() systemowa są stałymi środowiska uruchomieniowego. Natomiast funkcje NEWID() lub NEWSEQUENTIALID() nie są stałymi środowiska uruchomieniowego, ponieważ unikatowa wartość jest generowany dla każdego wiersza w tabeli.
NOT NULL Dodanie kolumny z wartością domyślną, która nie jest stałą środowiska uruchomieniowego, zawsze jest uruchamiana w trybie offline, a blokada na wyłączność (Sch-M) jest uzyskiwana przez czas trwania operacji.
Podczas gdy istniejące wiersze odwołują się do wartości przechowywanej w metadanych, wartość domyślna jest przechowywana w wierszu dla wszystkich nowo wstawionych wierszy i nie określa innej wartości dla kolumny. Wartość domyślna przechowywana w metadanych jest przenosina do istniejącego wiersza po zaktualizowaniu wiersza (nawet jeśli rzeczywista kolumna nie jest określona w UPDATE instrukcji) lub jeśli tabela lub indeks klastrowany zostanie ponownie skompilowany.
Kolumny typu varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography lub CLR zdefiniowane przez użytkownika typy nie mogą być dodawane w operacji online. Nie można dodać kolumny w trybie online, jeśli spowoduje to, że maksymalny możliwy rozmiar wiersza przekracza limit 8060 bajtów. W tym przypadku kolumna jest dodawana jako operacja w trybie offline.
Równoległe wykonywanie planu
W programie SQL Server 2012 (11.x) Enterprise edition i nowszych wersjach liczba procesorów używanych do uruchamiania pojedynczej ALTER TABLE ADD instrukcji (indeksu) CONSTRAINT lub DROP (indeks klastrowany) CONSTRAINT jest określana przez maksymalny stopień konfiguracji równoległości i bieżące obciążenie. Jeśli aparat bazy danych wykryje, że system jest zajęty, stopień równoległości operacji zostanie automatycznie zmniejszony przed rozpoczęciem wykonywania instrukcji. Można ręcznie skonfigurować liczbę procesorów używanych do uruchamiania instrukcji, określając MAXDOP opcję. Aby uzyskać więcej informacji, zobacz Konfiguracja serwera: maksymalny stopień równoległości.
Tabele partycjonowane
Oprócz wykonywania operacji SWITCH obejmujących tabele partycjonowane, użyj polecenia ALTER TABLE , aby zmienić stan kolumn, ograniczeń i wyzwalaczy tabeli partycjonowanej tak samo jak w przypadku tabel niepartycyjnych. Nie można jednak użyć tej instrukcji, aby zmienić sposób partycjonowania samej tabeli. Aby ponownie podzielić tabelę partycjonowaną, użyj ALTER PARTITION SCHEME i ALTER PARTITION FUNCTION. Ponadto nie można zmienić typu danych kolumny tabeli partycjonowanej.
Ograniczenia dotyczące tabel z widokami powiązanymi ze schematem
Ograniczenia stosowane do ALTER TABLE instrukcji w tabelach z widokami powiązanymi ze schematem są takie same jak ograniczenia stosowane obecnie podczas modyfikowania tabel za pomocą prostego indeksu. Dodawanie kolumny jest dozwolone. Jednak usunięcie lub zmiana kolumny, która uczestniczy w dowolnym widoku powiązanym ze schematem, nie jest dozwolona.
ALTER TABLE Jeśli instrukcja wymaga zmiany kolumny używanej w widoku powiązanym ze schematem, zakończy się niepowodzeniem, ALTER TABLE a aparat bazy danych zgłosi komunikat o błędzie. Aby uzyskać więcej informacji na temat powiązań schematu i widoków indeksowanych, zobacz CREATE VIEW.
Dodawanie lub usuwanie wyzwalaczy w tabelach bazowych nie ma wpływu na utworzenie widoku powiązanego ze schematem, który odwołuje się do tabel.
Indeksy i ALTER TABLE
Indeksy utworzone w ramach ograniczenia są porzucane po usunięciu ograniczenia. Indeksy, które zostały utworzone za pomocą CREATE INDEX polecenia , muszą zostać porzucone za pomocą polecenia DROP INDEX. Użyj instrukcji , ALTER INDEX aby ponownie skompilować część indeksu definicji ograniczenia. Ograniczenie nie musi zostać usunięte i dodane ponownie za pomocą ALTER TABLEpolecenia .
Przed usunięciem kolumny należy usunąć wszystkie indeksy i ograniczenia na podstawie kolumny.
Po usunięciu ograniczenia, które utworzyło indeks klastrowany, wiersze danych przechowywane na poziomie liści indeksu klastrowanego są przechowywane w tabeli nieklastrowanej. Indeks klastrowany można usunąć i przenieść wynikową tabelę do innej grupy plików lub schematu partycji w jednej transakcji, określając MOVE TO opcję. Opcja MOVE TO ma następujące ograniczenia:
MOVE TOnie jest prawidłowy dla indeksowanych widoków ani indeksów nieklastrowanych.Schemat partycji lub grupa plików musi już istnieć.
Jeśli
MOVE TOnie zostanie określona, tabela znajduje się w tym samym schemacie partycji lub grupie plików, co zostało zdefiniowane dla indeksu klastrowanego.
Po usunięciu indeksu klastrowanego określ ONLINE = ON opcję, aby DROP INDEX transakcja nie blokowała zapytań i modyfikacji danych bazowych i skojarzonych indeksów nieklastrowanych.
ONLINE = ON ma następujące ograniczenia:
-
ONLINE = ONnie jest prawidłowy dla indeksów klastrowanych, które są również wyłączone. Wyłączone indeksy muszą zostać usunięte przy użyciu poleceniaONLINE = OFF. - Jednocześnie można porzucić tylko jeden indeks.
-
ONLINE = ONnie jest prawidłowy dla indeksowanych widoków, indeksów nieklastrowanych ani indeksów w lokalnych tabelach tymczasowych. -
ONLINE = ONnie jest prawidłowy dla indeksów magazynu kolumn.
Tymczasowe miejsce na dysku równe rozmiarowi istniejącego indeksu klastrowanego jest wymagane do porzucenia indeksu klastrowanego. To dodatkowe miejsce jest zwalniane natychmiast po zakończeniu operacji.
Note
Opcje wymienione w sekcji <drop_clustered_constraint_option> dotyczą klastrowanych indeksów w tabelach i nie można ich stosować do indeksów klastrowanych w widokach lub indeksach nieklastrowanych.
Replikowanie zmian schematu
Po uruchomieniu ALTER TABLE w opublikowanej tabeli w programie SQL Server Publisher domyślnie ta zmiana jest propagowana do wszystkich subskrybentów programu SQL Server. Ta funkcja ma pewne ograniczenia. Można go wyłączyć. Aby uzyskać więcej informacji, zobacz Wprowadzanie zmian schematu w bazach danych publikacji.
Kompresja danych
Nie można włączyć tabel systemowych na potrzeby kompresji. Jeśli tabela jest stertą, operacja ponownego kompilowania dla ONLINE trybu jest pojedyncza wątkowa. Użyj OFFLINE trybu dla wielowątkowego operacji ponownego kompilowania stert. Aby uzyskać więcej informacji na temat kompresji danych, zobacz Kompresja danych.
Aby ocenić, jak zmiana stanu kompresji wpływa na tabelę, indeks lub partycję, użyj procedury składowanej systemu sp_estimate_data_compression_savings .
Następujące ograniczenia dotyczą tabel podzielonych na partycje:
- Nie można zmienić ustawienia kompresji pojedynczej partycji, jeśli tabela ma nieprzywiązane indeksy.
-
ALTER TABLE <table> REBUILD PARTITION... składnia ponownie kompiluje określoną partycję. -
ALTER TABLE <table> REBUILD WITH... składnia ponownie kompiluje wszystkie partycje.
Upuść ntekstowe kolumny
W przypadku porzucania kolumn przy użyciu przestarzałego typu danych ntext czyszczenie usuniętych danych odbywa się jako operacja serializowana we wszystkich wierszach. Oczyszczanie może wymagać dużego czasu. Po upuszczaniu kolumny ntext w tabeli z dużą częścią wierszy zaktualizuj najpierw kolumnę ntext do NULL wartości, a następnie upuść kolumnę. Tę opcję można uruchomić za pomocą operacji równoległych i znacznie przyspieszyć.
Ponowne kompilowanie indeksu online
Aby uruchomić instrukcję DDL dla ponownego kompilowania indeksu online, należy ukończyć wszystkie aktywne transakcje blokujące uruchomione w określonej tabeli. Po uruchomieniu ponownego kompilowania indeksu online wszystkie nowe transakcje, które są gotowe do uruchomienia w tej tabeli. Mimo że czas trwania blokady ponownego kompilowania indeksu online jest krótki, oczekiwanie na ukończenie wszystkich otwartych transakcji w danej tabeli i zablokowanie nowych transakcji może znacząco wpłynąć na przepływność. Może to spowodować spowolnienie lub przekroczenie limitu czasu obciążenia i znaczne ograniczenie dostępu do tabeli bazowej. Opcja WAIT_AT_LOW_PRIORITY umożliwia administratorom baz danych zarządzanie blokadami S i Sch-M blokadami wymaganymi do ponownego kompilowania indeksu online. We wszystkich trzech przypadkach: NONE, SELFi BLOCKERS, jeśli w czasie oczekiwania ((MAX_DURATION = n [minutes])) nie ma żadnych działań blokujących, ponowne kompilowanie indeksu online jest uruchamiane natychmiast bez oczekiwania i instrukcja DDL zostanie ukończona.
Obsługa zgodności
Instrukcja ALTER TABLE obsługuje tylko nazwy tabel dwuczęściowych (schema.object). W programie SQL Server określenie nazwy tabeli przy użyciu następujących formatów kończy się niepowodzeniem w czasie kompilacji z błędem 117.
server.database.schema.table.database.schema.table..schema.table
We wcześniejszych wersjach określ format server.database.schema.table zwrócił błąd 4902. Określanie formatu .database.schema.table lub format ..schema.table powiodło się.
Aby rozwiązać ten problem, usuń użycie czteroczęściowego prefiksu.
Permissions
Wymaga ALTER uprawnień w tabeli.
ALTER TABLE uprawnienia mają zastosowanie do obu tabel zaangażowanych w instrukcję ALTER TABLE SWITCH . Wszystkie przełączone dane dziedziczą zabezpieczenia tabeli docelowej.
Jeśli zdefiniowano kolumny w instrukcji ALTER TABLE jako typ środowiska uruchomieniowego języka wspólnego (CLR) zdefiniowanego przez użytkownika lub typ danych aliasu, REFERENCES wymagane jest uprawnienie do typu.
Dodanie lub zmodyfikowanie kolumny, która aktualizuje wiersze tabeli, wymaga UPDATE uprawnień do tabeli. Na przykład dodanie NOT NULL kolumny z wartością domyślną lub dodanie kolumny tożsamości, gdy tabela nie jest pusta.
Examples
Przykłady kodu w tym artykule używają przykładowej AdventureWorks2025 bazy danych lub AdventureWorksDW2025 , którą można pobrać ze strony głównej Przykłady programu Microsoft SQL Server i Projekty społeczności .
| Category | Polecane elementy składni |
|---|---|
| dodawanie kolumn i ograniczeń |
ADD; PRIMARY KEY z opcjami indeksu, rozrzednymi kolumnami i zestawami kolumn |
| usuwanie kolumn i ograniczeń | DROP |
| zmienianie definicji kolumny | zmień typ danych; zmień rozmiar kolumny; Sortowanie |
| zmienianie definicji tabeli |
DATA_COMPRESSION; SWITCH PARTITION; ; LOCK ESCALATION śledzenie zmian |
| wyłączanie i włączanie ograniczeń i wyzwalaczy |
CHECK; NO CHECK; ; ENABLE TRIGGERDISABLE TRIGGER |
| Operacje online | ONLINE |
| Przechowywanie wersji systemu | SYSTEM_VERSIONING |
Dodawanie kolumn i ograniczeń
Przykłady w tej sekcji przedstawiają dodawanie kolumn i ograniczeń do tabeli.
A. Dodawanie nowej kolumny
Poniższy przykład dodaje kolumnę, która zezwala na wartości null i nie zawiera wartości podanych za pomocą DEFAULT definicji. W nowej kolumnie każdy wiersz ma wartość NULL.
CREATE TABLE dbo.doc_exa (column_a INT);
GO
ALTER TABLE dbo.doc_exa
ADD column_b VARCHAR (20) NULL;
GO
B. Dodawanie kolumny z ograniczeniem
Poniższy przykład dodaje nową kolumnę z ograniczeniem 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. Dodawanie niezweryfikowanego ograniczenia CHECK do istniejącej kolumny
Poniższy przykład dodaje ograniczenie do istniejącej kolumny w tabeli. Kolumna ma wartość, która narusza ograniczenie. W związku z tym WITH NOCHECK służy do zapobiegania weryfikowaniu ograniczenia względem istniejących wierszy i umożliwienia dodania ograniczenia.
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. Dodawanie ograniczenia DOMYŚLNEgo do istniejącej kolumny
Poniższy przykład tworzy tabelę z dwiema kolumnami i wstawia wartość do pierwszej kolumny, a druga kolumna pozostaje .NULL Ograniczenie DEFAULT jest następnie dodawane do drugiej kolumny. Aby sprawdzić, czy wartość domyślna jest stosowana, kolejna wartość jest wstawiana do pierwszej kolumny, a tabela jest odpytywane.
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. Dodawanie kilku kolumn z ograniczeniami
W poniższym przykładzie dodano kilka kolumn z ograniczeniami zdefiniowanymi przy użyciu nowej kolumny. Pierwsza nowa kolumna ma właściwość IDENTITY. Każdy wiersz w tabeli ma nowe wartości przyrostowe w kolumnie tożsamości.
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. Dodawanie kolumny dopuszczanej do wartości null z wartościami domyślnymi
Poniższy przykład dodaje kolumnę dopuszczaną do wartości null z definicją DEFAULT i używa WITH VALUES do podawania wartości dla każdego istniejącego wiersza w tabeli. Jeśli WITH VALUES nie jest używany, każdy wiersz ma wartość NULL w nowej kolumnie.
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. Tworzenie ograniczenia KLUCZA PODSTAWOWEgo z opcjami kompresji indeksu lub danych
Poniższy przykład tworzy PRIMARY KEY ograniczenie PK_TransactionHistoryArchive_TransactionID i ustawia opcje FILLFACTOR, ONLINEi PAD_INDEX. Wynikowy indeks klastrowany ma taką samą nazwę jak ograniczenie.
Dotyczy: SQL Server i 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
Ten podobny przykład stosuje kompresję strony podczas stosowania klastrowanego klucza podstawowego.
USE AdventureWorks2022;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID
PRIMARY KEY CLUSTERED (TransactionID) WITH (DATA_COMPRESSION = PAGE);
GO
H. Dodawanie rozrzednej kolumny
W poniższych przykładach pokazano dodawanie i modyfikowanie rozrzednych kolumn w tabeli T1. Kod do utworzenia T1 tabeli jest następujący.
CREATE TABLE T1
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) SPARSE NULL,
C3 INT SPARSE NULL,
C4 INT
);
GO
Aby dodać dodatkową kolumnę rozrzedzną C5, wykonaj następującą instrukcję.
ALTER TABLE T1
ADD C5 CHAR (100) SPARSE NULL;
GO
Aby przekonwertować kolumnę C4 bez rozrzedu na kolumnę rozrzedliwą, wykonaj następującą instrukcję.
ALTER TABLE T1
ALTER COLUMN C4 ADD SPARSE;
GO
Aby przekonwertować kolumnę C4 rozrzednia na kolumnę nieparzystową, wykonaj następującą instrukcję.
ALTER TABLE T1
ALTER COLUMN C4 DROP SPARSE;
GO
I. Dodawanie zestawu kolumn
W poniższych przykładach pokazano dodawanie kolumny do tabeli T2. Nie można dodać zestawu kolumn do tabeli, która zawiera już rozrzedzona kolumny. Kod do utworzenia T2 tabeli jest następujący.
CREATE TABLE T2
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) NULL,
C3 INT NULL,
C4 INT
);
GO
Poniższe trzy instrukcje dodają zestaw kolumn o nazwie CS, a następnie zmodyfikuj kolumny C2 i C3 do 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. Dodawanie zaszyfrowanej kolumny
Poniższa instrukcja dodaje zaszyfrowaną kolumnę o nazwie 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. Dodawanie klucza podstawowego z operacją z możliwością wznowienia
Wznawiana operacja ALTER TABLE dodawania klucza podstawowego klastrowanego w kolumnie (a) z 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);
Usuwanie kolumn i ograniczeń
W przykładach w tej sekcji przedstawiono usuwanie kolumn i ograniczeń.
A. Usuwanie kolumny lub kolumn
Pierwszy przykład modyfikuje tabelę w celu usunięcia kolumny. Drugi przykład usuwa wiele kolumn.
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. Usuwanie ograniczeń i kolumn
Pierwszy przykład usuwa ograniczenie UNIQUE z tabeli. Drugi przykład usuwa dwa ograniczenia i jedną kolumnę.
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. Usuwanie ograniczenia KLUCZA PODSTAWOWEgo w trybie ONLINE
Poniższy przykład usuwa PRIMARY KEY ograniczenie z opcją ustawioną ONLINE na ON.
ALTER TABLE Production.TransactionHistoryArchive
DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID
WITH (ONLINE = ON);
GO
D. Dodawanie i usuwanie ograniczenia KLUCZA OBCEgo
Poniższy przykład tworzy tabelę ContactBackup, a następnie zmienia tabelę, najpierw dodając ograniczenie FOREIGN KEY odwołujące się do tabeli Person.Person, a następnie upuszczając ograniczenie 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;
Zmienianie definicji kolumny
A. Zmienianie typu danych kolumny
Poniższy przykład zmienia kolumnę tabeli 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. Zmienianie rozmiaru kolumny
Poniższy przykład zwiększa rozmiar kolumny varchar oraz precyzję i skalę kolumny dziesiętnej. Ponieważ kolumny zawierają dane, rozmiar kolumny można zwiększyć tylko. Zwróć również uwagę, że col_a jest definiowana w unikatowym indeksie. Rozmiar nadal można zwiększyć, col_a ponieważ typ danych jest varchar , a indeks nie jest wynikiem PRIMARY KEY ograniczenia.
-- 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. Zmienianie sortowania kolumn
W poniższym przykładzie pokazano, jak zmienić sortowanie kolumny. Najpierw tabela jest tworzona z domyślnym sortowaniem użytkownika.
CREATE TABLE T3
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) NULL,
C3 INT NULL,
C4 INT
);
GO
Następnie sortowanie kolumn C2 zostanie zmienione na Latin1_General_BIN. Typ danych jest wymagany, mimo że nie został zmieniony.
ALTER TABLE T3
ALTER COLUMN C2 VARCHAR (50) COLLATE Latin1_General_BIN;
GO
D. Szyfrowanie kolumny
W poniższym przykładzie pokazano, jak zaszyfrować kolumnę przy użyciu funkcji Always Encrypted z bezpiecznymi enklawami.
Najpierw tabela jest tworzona bez żadnych zaszyfrowanych kolumn.
CREATE TABLE T3
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) NULL,
C3 INT NULL,
C4 INT
);
GO
Następnie kolumna "C2" jest szyfrowana przy użyciu klucza szyfrowania kolumny o nazwie CEK1i losowego szyfrowania. Aby następująca instrukcja powiodła się:
- Klucz szyfrowania kolumny musi być włączony w enklawie. Oznacza to, że musi być zaszyfrowany przy użyciu klucza głównego kolumny (CMK), który umożliwia obliczenia enklawy.
- Docelowe wystąpienie programu SQL Server musi obsługiwać funkcję Always Encrypted z bezpiecznymi enklawami.
- Instrukcję należy wydać za pośrednictwem połączenia skonfigurowanego dla funkcji Always Encrypted z bezpiecznymi enklawami i przy użyciu obsługiwanego sterownika klienta.
- Aplikacja wywołująca musi mieć dostęp do klucza cmK, chroniąc
CEK1program .
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
Zmienianie definicji tabeli
W przykładach w tej sekcji pokazano, jak zmienić definicję tabeli.
A. Modyfikowanie tabeli w celu zmiany kompresji
Poniższy przykład zmienia kompresję tabeli niepartycyjnej. Sterta lub indeks klastrowany zostanie ponownie skompilowany. Jeśli tabela jest stertą, wszystkie indeksy nieklastrowane zostaną ponownie skompilowane.
ALTER TABLE T1 REBUILD
WITH (DATA_COMPRESSION = PAGE);
Poniższy przykład zmienia kompresję partycjonowanej tabeli. Składnia REBUILD PARTITION = 1 powoduje ponowne skompilowanie tylko 1 numerów partycji.
Dotyczy: SQL Server.
ALTER TABLE PartitionTable1 REBUILD PARTITION = 1
WITH (DATA_COMPRESSION = NONE);
GO
Ta sama operacja przy użyciu następującej alternatywnej składni powoduje ponowne skompilowanie wszystkich partycji w tabeli.
Dotyczy: SQL Server.
ALTER TABLE PartitionTable1 REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = PAGE ON PARTITIONS (1));
Aby uzyskać dodatkowe przykłady kompresji danych, zobacz Kompresja danych.
B. Modyfikowanie tabeli magazynu kolumn w celu zmiany kompresji archiwalnej
Poniższy przykład dodatkowo kompresuje partycję tabeli magazynu kolumn przez zastosowanie dodatkowego algorytmu kompresji. Ta kompresja zmniejsza tabelę do mniejszego rozmiaru, ale także zwiększa czas wymagany do przechowywania i pobierania. Jest to przydatne w przypadku archiwizacji lub sytuacji, które wymagają mniejszej ilości miejsca i mogą pozwolić na więcej czasu na przechowywanie i pobieranie.
Dotyczy: SQL Server 2014 (12.x) i nowsze wersje oraz Azure SQL Database.
ALTER TABLE PartitionTable1 REBUILD PARTITION = 1
WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);
GO
Poniższy przykład dekompresuje partycję tabeli magazynu kolumn, która została skompresowana z opcją COLUMNSTORE_ARCHIVE . Po przywróceniu danych będzie ona nadal kompresowana przy użyciu kompresji magazynu kolumn, która jest używana dla wszystkich tabel magazynu kolumn.
Dotyczy: SQL Server 2014 (12.x) i nowsze wersje oraz Azure SQL Database.
ALTER TABLE PartitionTable1 REBUILD PARTITION = 1
WITH (DATA_COMPRESSION = COLUMNSTORE);
GO
C. Przełączanie partycji między tabelami
Poniższy przykład tworzy tabelę partycjonowaną przy założeniu, że schemat partycji myRangePS1 został już utworzony w bazie danych. Następnie zostanie utworzona tabela bez partycji z taką samą strukturą jak tabela partycjonowana i w tej samej grupie plików co PARTITION 2 tabeli PartitionTable. Dane PARTITION 2 tabeli PartitionTable są następnie przełączane na tabelę 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. Zezwalaj na eskalację blokady w tabelach podzielonych na partycje
Poniższy przykład umożliwia eskalację blokady do poziomu partycji w tabeli partycjonowanej. Jeśli tabela nie jest partycjonowana, eskalacja blokady jest ustawiona na TABLE poziomie.
Dotyczy: SQL Server i Azure SQL Database.
ALTER TABLE dbo.T1 SET (LOCK_ESCALATION = AUTO);
GO
E. Konfigurowanie śledzenia zmian w tabeli
Poniższy przykład umożliwia śledzenie zmian w tabeli Person.Person.
Dotyczy: SQL Server i Azure SQL Database.
USE AdventureWorks2022;
ALTER TABLE Person.Person ENABLE CHANGE_TRACKING;
Poniższy przykład umożliwia śledzenie zmian i umożliwia śledzenie kolumn, które są aktualizowane podczas zmiany.
Dotyczy: SQL Server.
USE AdventureWorks2022;
GO
ALTER TABLE Person.Person ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON);
Poniższy przykład wyłącza śledzenie zmian w tabeli Person.Person.
Dotyczy: SQL Server i Azure SQL Database.
USE AdventureWorks2022;
GO
ALTER TABLE Person.Person DISABLE CHANGE_TRACKING;
Wyłączanie i włączanie ograniczeń i wyzwalaczy
A. Wyłączanie i ponowne włączanie ograniczenia
Poniższy przykład wyłącza ograniczenie ograniczające, które ogranicza wynagrodzenia akceptowane w danych.
NOCHECK CONSTRAINT jest używany z ALTER TABLE, aby wyłączyć ograniczenie i zezwalać na wstawianie, które zwykle naruszałoby ograniczenie.
CHECK CONSTRAINT ponownie włącza ograniczenie.
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. Wyłączanie i ponowne włączanie wyzwalacza
W poniższym przykładzie użyto opcji DISABLE TRIGGERALTER TABLE, aby wyłączyć wyzwalacz i zezwolić na wstawianie, które zwykle narusza wyzwalacz.
ENABLE TRIGGER następnie służy do ponownego włączania wyzwalacza.
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
Operacje online
A. Ponowne kompilowanie indeksu online przy użyciu opcji oczekiwania o niskim priorytcie
W poniższym przykładzie pokazano, jak wykonać ponowną kompilację indeksu online, określając opcje oczekiwania o niskim priorytekcie.
Dotyczy: SQL Server 2014 (12.x) i nowsze wersje oraz 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. Zmiana kolumny online
W poniższym przykładzie pokazano, jak uruchomić operację alter column z opcją ONLINE .
Dotyczy: SQL Server 2016 (13.x) i nowsze wersje oraz 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
Przechowywanie wersji systemu
Poniższe cztery przykłady ułatwiają zapoznanie się ze składnią używania wersji systemu. Aby uzyskać dodatkową pomoc, zobacz Wprowadzenie do tabel czasowych z wersjami systemowymi.
Dotyczy: SQL Server 2016 (13.x) i nowsze wersje oraz Azure SQL Database.
A. Dodawanie przechowywania wersji systemu do istniejących tabel
W poniższym przykładzie pokazano, jak dodać przechowywanie wersji systemu do istniejącej tabeli i utworzyć tabelę historii przyszłości. W tym przykładzie przyjęto założenie, że istnieje istniejąca tabela o nazwie InsurancePolicy z zdefiniowanym kluczem podstawowym. W tym przykładzie są wypełniane nowo utworzone kolumny okresu na potrzeby przechowywania wersji systemu przy użyciu wartości domyślnych dla czasów rozpoczęcia i zakończenia, ponieważ te wartości nie mogą mieć wartości null. W tym przykładzie użyto klauzuli HIDDEN w celu zapewnienia braku wpływu na istniejące aplikacje wchodzące w interakcję z bieżącą tabelą. Używa HISTORY_RETENTION_PERIOD również tej funkcji tylko w usłudze 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. Migrowanie istniejącego rozwiązania do korzystania z przechowywania wersji systemu
W poniższym przykładzie pokazano, jak przeprowadzić migrację do przechowywania wersji systemu z rozwiązania, które używa wyzwalaczy do naśladowania obsługi czasowej. W tym przykładzie przyjęto założenie, że istnieje istniejące rozwiązanie, które używa ProjectTask tabeli i ProjectTaskHistory tabeli dla istniejącego rozwiązania, które używa Changed Date kolumn i Revised Date dla okresów, że te kolumny okresu nie używają typu danych datetime2 i że ProjectTask tabela ma zdefiniowany klucz podstawowy.
-- 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. Wyłączanie i ponowne włączanie przechowywania wersji systemu w celu zmiany schematu tabeli
W tym przykładzie pokazano, jak wyłączyć przechowywanie wersji systemu w tabeli Department, dodać kolumnę i ponownie włączyć przechowywanie wersji systemu. Wyłączenie przechowywania wersji systemu jest wymagane do zmodyfikowania schematu tabeli. Wykonaj te kroki w ramach transakcji, aby zapobiec aktualizacjom obu tabel podczas aktualizowania schematu tabeli, co umożliwia administratorowi bazy danych pominięcie sprawdzania spójności danych podczas ponownego włączania przechowywania wersji systemu i uzyskania korzyści z wydajności. Zadania takie jak tworzenie statystyk, przełączanie partycji lub stosowanie kompresji do jednej lub obu tabel nie wymagają wyłączenia przechowywania wersji systemu.
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. Usuwanie przechowywania wersji systemu
W tym przykładzie pokazano, jak całkowicie usunąć przechowywanie wersji systemu z tabeli Dział i usunąć tabelę DepartmentHistory. Opcjonalnie możesz również usunąć kolumny okresów używane przez system do rejestrowania informacji o wersji systemu. Nie można usunąć Department lub tabel DepartmentHistory podczas włączania przechowywania wersji systemu.
ALTER TABLE Department
SET (SYSTEM_VERSIONING = OFF);
ALTER TABLE Department
DROP PERIOD FOR SYSTEM_TIME;
DROP TABLE DepartmentHistory;
Przykłady: Azure Synapse Analytics and Analytics Platform System (PDW)
W poniższych przykładach od A do C użyto tabeli FactResellerSales w bazie danych AdventureWorksPDW2022.
A. Określanie, czy tabela jest partycjonowana
Poniższe zapytanie zwraca co najmniej jeden wiersz, jeśli tabela FactResellerSales jest partycjonowana. Jeśli tabela nie jest partycjonowana, nie są zwracane żadne wiersze.
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. Określanie wartości granic dla tabeli partycjonowanej
Poniższe zapytanie zwraca wartości granic dla każdej partycji w tabeli 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. Określanie kolumny partycji dla tabeli partycjonowanej
Poniższe zapytanie zwraca nazwę kolumny partycjonowania dla FactResellerSales tabeli.
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. Scalanie dwóch partycji
Poniższy przykład scala dwie partycje w tabeli.
Tabela Customer ma następującą definicję:
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)
)
);
Następujące polecenie łączy granice partycji 10 i 25.
ALTER TABLE Customer MERGE RANGE (10);
Nowy DDL dla tabeli to:
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. Dzielenie partycji
Poniższy przykład dzieli partycję w tabeli.
Tabela Customer ma następujący kod 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)
)
);
Następujące polecenie tworzy nową partycję powiązaną z wartością 75 z zakresu od 50 do 100.
ALTER TABLE Customer SPLIT RANGE (75);
Nowy DDL dla tabeli to:
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. Przenoszenie partycji do tabeli historii za pomocą funkcji SWITCH
Poniższy przykład przenosi dane w partycji tabeli Orders do partycji w tabeli OrdersHistory.
Tabela Orders ma następujący kod 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')
)
);
W tym przykładzie tabela Orders ma następujące partycje. Każda partycja zawiera dane.
| Partition | Czy dane są? | Zakres granic |
|---|---|---|
| 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 |
- Partycja 1 (zawiera dane):
OrderDate < '2004-01-01' - Partycja 2 (zawiera dane):
'2004-01-01' <= OrderDate < '2005-01-01' - Partycja 3 (zawiera dane):
'2005-01-01' <= OrderDate< '2006-01-01' - Partycja 4 (zawiera dane):
'2006-01-01'<= OrderDate < '2007-01-01' - Partycja 5 (zawiera dane):
'2007-01-01' <= OrderDate
Tabela OrdersHistory zawiera następującą tabelę DDL, która zawiera identyczne kolumny i nazwy kolumn jako tabelę Orders. Oba są rozproszone skrótami w kolumnie 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')
)
);
Chociaż nazwy kolumn i kolumn muszą być takie same, granice partycji nie muszą być takie same. W tym przykładzie tabela OrdersHistory ma następujące dwie partycje, a obie partycje są puste:
- Partycja 1 (brak danych):
OrderDate < '2004-01-01' - Partycja 2 (pusta):
'2004-01-01' <= OrderDate
W przypadku poprzednich dwóch tabel następujące polecenie przenosi wszystkie wiersze z OrderDate < '2004-01-01' z tabeli Orders do tabeli OrdersHistory.
ALTER TABLE Orders SWITCH PARTITION 1 TO OrdersHistory PARTITION 1;
W związku z tym pierwsza partycja w Orders jest pusta, a pierwsza partycja w OrdersHistory zawiera dane. Tabele są teraz wyświetlane w następujący sposób:
tabela Orders
- Partycja 1 (pusta):
OrderDate < '2004-01-01' - Partycja 2 (zawiera dane):
'2004-01-01' <= OrderDate < '2005-01-01' - Partycja 3 (zawiera dane):
'2005-01-01' <= OrderDate< '2006-01-01' - Partycja 4 (zawiera dane):
'2006-01-01'<= OrderDate < '2007-01-01' - Partycja 5 (zawiera dane):
'2007-01-01' <= OrderDate
tabela OrdersHistory
- Partycja 1 (zawiera dane):
OrderDate < '2004-01-01' - Partycja 2 (pusta):
'2004-01-01' <= OrderDate
Aby wyczyścić tabelę Orders , możesz usunąć pustą partycję, scalając partycje 1 i 2 w następujący sposób:
ALTER TABLE Orders MERGE RANGE ('2004-01-01');
Po scaleniu tabela Orders ma następujące partycje:
tabela Orders
- Partycja 1 (zawiera dane):
OrderDate < '2005-01-01' - Partycja 2 (zawiera dane):
'2005-01-01' <= OrderDate< '2006-01-01' - Partycja 3 (zawiera dane):
'2006-01-01'<= OrderDate < '2007-01-01' - Partycja 4 (zawiera dane):
'2007-01-01' <= OrderDate
Załóżmy, że kolejny rok przechodzi i możesz zarchiwizować rok 2005. Pustą partycję można przydzielić dla roku 2005 w tabeli OrdersHistory, dzieląc pustą partycję w następujący sposób:
ALTER TABLE OrdersHistory SPLIT RANGE ('2005-01-01');
Po podzieleniu tabela OrdersHistory ma następujące partycje:
tabela OrdersHistory
- Partycja 1 (zawiera dane):
OrderDate < '2004-01-01' - Partycja 2 (pusta):
'2004-01-01' < '2005-01-01' - Partycja 3 (pusta):
'2005-01-01' <= OrderDate
Treści powiązane
- sys.tables
- sp_rename
- sp_help
- DANE ZDARZEŃ (Transact-SQL)
- CREATE TABLE (Transact-SQL)
- TABELA DROP (Transact-SQL)
- STOŁ OLTAROWY column_constraint (Transact-SQL)
- STOŁ ALTEROWY column_definition (Transact-SQL)
- ALTER TABLE definicja_kolumny_obliczanej (Transact-SQL)
- ALTER TABLE opcja_indeksu (Transact-SQL)
- STÓŁ OLTAROWY table_constraint (Transact-SQL)