Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Azure Synapse Analytics
Analiz Platformu Sistemi (PDW)
Microsoft Fabric'te
ambarMicrosoft Fabric'te SQL veritabanı
Sütunları ve kısıtlamaları değiştirerek, ekleyerek veya bırakarak tablo tanımını değiştirir.
ALTER TABLE ayrıca bölümleri yeniden atar ve yeniden oluşturur ya da kısıtlamaları ve tetikleyicileri devre dışı bırakır ve etkinleştirir.
Note
Şu anda Doku Ambarı'ndaki ALTER TABLE yalnızca kısıtlamalar ve null atanabilir sütunlar eklemek için desteklenmektedir. Bkz. Microsoft Fabric 'da Ambar içinSözdizimi.
Şu anda, Microsoft Fabric'teki SQL veritabanında bellek optimize edilmiş tablolar mevcut değildir.
için söz dizimi ALTER TABLE , disk tabanlı tablolar ve bellek için iyileştirilmiş tablolar için farklıdır. Sizi tablo türleriniz için uygun söz dizimi bloğuna ve uygun söz dizimi örneklerine doğrudan götürmek için aşağıdaki bağlantıları kullanın:
Disk tabanlı tablolar:
Bellek için iyileştirilmiş tablolar:
Söz dizimi kuralları hakkında daha fazla bilgi için bkz.
Disk tabanlı tablolar için söz dizimi
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 } )
}
Daha fazla bilgi için bkz:
- ALTER TABLE column_constraint
- ALTER TABLE column_definition
- TABLOYU computed_column_definition DEĞIŞTIR
- ALTER TABLE index_option
- ALTER TABLE tablo_kısıtlaması
Bellek için iyileştirilmiş tablolar için söz dizimi
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 ]
}
Azure Synapse Analytics ve Paralel Veri Ambarı söz dizimi
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
Azure Synapse Analytics'teki sunucusuz SQL havuzu yalnızca
Dokuda Ambar söz dizimi
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
Tablonun oluşturulduğu veritabanının adı.
schema_name
Tablonun ait olduğu şemanın adı.
table_name
Değiştirilecek tablonun adı. Tablo geçerli veritabanında değilse veya geçerli kullanıcının sahip olduğu şema tarafından kapsandıysa, veritabanını ve şemayı açıkça belirtmeniz gerekir.
ALTER SÜTUNU
Adlandırılmış sütunun değiştirileceği veya değiştirileceği belirtir.
Değiştirilen sütun şu şekilde olamaz:
Veri türü
zaman damgasına sahip bir sütun. ROWGUIDCOLTablo için.Hesaplanan sütun veya hesaplanan sütunda kullanılır.
deyimi tarafından
CREATE STATISTICSoluşturulan istatistiklerde kullanılır. Kullanıcıların başarılı olması için önceDROP STATISTICSistatistikleri bırakmak için çalışmasıALTER COLUMNgerekir. Kullanıcının tablo için oluşturduğu tüm istatistik ve istatistik sütunlarını almak için bu sorguyu çalıştırın.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
Sorgu iyileştiricisi tarafından otomatik olarak oluşturulan istatistikler tarafından
ALTER COLUMNotomatik olarak bırakılır.Veya
PRIMARY KEY[FOREIGN KEY] REFERENCESkısıtlamasında kullanılır.Veya
CHECKUNIQUEkısıtlamasında kullanılır. Ancak, bir veyaCHECKkısıtlamasındaUNIQUEkullanılan değişken uzunluklu sütunun uzunluğunu değiştirmeye izin verilir.Varsayılan bir tanım ile ilişkilendirildi. Ancak, veri türü değiştirilmiyorsa sütunun uzunluğu, duyarlığı veya ölçeği değiştirilebilir.
metin, ntextve resim sütunlarının veri türü yalnızca aşağıdaki yollarla değiştirilebilir:
- varchar(max),
nvarchar(max) veyaxml metin - ntextvarchar(max), nvarchar(max)veya xml
- varbinary(max) için görüntü
Bazı veri türü değişiklikleri verilerde değişikliğe neden olabilir. Örneğin,
Note
Bölümlenmiş tablonun sütununun veri türü değiştirilemez.
Sütun varchar, nvarcharveya varbinary veri türü değilse ve yeni boyut eski boyuta eşit veya ondan büyük değilse, dizine dahil edilen sütunların veri türü değiştirilemez.
Birincil anahtar kısıtlamasına dahil olan bir sütun olarak NOT NULLNULLdeğiştirilemez.
Always Encrypted kullanırken (güvenli kuşatmalar olmadan), değiştirilen sütun ile ENCRYPTED WITHşifrelenirse, veri türünü uyumlu bir veri türüyle (örneğin INTBIGINT, ) değiştirebilirsiniz, ancak şifreleme ayarlarını değiştiremezsiniz.
Always Encrypted'ı güvenli kuşatmalarla kullanırken, sütunu koruyan sütun şifreleme anahtarı (ve anahtarı değiştiriyorsanız yeni sütun şifreleme anahtarı) kapanım hesaplamalarını destekliyorsa (kapanım özellikli sütun ana anahtarlarıyla şifrelenir) herhangi bir şifreleme ayarını değiştirebilirsiniz. Ayrıntılar için bkz. Güvenli kuşatmalarla Always Encrypted.
Bir sütunu değiştirdiğinizde, Veritabanı Altyapısı sistem tablosuna bir satır ekleyerek ve önceki sütun değişikliğini bırakılan sütun olarak işaretleyerek her değişikliği izler. Bir sütunu çok fazla değiştirdiğiniz nadir durumlarda, Veritabanı Altyapısı kayıt boyutu sınırına ulaşabilir. Böyle bir durumda 511 veya 1708 hatası alırsınız. Bu hataları önlemek için, tablodaki kümelenmiş dizini düzenli aralıklarla yeniden derleyin veya sütun değişikliği sayısını azaltın.
column_name
Değiştirilecek, eklenecek veya bırakılacak sütunun adı. en fazla column_name 128 karakterdir. Yeni sütunlar için, zaman damgası veri türüyle oluşturulan sütunlar için column_name atlayabilirsiniz.
Note
Tablodaki tüm mevcut sütunlar değiştirildikten sonra yeni sütunlar eklenir.
[ type_schema_name. ] type_name
Değiştirilen sütunun yeni veri türü veya eklenen sütunun veri türü. Bölümlenmiş tabloların mevcut sütunları için type_name belirtemezsiniz. type_name aşağıdaki türlerden herhangi biri olabilir:
- SQL Server sistem veri türü.
- SQL Server sistem veri türünü temel alan diğer ad veri türü. Bir tablo tanımında
CREATE TYPEkullanılmadan önce deyimiyle diğer ad veri türleri oluşturursunuz. - .NET Framework kullanıcı tanımlı türü ve ait olduğu şema. Bir tablo tanımında
CREATE TYPEkullanılmadan önce deyimiyle kullanıcı tanımlı türler oluşturursunuz.
Değiştirilen bir sütunun type_name ölçütleri şunlardır:
- Önceki veri türü, yeni veri türüne örtük olarak dönüştürülebilir olmalıdır.
type_name zaman damgası olamaz. - ANSI_NULL için varsayılanlar her zaman açıktır
ALTER COLUMN; belirtilmezse sütun null atanabilir. -
ANSI_PADDINGdoldurma her zamanONiçindirALTER COLUMN. - Değiştirilen sütun bir kimlik sütunuysa, new_data_type kimlik özelliğini destekleyen bir veri türü olmalıdır.
- için
SET ARITHABORTgeçerli ayar yoksayılır.ALTER TABLEolarak ayarlanmışARITHABORTgibiONçalışır.
Note
yan tümcesi COLLATE belirtilmezse, bir sütunun veri türünü değiştirmek, veritabanının varsayılan harmanlamada harmanlama değişikliğine neden olur.
precision
Belirtilen veri türü için duyarlık. Geçerli duyarlık değerleri hakkında daha fazla bilgi için bkz . Duyarlık, ölçek ve uzunluk.
scale
Belirtilen veri türü için ölçek. Geçerli ölçek değerleri hakkında daha fazla bilgi için bkz . Duyarlık, ölçek ve uzunluk.
max
Yalnızca varchar, nvarcharve 2^31-1 bayt karakter, ikili veri ve Unicode verilerini depolamak için varbinary veri türleri için geçerlidir.
xml_schema_collection
Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.
Yalnızca xml şemasını türle ilişkilendirmek için xml veri türü için geçerlidir. Bir şema koleksiyonuna xml sütunu yazmadan önce, CREATE XML SCHEMA COLLECTIONkullanarak veritabanında şema koleksiyonunu oluşturursunuz.
HARMANLAMA <collation_name>
Değiştirilen sütun için yeni harmanlamayı belirtir. Belirtilmezse, sütuna veritabanının varsayılan harmanlaması atanır. Harmanlama adı bir Windows harmanlama adı veya SQL harmanlama adı olabilir. Liste ve daha fazla bilgi için bkz. Windows harmanlama adı ve SQL Server Harmanlama Adı.
COLLATE yan tümcesi yalnızca char, varchar, nchar ve nvarchar veri türlerinin sütunlarının harmanlamalarını değiştirir. Kullanıcı tanımlı diğer ad veri türü sütununun harmanlamasını değiştirmek için ayrı deyimler kullanarak ALTER TABLE sütunu bir SQL Server sistem veri türüne değiştirin. Ardından harmanlamasını değiştirin ve sütunu bir diğer ad veri türüne geri döndürin.
ALTER COLUMN aşağıdaki koşullardan biri veya daha fazlası mevcutsa harmanlama değişikliği olamaz:
- Kısıtlama
CHECK,FOREIGN KEYkısıtlama veya hesaplanan sütunlar değiştirilen sütuna başvurur. - Sütunda tüm dizinler, istatistikler veya tam metin dizinleri oluşturulur. Sütun harmanlaması değiştirilirse, değiştirilen sütunda otomatik olarak oluşturulan istatistikler bırakılır.
- Şemaya bağlı bir görünüm veya işlev sütuna başvurur.
Desteklenen harmanlamalar hakkında daha fazla bilgi için bkz. COLLATE .
NULL | NOT NULL
Sütunun null değerleri kabul edip etmeyeceğini belirtir. Null değerlere izin vermeyen sütunlar, yalnızca varsayılan olarak belirtilmişse veya tablo boşsa ile ALTER TABLE eklenir. Hesaplanan sütunlar için yalnızca öğesini de belirttiyseniz belirtebilirsiniz NOT NULLPERSISTED. Yeni sütun null değerlere izin veriyorsa ve varsayılan değer belirtmezseniz, yeni sütun tablodaki her satır için bir null değer içerir. Yeni sütun null değerlere izin veriyorsa ve yeni sütunla varsayılan bir tanım eklerseniz, varsayılan değeri tablodaki mevcut her satır için yeni sütunda depolamak için kullanabilirsiniz WITH VALUES .
Yeni sütun null değerlere izin vermiyorsa ve tablo boş değilse, yeni sütunla bir DEFAULT tanım eklemeniz gerekir. Ayrıca yeni sütun, mevcut her satırdaki yeni sütunlarda varsayılan değerle otomatik olarak yüklenir.
kısıtlamalarındaki NULL sütunlar dışında, bir ALTER COLUMN sütunu null değerlere izin verecek şekilde zorlamak için öğesini NOT NULL belirtebilirsinizPRIMARY KEY. içinde NOT NULL yalnızca sütun null değer içermiyorsa belirtebilirsinizALTER COLUMN. Null değerlere izin verilmeden önce ALTER COLUMNNOT NULL bir değere güncelleştirilmelidir, örneğin:
UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL;
ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR (20) NOT NULL;
veya CREATE TABLE deyimleriyle ALTER TABLE tablo oluşturduğunuzda veya değiştirdiğinizde, veritabanı ve oturum ayarları sütun tanımında kullanılan veri türünün null atanabilirliğini etkiler ve geçersiz kılar. Bir sütunu her zaman veya uyumsuz sütunlar NULLNOT NULL için açıkça tanımladığınızdan emin olun.
Kullanıcı tanımlı veri türüne sahip bir sütun eklerseniz, sütunu kullanıcı tanımlı veri türüyle aynı null atanabilirlikle tanımladığınızdan emin olun. Ayrıca, sütun için varsayılan bir değer belirtin. Daha fazla bilgi için bkz. CREATE TABLE
Note
veya NULL ile NOT NULLbelirtilirse ALTER COLUMNnew_data_type [(duyarlık [, ölçek ])] de belirtilmelidir. Veri türü, duyarlık ve ölçek değiştirilmezse geçerli sütun değerlerini belirtin.
[ {ADD | DÜŞER} ROWGUIDCOL ]
Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.
Özelliğin belirtilen sütuna ROWGUIDCOL eklendiğini veya bırakıldığını belirtir.
ROWGUIDCOL sütunun bir satır GUID sütunu olduğunu gösterir. Tablo başına sütun olarak yalnızca bir ROWGUIDCOL sütun ayarlayabilirsiniz. Ayrıca, özelliğini yalnızca ROWGUIDCOL sütununa atayabilirsiniz. Kullanıcı tanımlı veri türündeki bir sütuna atayamazsınız ROWGUIDCOL .
ROWGUIDCOL sütunda depolanan değerlerin benzersizliğini zorlamaz ve tabloya eklenen yeni satırlar için otomatik olarak değer oluşturmaz. Her sütun için benzersiz değerler oluşturmak için NEWID() deyimlerinde NEWSEQUENTIALID() veya INSERT işlevini kullanın. Ya da sütun için varsayılan olarak NEWID() veya NEWSEQUENTIALID() işlevini belirtin.
[ {ADD | DROP} KALıCı ]
Özelliğin belirtilen sütuna PERSISTED eklendiğini veya bırakıldığını belirtir. Sütun, belirlenici bir ifadeyle tanımlanan hesaplanan bir sütun olmalıdır. olarak PERSISTEDbelirtilen sütunlar için Veritabanı Altyapısı hesaplanan değerleri tabloda fiziksel olarak depolar ve hesaplanan sütunun bağımlı olduğu diğer sütunlar güncelleştirildiğinde değerleri güncelleştirir. Hesaplanan sütunu olarak PERSISTEDişaretleyerek, belirlenici ancak kesin olmayan ifadelerde tanımlanan hesaplanan sütunlarda dizinler oluşturabilirsiniz. Daha fazla bilgi için bkz. Hesaplanan sütunlardaki dizinler.
SET QUOTED_IDENTIFIER hesaplanan sütunlarda veya dizinlenmiş görünümlerde dizin oluştururken veya değiştirirken olmalıdır ON . Daha fazla bilgi için bkz. set QUOTED_IDENTIFIER
Bölümlenmiş tablonun bölümleme sütunu olarak kullanılan tüm hesaplanan sütunlar açıkça işaretlenmelidir PERSISTED.
Note
Fabric SQL veritabanında hesaplanan sütunlara izin verilir, ancak şu anda Fabric OneLake'e yansıtılamaz.
ÇOĞALTMA IÇIN BıRAKMA
Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.
Çoğaltma aracıları ekleme işlemleri gerçekleştirdiğinde kimlik sütunlarında değerlerin artırıldığını belirtir. Bu yan tümceyi yalnızca column_name bir kimlik sütunuysa belirtebilirsiniz.
SPARSE
Sütunun seyrek bir sütun olduğunu gösterir. Seyrek sütunların depolanması null değerler için iyileştirilmiştir. Seyrek sütunları olarak NOT NULLayarlayamazsınız. Bir sütunu seyrekten seyrek olmayana veya seyrek olmayandan seyrek olarak dönüştürdüğünüzde, bu seçenek tabloyu komut yürütme süresi boyunca kilitler. Herhangi bir alan tasarrufunu geri kazanmak için yan tümcesini REBUILD kullanmanız gerekebilir. Seyrek sütunlar hakkında ek kısıtlamalar ve daha fazla bilgi için bkz. Seyrek sütunları kullanma.
ŞUNUNLA MASKELENDİ EKLE ( İŞLEV = 'mask_function')
Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri ve Azure SQL Veritabanı.
Dinamik bir veri maskesi belirtir. mask_function, uygun parametrelerle maskeleme işlevinin adıdır. Üç işlev kullanılabilir:
- default()
- email()
- partial()
- random()
İzin gerektirir ALTER ANY MASK .
Maskeyi bırakmak için DROP MASKEDkullanın. İşlev parametreleri için bkz . Dinamik veri maskeleme.
İzin gerektiren ALTER ANY MASK bir maske ekleyin ve bırakın.
WITH ( ONLINE = ON | KAPALI) <bir sütun> değiştirme için geçerlidir
Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri ve Azure SQL Veritabanı.
Tablo kullanılabilir durumdayken birçok değişiklik sütunu eyleminin gerçekleştirilmesini sağlar. Varsayılan değer OFF. Veri türü, sütun uzunluğu veya duyarlık, null atanabilirlik, seyreklik ve harmanlama ile ilgili sütun değişiklikleri için alter sütununu çevrimiçi olarak çalıştırabilirsiniz.
Çevrimiçi alter sütunu, kullanıcı tarafından oluşturulan ve otomatik durumsal yöntemlerin işlem süresi boyunca değiştirilen sütuna başvurmasını sağlar ve bu da sorguların ALTER COLUMN her zamanki gibi çalışmasını sağlar. İşlemin sonunda sütuna başvuran otomatik istatistikler bırakılır ve kullanıcı tarafından oluşturulan istatistikler geçersiz kılınmış olur. Kullanıcı, işlem tamamlandıktan sonra kullanıcı tarafından oluşturulan istatistikleri el ile güncelleştirmelidir. Sütun herhangi bir istatistik veya dizin için bir filtre ifadesinin parçasıysa, sütun değiştirme işlemi gerçekleştiremezsiniz.
Çevrimiçi değişiklik sütunu işlemi çalışırken, bu sütuna bağlı olabilecek tüm DDL işlemleri (dizinler, görünümler vb. oluşturma veya değiştirme gibi) engellenir veya uygun bir hatayla başarısız olur. Bu davranış, işlem çalışırken ortaya konan bağımlılıklar nedeniyle çevrimiçi alter sütununun başarısız olmayacağı garanti eder.
Bir sütunun
NOT NULLolarak değiştirilmesi, değiştirilen sütunaNULLkümelenmemiş dizinler tarafından başvurulduğunda çevrimiçi bir işlem olarak desteklenmez.Bir denetim kısıtlaması tarafından sütuna başvurulduğunda ve işlem sütunun
ALTERduyarlığı (ALTERveya tarih saat) kısıtlandığında çevrimiçi desteklenmez.WAIT_AT_LOW_PRIORITYseçeneği çevrimiçi alter sütunuyla kullanılamaz.ALTER COLUMN ... ADD/DROP PERSISTEDçevrimiçi alter sütunu için desteklenmez.ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATIONçevrimiçi alter sütunundan etkilenmez.Çevrimiçi alter sütunu, değişiklik izlemenin etkinleştirildiği veya birleştirme çoğaltmasının yayımcısı olan bir tablonun değiştirilmesini desteklemez.
Çevrimiçi alter sütunu, CLR veri türlerinden veya clr veri türlerine değiştirmeyi desteklemez.
Çevrimiçi alter sütunu, geçerli şema koleksiyonundan farklı bir şema koleksiyonuna sahip bir XML veri türünde değiştirmeyi desteklemez.
Çevrimiçi değişiklik sütunu, sütunun ne zaman değiştirilebileceğiyle ilgili kısıtlamaları azaltmaz. Dizine/istatistiklere göre başvurular vb. değişikliğin başarısız olmasına neden olabilir.
Çevrimiçi alter sütunu, birden fazla sütunun eşzamanlı olarak değiştirilmesini desteklemez.
Çevrimiçi alter sütunu, sistem sürümüne sahip bir zamana bağlı tabloda hiçbir etkiye sahip değildir.
ALTERsütunu, seçenek içinONLINEhangi değerin belirtildiğinden bağımsız olarak çevrimiçi olarak çalıştırılamaz.
Çevrimiçi alter sütunu, aşağıdakiler dahil çevrimiçi dizin yeniden derlemesi ile benzer gereksinimlere, kısıtlamalara ve işlevlere sahiptir:
- Tablo eski LOB veya dosya akışı sütunları içerdiğinde veya tabloda columnstore dizini olduğunda çevrimiçi dizin yeniden oluşturma desteklenmez. Aynı sınırlamalar çevrimiçi alter sütunu için de geçerlidir.
- Değiştirilmekte olan mevcut bir sütun, özgün sütun ve yeni oluşturulan gizli sütun için iki kat alan ayırma gerektirir.
- Bir değişiklik sütunu çevrimiçi işlemi sırasındaki kilitleme stratejisi, çevrimiçi dizin derlemesi için kullanılan aynı kilitleme desenini izler.
CHECK ILE | NOCHECK ILE
Tablodaki verilerin yeni eklenen veya yeniden etkinleştirilen FOREIGN KEYCHECK ya da kısıtlamaya göre doğrulanıp doğrulanmayacağını belirtir. Belirtmezseniz, WITH CHECK yeni kısıtlamalar için kabul edilir ve WITH NOCHECK yeniden etkinleştirilen kısıtlamalar için varsayılır.
Yeni CHECK verileri veya FOREIGN KEY mevcut verilerle ilgili kısıtlamaları doğrulamak istemiyorsanız kullanın WITH NOCHECK. Nadir durumlar dışında bunu yapmanızı önermiyoruz. Yeni kısıtlama sonraki tüm veri güncelleştirmelerinde değerlendirilir. Kısıtlama eklendiğinde tarafından WITH NOCHECK gizlenen kısıtlama ihlalleri, satırları kısıtlamaya uymayan verilerle güncelleştirdiklerinde gelecekteki güncelleştirmelerin başarısız olmasına neden olabilir. Sorgu iyileştiricisi tanımlanan WITH NOCHECKkısıtlamaları dikkate almaz. Bu tür kısıtlamalar ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALLkullanılarak yeniden etkinleştirilene kadar yoksayılır. Daha fazla bilgi için bkz. INSERT ve UPDATE deyimleriyle yabancı anahtar kısıtlamalarını devre dışı bırakma.
ALTER INDEX index_name
index_name için demet sayısının değiştirileceği veya değiştirileceği belirtir.
Söz dizimi ALTER TABLE ... ADD/DROP/ALTER INDEX yalnızca bellek için iyileştirilmiş tablolar için desteklenir.
Important
Deyimi ALTER TABLE kullanılmadan CREATE INDEX, DROP INDEX, ALTER INDEX ve PAD_INDEX deyimleri bellek için iyileştirilmiş tablolardaki dizinler için desteklenmez.
ADD
Bir veya daha fazla sütun tanımının, hesaplanan sütun tanımının veya tablo kısıtlamasının eklendiğini belirtir. Ya da sistemin sistem sürümü oluşturma için kullandığı sütunlar eklenir. Bellek için iyileştirilmiş tablolar için dizin ekleyebilirsiniz.
Note
Tablodaki tüm mevcut sütunlar değiştirildikten sonra yeni sütunlar eklenir.
Important
Deyimi ALTER TABLE kullanılmadan CREATE INDEX, DROP INDEX, ALTER INDEX ve PAD_INDEX deyimleri bellek için iyileştirilmiş tablolardaki dizinler için desteklenmez.
SYSTEM_TIME DÖNEMİ ( system_start_time_column_name, system_end_time_column_name )
Şunlar için geçerlidir: SQL Server 2017 (14.x) ve sonraki sürümleri ve Azure SQL Veritabanı.
Sistemin bir kaydın geçerli olduğu süreyi kaydetmek için kullandığı sütunların adlarını belirtir. Var olan sütunları belirtebilir veya bağımsız değişkenin ADD PERIOD FOR SYSTEM_TIME bir parçası olarak yeni sütunlar oluşturabilirsiniz.
Sütunları datetime2 veri türüyle ayarlayın ve olarak NOT NULLtanımlayın. Nokta sütununu olarak NULLtanımlarsanız, hata sonucu verir.
bir column_constraint tanımlayabilir ve/veya system_start_time ve system_end_time sütunları için sütunlar için varsayılan değerleri belirtebilirsiniz. Aşağıdaki Sistem Sürümü Oluşturma örneklerinde system_end_time sütunu için varsayılan değerin kullanılmasını gösteren Örnek A'ya bakın.
Var olan bir tabloyu zamansal tablo yapmak için bu bağımsız değişkeni bağımsız değişkenle SET SYSTEM_VERSIONING birlikte kullanın. Daha fazla bilgi için bkz . Geçici tablolar ve Geçici tabloları kullanmaya başlama.
SQL Server 2017 (14.x) itibarıyla kullanıcılar, sütunlar için değer döndürmeyen bu sütunları örtük olarak gizlemek için bir veya iki nokta sütununu HIDDEN bayrakla SELECT * FROM <table_name> işaretleyebilir. Varsayılan olarak nokta sütunları gizli değildir. Kullanılabilmesi için, gizli sütunların doğrudan zamana bağlı tabloya başvuran tüm sorgulara açıkça dahil edilmesi gerekir.
DROP
Bir veya daha fazla sütun tanımının, hesaplanan sütun tanımlarının veya tablo kısıtlamalarının bırakıldığını veya sistemin sistem sürümü oluşturma için kullandığı sütunların belirtimini bırakıldığını belirtir.
Note
Kayıt defteri tablolarında bırakılan sütunlar yalnızca geçici olarak silinir. Bırakılan sütun kayıt defteri tablosunda kalır, ancak içindeki sütunu olarak ayarlanarak dropped_ledger_table bırakılan sütun sys.tables1olarak işaretlenir. Bırakılan kayıt defteri tablosunun genel muhasebe görünümü, dropped_ledger_view'daki sys.tables sütunu 1olarak ayarlanarak bırakıldı olarak da işaretlenir. Bırakılan bir kayıt defteri tablosu, geçmiş tablosu ve kayıt defteri görünümü bir ön ek eklenerek (MSSQL_DroppedLedgerTable, MSSQL_DroppedLedgerHistory, MSSQL_DroppedLedgerView) ve özgün ada guid eklenerek yeniden adlandırılır.
KISITLAMA constraint_name
constraint_name tablodan kaldırıldığını belirtir. Birden çok kısıtlama listelenebilir.
sys.check_constraint, sys.default_constraints, sys.key_constraintsve sys.foreign_keys katalog görünümlerini sorgulayarak kısıtlamanın kullanıcı tanımlı veya sistem tarafından sağlanan adını belirleyebilirsiniz.
PRIMARY KEY Tabloda bir XML dizini varsa kısıtlama bırakılamaz.
İNDİS index_name
index_name tablodan kaldırıldığını belirtir.
...ALTER TABLEADD/DROP/söz dizimi ALTER INDEX yalnızca bellek için iyileştirilmiş tablolar için desteklenir.
Important
Deyimi ALTER TABLE kullanılmadan CREATE INDEX, DROP INDEX, ALTER INDEX ve PAD_INDEX deyimleri bellek için iyileştirilmiş tablolardaki dizinler için desteklenmez.
SÜTUN column_name
constraint_name veya column_name tablodan kaldırıldığını belirtir. Birden çok sütun listelenebilir.
Sütun şu durumlarda bırakılamaz:
- Anahtar sütun olarak veya bir dizinde kullanılır
INCLUDE - ,
CHECKFOREIGN KEY,UNIQUEveyaPRIMARY KEYkısıtlamasında kullanılır. - anahtar sözcüğüyle tanımlanan veya varsayılan nesneye
DEFAULTbağlı bir varsayılan değerle ilişkilendirildi. - Bir kurala bağlı.
Note
Sütunun düşmesi sütunun disk alanını geri kazanmaz. Bir tablonun satır boyutu sınırına yaklaştığında veya aşıldığında bırakılan sütunun disk alanını geri kazanmanız gerekebilir. tabloda kümelenmiş dizin oluşturarak veya ALTER INDEXkullanarak mevcut kümelenmiş dizini yeniden oluşturarak alanı geri kazanabilirsiniz. LOB veri türlerini bırakmanın etkisi hakkında bilgi için bu CSS blog girdisinebakın.
SYSTEM_TIME DÖNEMİ
Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri ve Azure SQL Veritabanı.
Sistemin sistem sürümü oluşturma için kullandığı sütunların belirtimini bırakır.
ILE <drop_clustered_constraint_option>
Bir veya daha fazla bırakma kümelenmiş kısıtlama seçeneğinin ayarlandığını belirtir.
MAXDOP = max_degree_of_parallelism
Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.
maksimum paralellik derecesi yapılandırma seçeneğini yalnızca işlem süresi boyunca geçersiz kılar. Daha fazla bilgi için bkz . Sunucu yapılandırması: maksimum paralellik derecesi.
MAXDOP Paralel plan yürütmede kullanılan işlemci sayısını sınırlamak için seçeneğini kullanın. Maksimum değer 64 işlemcidir.
max_degree_of_parallelism aşağıdaki değerlerden biri olabilir:
1Paralel plan oluşturmayı bastırır.
>1Paralel dizin işleminde kullanılan en fazla işlemci sayısını belirtilen sayıyla kısıtlar.
0(varsayılan)Geçerli sistem iş yüküne göre gerçek işlemci sayısını veya daha azını kullanır.
Daha fazla bilgi için bkz. Paralel Dizin İşlemlerini Yapılandırma.
Note
Paralel dizin işlemleri SQL Server'ın her sürümünde kullanılamaz. Daha fazla bilgi için bkz. sql server 2022
ÇEVRİmİÇİ = { ON | OFF } <drop_clustered_constraint_option> için geçerlidir
Dizin işlemi sırasında sorgular ve veri değişikliği için temel tabloların ve ilişkili dizinlerin kullanılabilir olup olmadığını belirtir. Varsayılan değer: OFF. İşlem olarak REBUILD çalıştırabilirsinizONLINE.
ON
Uzun süreli tablo kilitleri dizin işlemi boyunca tutulmaz. Dizin işleminin ana aşamasında, kaynak tabloda yalnızca bir Amaç Paylaşımı (
IS) kilidi tutulur. Bu davranış, temel alınan tablo ve dizinlerde sorguların veya güncelleştirmelerin devam etmelerini sağlar. İşlemin başlangıcında, kaynak nesnede kısa bir süre için Paylaşılan (S) kilidi tutulur. İşlemin sonunda, kümelenmemiş bir dizin oluşturulursa kaynakta kısa bir süre için bir S (Paylaşılan) kilidi alınır. Öte yandan, kümelenmiş dizin çevrimiçi oluşturulduğunda veya bırakıldığında ve kümelenmiş veya kümelenmemiş bir dizin yeniden oluşturulduğunda bir Sch-M (Şema Değişikliği) kilidi alınır.ONLINEyerel geçici tabloda bir dizin oluşturulurken olarak ayarlanamazON. Yalnızca tek iş parçacıklı yığın yeniden derleme işlemine izin verilir.DDL'yi veya çevrimiçi dizin yeniden derlemesini çalıştırmak için
SWITCH, belirli bir tabloda çalışan tüm etkin engelleme işlemlerinin tamamlanması gerekir. YürütülürkenSWITCHveya yeniden oluşturma işlemi yeni işlemlerin başlatılmasını engeller ve iş yükü aktarım hızını önemli ölçüde etkileyebilir ve temel tabloya erişimi geçici olarak geciktirebilir.OFF
Tablo kilitleri dizin işleminin süresi için geçerlidir. Kümelenmiş dizini oluşturan, yeniden derleyen veya düşüren ya da kümelenmemiş bir dizini yeniden oluşturan veya düşüren, tabloda şema değişikliği (Sch-M) kilidi alan çevrimdışı dizin işlemi. Bu kilit, işlem süresi boyunca temel alınan tabloya tüm kullanıcı erişimini engeller. Kümelenmemiş dizin oluşturan çevrimdışı dizin işlemi, tabloda Paylaşılan (S) kilidi alır. Bu kilit, temel tablo güncelleştirmelerini engeller, ancak deyimler gibi
SELECTokuma işlemlerine izin verir. Çok iş parçacıklı yığın yeniden derleme işlemlerine izin verilir.Daha fazla bilgi için bkz. Çevrimiçi dizin işlemleri nasıl çalışır?
Note
Çevrimiçi dizin işlemleri SQL Server'ın her sürümünde kullanılamaz. Daha fazla bilgi için bkz. sql server 2022
sürümleri ve desteklenen özellikleri.
{ partition_scheme_name(column_name [ ,...n ] ) | dosya grubu | "default" }
Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.
Veri satırlarını kümelenmiş dizinin yaprak düzeyinde taşımak için bir konum belirtir. Tablo yeni konuma taşınır. Bu seçenek yalnızca kümelenmiş dizin oluşturan kısıtlamalar için geçerlidir.
Note
Bu bağlamda anahtar default sözcük değildir. Varsayılan dosya grubu için bir tanımlayıcıdır ve veya MOVE TO "default"içinde MOVE TO [default] olduğu gibi sınırlandırılmalıdır. belirtilirse "default" , QUOTED_IDENTIFIER seçeneği geçerli oturum için olmalıdır ON . Bu varsayılan ayardır. Daha fazla bilgi için bkz. set QUOTED_IDENTIFIER
{ CHECK | NOCHECK } KıSıTLAMASı
constraint_name etkinleştirildiğini veya devre dışı bırakıldığını belirtir. Bu seçenek yalnızca ve FOREIGN KEY kısıtlamalarıyla CHECK kullanılabilir. Belirtildiğinde NOCHECK kısıtlama devre dışı bırakılır ve sütuna gelecek eklemeler veya güncelleştirmeler kısıtlama koşullarına göre doğrulanmaz.
DEFAULT, PRIMARY KEYve UNIQUE kısıtlamaları devre dışı bırakılamaz.
ALL
Tüm kısıtlamaların seçeneğiyle
NOCHECKdevre dışı bırakıldığını veya seçeneğiyleCHECKetkinleştirildiğini belirtir.
{ ETKİnLEŞTİr | DISABLE } TETIKLEYICISI
trigger_name etkinleştirildiğini veya devre dışı bırakıldığını belirtir. Tetikleyici devre dışı bırakıldığında, tablo için tanımlanmaya devam eder. Ancak, , INSERTveya UPDATE deyimleri tabloda çalıştırıldığında DELETEtetikleyicideki eylemler tetikleyici yeniden etkinleştirilene kadar gerçekleştirilemez.
ALL
Tablodaki tüm tetikleyicilerin etkinleştirildiğini veya devre dışı bırakıldığını belirtir.
trigger_name
Devre dışı bırakacak veya etkinleştirecek tetikleyicinin adını belirtir.
{ ETKİnLEŞTİr | DISABLE } CHANGE_TRACKING
Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.
Değişiklik izlemenin tablo için devre dışı bırakılıp etkinleştirilmediğini belirtir. Varsayılan olarak, değişiklik izleme devre dışıdır.
Bu seçenek yalnızca veritabanı için değişiklik izleme etkinleştirildiğinde kullanılabilir. Daha fazla bilgi için bkz. ALTER DATABASE SET options.
Değişiklik izlemeyi etkinleştirmek için tablonun birincil anahtarı olmalıdır.
ILE ( TRACK_COLUMNS_UPDATED = { ÜZERINDE | KAPALI } )
Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.
İzlenen sütunların güncelleştirildiği Veritabanı Altyapısı'nın izlenip izlenmediğini belirtir. Varsayılan değer OFF.
[ BÖLÜM source_partition_number_expression ] ÖĞESINI [ schema_nameOLARAK DEĞIŞTIRIN. ] target_table [ BÖLÜM target_partition_number_expression ]
Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.
Veri bloğunu aşağıdaki yollardan biriyle değiştirir:
- Bir tablonun tüm verilerini bölüm olarak zaten var olan bir bölümlenmiş tabloya yeniden atayın.
- Bölümlenmiş bir tablodan diğerine bölüm değiştirir.
- Bölümlenmiş tablonun bir bölümündeki tüm verileri mevcut bölümlenmemiş bir tabloya yeniden atayın.
tablo bölümlenmiş bir tabloysa, source_partition_number_expressionbelirtmeniz gerekir. target_table bölümlenmişse, target_partition_number_expressionbelirtmeniz gerekir. Bir tablonun verilerini zaten var olan bir bölümlenmiş tabloya bölüm olarak yeniden atadığınızda veya bölümlenmiş bir tablodan diğerine geçtiğinde, hedef bölüm mevcut olmalı ve boş olmalıdır.
Tek bir tablo oluşturmak için bir bölümün verilerini yeniden atadığınızda, hedef tablo zaten mevcut olmalı ve boş olmalıdır. Hem kaynak tablo ya da bölüm hem de hedef tablo veya bölüm aynı dosya grubunda bulunmalıdır. Karşılık gelen dizinler veya dizin bölümleri de aynı dosya grubunda bulunmalıdır. Bölümler arasında geçiş yapmak için birçok ek kısıtlama geçerlidir. tablo ve target_table aynı olamaz. target_table çok parçalı bir tanımlayıcı olabilir.
Hem source_partition_number_expression hem de target_partition_number_expression değişkenlere ve işlevlere başvurabilen sabit ifadelerdir. Bunlar kullanıcı tanımlı tür değişkenlerini ve kullanıcı tanımlı işlevleri içerir. Transact-SQL ifadelere başvuramaz.
Kümelenmiş columnstore dizini olan bölümlenmiş tablo, bölümlenmiş yığın gibi davranır:
- Birincil anahtar bölüm anahtarını içermelidir.
- Benzersiz bir dizin bölüm anahtarını içermelidir. Ancak, mevcut bir benzersiz dizine sahip bölüm anahtarı dahil olmak benzersizliği değiştirebilir.
- Bölümleri değiştirmek için, tüm kümelenmemiş dizinlerin bölüm anahtarını içermesi gerekir.
Çoğaltma kullanırken kısıtlama için SWITCH bkz . Bölümlenmiş Tabloları ve Dizinleri Çoğaltma.
Kümelenmemiş columnstore dizinleri, SQL Server 2016(13.x) öncesi salt okunur biçimde ve V12 sürümünden önceki SQL Veritabanı için oluşturulmuş. Herhangi bir PARTITION işlemin çalıştırılabilmesi için önce derlenmemiş columnstore dizinlerini geçerli biçime (güncelleştirilebilir) yeniden oluşturmanız gerekir.
Limitations
Her iki tablo da kümelenmemiş dizinler de dahil olmak üzere aynı şekilde bölümlenmişse ve hedef tabloda kümelenmemiş dizin yoksa , 4907 hatası alabilirsiniz.
Örnek çıkış:
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 | "varsayılan" | "NULL" })
Şunlar için geçerlidir: SQL Server. Azure SQL Veritabanı FILESTREAMdesteklemez.
FILESTREAM verilerinin depolandığı yeri belirtir.
ALTER TABLE
SET FILESTREAM_ON ile yan tümcesi yalnızca tabloda FILESTREAM sütunu yoksa başarılı olur. İkinci ALTER TABLE bir deyim kullanarak FILESTREAM sütunları ekleyebilirsiniz.
filestream_filegroup_name fileSTREAM dosya grubunun adını belirtir. Dosya grubu, CREATE DATABASE veya ALTER DATABASE deyimi kullanılarak dosya grubu için tanımlanmış bir dosyaya sahip olmalıdır veya bir hata alırsınız.
"default" , özellik kümesine sahip DEFAULT FILESTREAM dosya grubunu belirtir. FILESTREAM dosya grubu yoksa bir hata alırsınız.
"NULL" tablo için FILESTREAM dosya gruplarına yapılan tüm başvuruların kaldırıldığını belirtir. Önce tüm FILESTREAM sütunları bırakılmalıdır. Tabloyla ilişkili tüm FILESTREAM verilerini silmek için kullanın SET FILESTREAM_ON = "NULL" .
SET ( SYSTEM_VERSIONING = { KAPALI | ON [ ( HISTORY_TABLE = schema_name . history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ] } )
Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri ve Azure SQL Veritabanı.
Tablonun sistem sürümü oluşturmayı devre dışı bırakır veya etkinleştirir. Bir tablonun sistem sürümü oluşturmayı etkinleştirmek için sistem, sistem sürümü oluşturma için veri türü, null atanabilirlik kısıtlaması ve birincil anahtar kısıtlaması gereksinimlerinin karşılandığını doğrular. Sistem, sistem sürümüne sahip tablodaki her kaydın geçmişini ayrı bir geçmiş tablosuna kaydeder.
HISTORY_TABLE Bağımsız değişken kullanılmıyorsa, bu geçmiş tablosunun adı olurMSSQL_TemporalHistoryFor<primary_table_object_id>. Geçmiş tablosu yoksa, sistem geçerli tablonun şemasıyla eşleşen yeni bir geçmiş tablosu oluşturur, iki tablo arasında bir bağlantı oluşturur ve sistemin geçmiş tablosundaki geçerli tablodaki her kaydın geçmişini kaydetmesini sağlar. HISTORY_TABLE bağımsız değişkenini kullanarak bir bağlantı oluşturur ve var olan bir geçmiş tablosunu kullanırsanız, sistem geçerli tabloyla belirtilen tablo arasında bir bağlantı oluşturur. Var olan bir geçmiş tablosuna bağlantı oluştururken veri tutarlılığı denetimi yapmayı seçebilirsiniz. Bu veri tutarlılığı denetimi, mevcut kayıtların çakışmamasını sağlar. Veri tutarlılığı denetimini çalıştırmak varsayılandır. Var olan tabloyu geçici bir tablo yapmak için SYSTEM_VERSIONING = ON yan tümcesiyle tanımlanan bir tablodaki PERIOD FOR SYSTEM_TIME bağımsız değişkenini kullanın. Daha fazla bilgi için bkz. Zamana bağlı tablolar.
HISTORY_RETENTION_PERIOD = { SONSUZ | sayı { GÜN | GÜN | HAFTA | HAFTALAR | AY | AYLAR | YIL | YIL } }
için geçerlidir: SQL Server 2017 (14.x) ve Azure SQL Veritabanı.
Zamana bağlı bir tablodaki geçmiş veriler için sonlu veya sonsuz saklamayı belirtir. Atlanırsa, sonsuz saklama varsayılır.
DATA_DELETION
Şunlar için geçerlidir: Azure SQL Edge yalnızca
Bir veritabanı içindeki tablolardan eski veya eski verilerin saklama ilkesi tabanlı temizlenmesini sağlar. Daha fazla bilgi için bkz. Veri Saklamayı Etkinleştirme ve Devre Dışı Bırakma. Veri saklamanın etkinleştirilmesi için aşağıdaki parametreler belirtilmelidir.
FILTER_COLUMN = { column_name }
Tablodaki satırların eski olup olmadığını belirlemek için kullanılacak sütunu belirtir. Filtre sütunu için aşağıdaki veri türlerine izin verilir.
- date
- datetime
- datetime2
- smalldatetime
- datetimeoffset
RETENTION_PERIOD = { SONSUZ | sayı { GÜN | GÜN | HAFTA | HAFTALAR | AY | AYLAR | YIL | YIL } }
Tablo için bekletme süresi ilkesini belirtir. Bekletme süresi, pozitif bir tamsayı değeri ile tarih bölümü biriminin birleşimi olarak belirtilir.
SET ( LOCK_ESCALATION = { AUTO | TABLO | DISABLE } )
Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.
Bir tablo için izin verilen kilit yükseltme yöntemlerini belirtir.
AUTO
Bu seçenek, SQL Server Veritabanı Altyapısı'nın tablo şemasına uygun kilit yükseltme ayrıntı düzeyini seçmesine olanak tanır.
Tablo bölümlenmişse, yığına veya B ağacı (HoBT) ayrıntı düzeyine kilit yükseltmesine izin verilir. Başka bir deyişle, bölüm düzeyine yükseltmeye izin verilir. Kilit HoBT düzeyine yükseltildikten sonra, kilit daha sonra ayrıntı düzeyine
TABLEyükseltilmeyecektir.Tablo bölümlenmemişse, kilit yükseltmesi ayrıntı düzeyine
TABLEyapılır.
TABLE
Kilit yükseltmesi, tablo bölümlenmiş veya bölümlenmemiş olsun tablo düzeyinde ayrıntı düzeyinde yapılır.
TABLEvarsayılan değerdir.DISABLE
Çoğu durumda kilit yükseltmesini önler. Tablo düzeyinde kilitlere tamamen izin verilmez. Örneğin, serileştirilebilir yalıtım düzeyi altında kümelenmiş dizini olmayan bir tabloyu tararken, Veri bütünlüğünü korumak için Veritabanı Altyapısı'nın tablo kilidi alması gerekir.
REBUILD
Bölümlenmiş tablodaki REBUILD WITH tüm bölümler dahil olmak üzere bir tablonun tamamını yeniden oluşturmak için söz dizimini kullanın. Tabloda kümelenmiş dizin varsa, REBUILD seçeneği kümelenmiş dizini yeniden oluşturur.
REBUILD bir ONLINE işlem olarak çalıştırılabilir.
Bölümlenmiş tablodaki REBUILD PARTITION tek bir bölümü yeniden oluşturmak için söz dizimini kullanın.
BÖLÜM = TÜMÜ
Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.
Bölüm sıkıştırma ayarlarını değiştirirken tüm bölümleri yeniden oluşturur.
İLE YENIDEN OLUŞTURMA ( <rebuild_option> )
Tüm seçenekler kümelenmiş dizine sahip bir tabloya uygulanır. Tabloda kümelenmiş dizin yoksa yığın yapısı yalnızca bazı seçeneklerden etkilenir.
İşlemle REBUILD belirli bir sıkıştırma ayarı belirtilmediğinde, bölüm için geçerli sıkıştırma ayarı kullanılır. Geçerli ayarı döndürmek için data_compression katalog görünümündeki sys.partitions sütununu sorgula.
Yeniden oluşturma seçeneklerinin tam açıklamaları için bkz. ALTER TABLE index_option
DATA_COMPRESSION
Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.
Belirtilen tablo, bölüm numarası veya bölüm aralığı için veri sıkıştırma seçeneğini belirtir. Seçenekler şunlardır:
NONE
Tablo veya belirtilen bölümler sıkıştırılamaz. Bu seçenek columnstore tablolarına uygulanmaz.
SIRA
Tablo veya belirtilen bölümler satır sıkıştırma kullanılarak sıkıştırılır. Bu seçenek columnstore tablolarına uygulanmaz.
SAYFA
Tablo veya belirtilen bölümler sayfa sıkıştırma kullanılarak sıkıştırılır. Bu seçenek columnstore tablolarına uygulanmaz.
COLUMNSTORE
Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri ve Azure SQL Veritabanı.
Yalnızca columnstore tablolarına uygulanır.
COLUMNSTOREseçeneğiyle sıkıştırılmış bir bölümün sıkıştırmasını kaldırmayıCOLUMNSTORE_ARCHIVEbelirtir. Veriler geri yüklendiğinde, tüm columnstore tabloları için kullanılan columnstore sıkıştırması ile sıkıştırılmaya devam eder.COLUMNSTORE_ARCHIVE
Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri ve Azure SQL Veritabanı.
Yalnızca kümelenmiş columnstore diziniyle depolanan tablolar olan columnstore tabloları için geçerlidir.
COLUMNSTORE_ARCHIVEbelirtilen bölümü daha küçük bir boyuta sıkıştırır. Arşivleme veya daha az depolama gerektiren ve depolama ve alma için daha fazla zaman ayırabilen diğer durumlar için bu seçeneği kullanın.Aynı anda birden çok bölümü yeniden derlemek için bkz. index_option. Tabloda kümelenmiş dizin yoksa, veri sıkıştırmanın değiştirilmesi yığın ve kümelenmemiş dizinleri yeniden oluşturur. Sıkıştırma hakkında daha fazla bilgi için bkz. Veri sıkıştırma.
ALTER TABLE REBUILD PARTITION WITH DATA COMPRESSION = ROWveyaPAGEMicrosoft Fabric'te SQL veritabanında izin verilmiyor.
XML_COMPRESSION
için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümler, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği.
Tablodaki xml veri türü sütunları için XML sıkıştırma seçeneğini belirtir. Seçenekler şunlardır:
ON
xml veri türünü kullanan sütunlar sıkıştırılır.
OFF
xml veri türünü kullanan sütunlar sıkıştırılamaz.
ÇEVRİmİÇİ = { ON | OFF } <single_partition_rebuild_option> için geçerlidir
Dizin işlemi sırasında sorgular ve veri değişikliği için temel tabloların ve ilişkili dizinlerin tek bir bölümünün kullanılabilir olup olmadığını belirtir. Varsayılan değer: OFF. İşlem olarak REBUILD çalıştırabilirsinizONLINE.
ON
Uzun süreli tablo kilitleri dizin işlemi boyunca tutulmaz. Tablodaki S kilidi, dizin yeniden oluşturma işleminin başlangıcında ve çevrimiçi dizin yeniden oluşturma işleminin sonunda tabloda Sch-M kilidi gereklidir. Her iki kilit de kısa meta veri kilitleri olsa da, Sch-M kilidi tüm engelleme işlemlerinin tamamlanmasını beklemelidir. Bekleme süresi boyunca, Sch-M kilidi aynı tabloya erişirken bu kilidin arkasında bekleyen diğer tüm işlemleri engeller.
Note
Çevrimiçi dizin yeniden derlemesi, bu bölümün ilerleyen bölümlerinde açıklanan
low_priority_lock_waitseçeneklerini ayarlayabilir.OFF
Tablo kilitleri dizin işlemi süresi boyunca uygulanır. Bu, işlem süresi boyunca temel alınan tabloya tüm kullanıcı erişimini engeller.
ALL_SPARSE_COLUMNS IÇIN XML COLUMN_SET column_set_name
Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.
Sütun kümesinin adı. Sütun kümesi, tablonun tüm seyrek sütunlarını yapılandırılmış bir çıktıda birleştiren, yazılmamış bir XML gösterimidir. Seyrek sütun içeren bir tabloya sütun kümesi eklenemez. Sütun kümeleri hakkında daha fazla bilgi için bkz. Sütun kümelerini kullanma.
{ ETKİnLEŞTİr | DISABLE } FILETABLE_NAMESPACE
Şunlar için geçerlidir: SQL Server.
FileTable'da sistem tanımlı kısıtlamaları etkinleştirir veya devre dışı bırakır. Yalnızca bir FileTable ile kullanılabilir.
SET ( FILETABLE_DIRECTORY = directory_name )
Şunlar için geçerlidir: SQL Server. Azure SQL Veritabanı FileTable'i desteklemez.
Windows uyumlu FileTable dizin adını belirtir. Bu ad, veritabanındaki tüm FileTable dizin adları arasında benzersiz olmalıdır. SQL harmanlama ayarlarına rağmen benzersizlik karşılaştırması büyük/küçük harfe duyarlı değildir. Yalnızca bir FileTable ile kullanılabilir.
REMOTE_DATA_ARCHIVE
Şunlar için geçerlidir: SQL Server 2017 (14.x) ve sonraki sürümler.
Bir tablo için Stretch Database'i etkinleştirir veya devre dışı bırakır. Daha fazla bilgi için bkz. Stretch Database.
Important
Stretch Database, SQL Server 2022 (16.x) ve Azure SQL Veritabanı'nda kullanım dışıdır. Bu özellik, Veritabanı Altyapısı'nın gelecekteki bir sürümünde kaldırılacaktır. Bu özelliği yeni geliştirme çalışmalarında kullanmaktan kaçının ve şu anda bu özelliği kullanan uygulamaları değiştirmeyi planlayın.
Tablo için Stretch Database'i etkinleştirme
ONbelirterek bir tablo için Esnetmeyi etkinleştirdiğinizde, verileri hemen geçirmeyi başlatmak için MIGRATION_STATE = OUTBOUND veya veri geçişlerini ertelemek için MIGRATION_STATE = PAUSED belirtmeniz gerekir. Varsayılan değer MIGRATION_STATE = OUTBOUND. Bir tablo için Esnetmeyi etkinleştirme hakkında daha fazla bilgi için bkz. bir tablo için Stretch Database'i etkinleştirme.
Prerequisites. Bir tablo için Stretch'i etkinleştirmeden önce, sunucuda ve veritabanında Stretch'i etkinleştirmeniz gerekir. Daha fazla bilgi için bkz. bir veritabanı için Stretch Database'i etkinleştirme.
Permissions. Bir veritabanı veya tablo için Stretch'i etkinleştirmek için db_owner izinleri gerekir. Bir tablo için Esnetme'yi etkinleştirmek için tabloda da izinler gerekir ALTER .
Tablo için Stretch Database'i devre dışı bırakma
Bir tablo için Esnetmeyi devre dışı bırakırsanız, Azure'a zaten geçirilmiş olan uzak veriler için iki seçeneğiniz vardır. Daha fazla bilgi için bkz. Stretch Database'i devre dışı bırakma veuzak verileri geri getirme.
Bir tablo için Stretch'i devre dışı bırakmak ve tablonun uzak verilerini Azure'dan SQL Server'a geri kopyalamak için aşağıdaki komutu çalıştırın. Bu komut iptal edilemiyor.
ALTER TABLE <table_name> SET ( REMOTE_DATA_ARCHIVE ( MIGRATION_STATE = INBOUND ) ) ;
Bu işlem veri aktarımı maliyetlerine neden olur ve iptal edilemez. Daha fazla bilgi için bkz. Veri Aktarımları Fiyatlandırma Ayrıntıları.
Tüm uzak veriler Azure'dan SQL Server'a geri kopyalandıktan sonra, tablo için Stretch devre dışı bırakılır.
Bir tablo için Stretch'i devre dışı bırakmak ve uzak verileri bırakmak için aşağıdaki komutu çalıştırın.
ALTER TABLE <table_name> SET ( REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY ( MIGRATION_STATE = PAUSED ) ) ;
Bir tablo için Stretch Database'i devre dışı bırakdıktan sonra, veri geçişi durdurulur ve sorgu sonuçları artık uzak tablodan sonuçlar içermez.
Esnetme'nin devre dışı bırakılması uzak tabloyu kaldırmaz. Uzak tabloyu silmek istiyorsanız Azure portalını kullanarak bırakın.
[ FILTER_PREDICATE = { null | koşul } ]
Şunlar için geçerlidir: SQL Server 2017 (14.x) ve sonraki sürümler.
İsteğe bağlı olarak, hem geçmiş hem de geçerli verileri içeren bir tablodan geçirilebilen satırları seçmek için bir filtre koşulu belirtir. Koşul, belirleyici bir satır içi tablo değerli işlevi çağırmalıdır. Daha fazla bilgi için bkz. Bir tablo için Esnetme Veritabanını Etkinleştirme ve filtre işlevi kullanarak geçirileceği satırları seçme - Stretch Database.
Important
Kötü performans gösteren bir filtre koşulu sağlarsanız, veri geçişi de düşük performans gösterir. Stretch Database, işlecini kullanarak tabloya filtre koşulunu CROSS APPLY uygular.
Filtre koşulu belirtmezseniz tablonun tamamı geçirilir.
Bir filtre koşulu belirttiğinizde de belirtmeniz MIGRATION_STATEgerekir.
MIGRATION_STATE = { GIDEN | GELEN | DURAKLATILDI }
Şunlar için geçerlidir: SQL Server 2017 (14.x) ve sonraki sürümler.
SQL Server'dan Azure'a veri geçirmek için
OUTBOUNDbelirtin.Tablo için uzak verileri Azure'dan SQL Server'a geri kopyalamak ve tablo için Esnetmeyi devre dışı bırakmak için
INBOUNDbelirtin. Daha fazla bilgi için bkz. Stretch Database'i devre dışı bırakma veuzak verileri geri getirme.Bu işlem veri aktarımı maliyetlerine neden olur ve iptal edilemez.
Veri geçişlerini duraklatmak veya ertelemek için
PAUSEDbelirtin. Daha fazla bilgi için bkz. Veri geçişlerini duraklatma ve sürdürme - Stretch Database.
WAIT_AT_LOW_PRIORITY
Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri ve Azure SQL Veritabanı.
Çevrimiçi dizin yeniden derlemesi, bu tabloda engelleme işlemlerini beklemek zorunda.
WAIT_AT_LOW_PRIORITY çevrimiçi dizin yeniden oluşturma işleminin düşük öncelikli kilitleri beklediğini ve çevrimiçi dizin derleme işlemi beklerken diğer işlemlerin devam etmelerine olanak tanıydığını gösterir. Seçeneğin atlanması WAIT AT LOW PRIORITY ile aynıdır WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).
MAX_DURATION = saat [ DAKİkA ]
Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri ve Azure SQL Veritabanı.
dakika cinsinden belirtilen bir tamsayı değeri olan veya çevrimiçi dizini yeniden oluşturmanın SWITCH DDL komutunu çalıştırırken düşük öncelikli olarak beklediği bekleme süresi. İşlem bu süre boyunca MAX_DURATION engellenirse, eylemlerden ABORT_AFTER_WAIT biri çalışır.
MAX_DURATION zaman her zaman dakika cinsindendir ve sözcüğünü MINUTESatlayabilirsiniz.
ABORT_AFTER_WAIT = { YOK | SELF | ENGELLEYICILER }
Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri ve Azure SQL Veritabanı.
NONE
Normal (normal) önceliğe sahip kilidi beklemeye devam edin.
SELF
Şu anda çalıştırılmakta olan
SWITCHveya çevrimiçi dizin yeniden oluşturma DDL işleminden herhangi bir işlem yapmadan çıkın.BLOCKERS
İşlemin devam edebilmesi için şu anda veya çevrimiçi dizini yeniden oluşturma DDL işlemini engelleyen
SWITCHtüm kullanıcı işlemlerini sonlandırma.İzin gerektirir
ALTER ANY CONNECTION.
VARSA
Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri ve Azure SQL Veritabanı.
Sütunu veya kısıtlamayı koşullu olarak yalnızca zaten varsa bırakır.
RESUMABLE = { ON | KAPALI}
Şunlar için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümleri.
bir ALTER TABLE ADD CONSTRAINT işleminin devam ettirilebilir olup olmadığını belirtir.
ONtablo kısıtlaması ekleme işlemi devam ettirilebilir.
OFFtablo kısıtlaması ekleme işlemi devam ettirilemez. Varsayılan değer OFF.
RESUMABLE seçeneği, ALTER TABLE table_constraintiçindeki ALTER TABLE index_option parçası olarak kullanılabilir.
MAX_DURATION ile RESUMABLE = ON kullanıldığında (gerektirir ONLINE = ON), duraklatılmadan önce devam ettirilebilir bir çevrimiçi ekleme kısıtlaması işleminin yürütüldüğünü belirten zamanı (dakika cinsinden belirtilen bir tamsayı değeri) gösterir. Belirtilmezse, işlem tamamlanmadan devam eder.
Devam ettirilebilen ALTER TABLE ADD CONSTRAINT işlemleri etkinleştirme ve kullanma hakkında daha fazla bilgi için bkz. Devam ettirilebilir tablo ekleme kısıtlamaları.
Remarks
Yeni veri satırları eklemek için INSERTkullanın. Veri satırlarını kaldırmak için
Yordam önbelleğinde tabloya başvuran yürütme planları varsa, ALTER TABLE bunları bir sonraki yürütmelerinde yeniden derlenecek şekilde işaretler.
Microsoft Fabric'teki SQL veritabanında bazı tablo özellikleri oluşturulabilir ancak Fabric OneLake'e yansıtılmaz. Daha fazla bilgi için, Fabric SQL veritabanı aynalama için Sınırlamalar bölümüne bakınız.
Sütunun boyutunu değiştirme
Sütun veri türü için yeni bir boyut belirterek sütunun uzunluğunu, duyarlığı veya ölçeğini değiştirebilirsiniz. yan tümcesini ALTER COLUMN kullanın. Sütunda veri varsa, yeni boyut verilerin maksimum boyutundan küçük olamaz. Ayrıca, sütun bir varchar, nvarchar veya varbinary veri türü değilse ve dizin bir PRIMARY KEY kısıtlamanın sonucu değilse, dizinde sütunu tanımlayamazsınız. Sütun Tanımını Değiştirme
Kilitler ve ALTER TABLE
içinde ALTER TABLE belirttiğiniz değişiklikler hemen uygulanır. Değişiklikler tablodaki satırların değiştirilmesini gerektiriyorsa, ALTER TABLE satırları güncelleştirir.
ALTER TABLE , değişiklik sırasında tablonun meta verilerine başka hiçbir bağlantının başvurmadığından emin olmak için, sonunda kısa bir Sch-M kilidi gerektiren çevrimiçi dizin işlemleri dışında tablo üzerinde bir şema değiştirme (Sch-M) kilidi alır.
ALTER TABLE...SWITCH bir işlemde kilit hem kaynak hem de hedef tablolarda alınır. Tabloda yapılan değişiklikler günlüğe kaydedilir ve tamamen kurtarılabilir. Sütun bırakma veya SQL Server'ın bazı sürümlerinde varsayılan değere sahip bir NOT NULL sütun ekleme gibi büyük tablolardaki tüm satırları etkileyen değişikliklerin tamamlanması ve çok sayıda günlük kaydı oluşturulması uzun sürebilir. Bu ALTER TABLE deyimleri, birçok satırı etkileyen herhangi bir INSERT, UPDATEveya DELETE deyimiyle aynı özenle çalıştırın.
Microsoft Fabric'teki Ambarı için geçerlidir.
ALTER TABLE açık bir işlemin parçası olamaz.
Bölüm anahtarı için Genişletilmiş Olaylar (XEvents)
Aşağıdaki XEvents,
- lock_request_priority_state
- process_killed_by_abort_blockers
- ddl_with_wait_at_low_priority
Not NULL sütunlarını çevrimiçi işlem olarak ekleme
SQL Server 2012 (11.x) Enterprise sürümü ve sonraki sürümlerinde varsayılan değere sahip bir NOT NULL sütun eklemek, varsayılan değer çalışma zamanı sabiti olduğunda çevrimiçi bir işlemdir. Bu, tablodaki satır sayısına rağmen işlemin neredeyse anında tamamlandığı anlamına gelir, çünkü tablodaki mevcut satırlar işlem sırasında güncelleştirilmez. Bunun yerine, varsayılan değer yalnızca tablonun meta verilerinde depolanır ve değer gerektiğinde bu satırlara erişen sorgularda aranır. Bu davranış otomatiktir. Çevrimiçi işlemi söz diziminin ötesinde ADD COLUMN uygulamak için ek söz dizimi gerekmez. Çalışma zamanı sabiti, determinizmine rağmen tablodaki her satır için çalışma zamanında aynı değeri üreten bir ifadedir. Örneğin, sabit ifadesi "My temporary data"veya sistem işlevi GETUTCDATETIME() çalışma zamanı sabitleridir. Buna karşılık, tablodaki her satır için benzersiz bir değer üretildiği için NEWID() veya NEWSEQUENTIALID() işlevleri çalışma zamanı sabitleri değildir.
NOT NULL Çalışma zamanı sabiti olmayan varsayılan değere sahip bir sütun eklemek her zaman çevrimdışı çalıştırılır ve işlem süresi boyunca özel (Sch-M) bir kilit alınır.
Mevcut satırlar meta verilerde depolanan değere başvururken, eklenen ve sütun için başka bir değer belirtmeyen yeni satırlar için varsayılan değer satırda depolanır. Meta verilerde depolanan varsayılan değer, satır güncelleştirildiğinde (gerçek sütun deyiminde UPDATE belirtilmemiş olsa bile) veya tablo veya kümelenmiş dizin yeniden oluşturulduğunda var olan bir satıra taşınır.
Varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography veya CLR kullanıcı tanımlı türlerdeki sütunlar çevrimiçi bir işleme eklenemez. Bunun yapılması, olası en büyük satır boyutunun 8.060 bayt sınırını aşmasına neden oluyorsa, sütun çevrimiçi eklenemez. Bu durumda sütun çevrimdışı bir işlem olarak eklenir.
Paralel plan yürütme
SQL Server 2012 (11.x) Enterprise sürümü ve sonraki sürümlerinde, tek ALTER TABLE ADD bir (dizin tabanlı) veya CONSTRAINT (kümelenmiş dizin) DROPCONSTRAINT deyimini çalıştırmak için kullanılan işlemci sayısı, en yüksek paralellik yapılandırma seçeneği ve geçerli iş yükü tarafından belirlenir. Veritabanı Altyapısı sistemin meşgul olduğunu algılarsa, deyimi yürütme başlamadan önce işlemin paralellik derecesi otomatik olarak azaltılır. seçeneğini belirterek MAXDOP deyimini çalıştırmak için kullanılan işlemci sayısını el ile yapılandırabilirsiniz. Daha fazla bilgi için bkz . Sunucu yapılandırması: maksimum paralellik derecesi.
Bölümlenmiş tablolar
Bölümlenmiş tablolar içeren SWITCH işlemlerini gerçekleştirmeye ek olarak, ALTER TABLE bölümlenmiş bir tablonun sütunlarının, kısıtlamalarının ve tetikleyicilerinin durumunu bölümlenmemiş tablolar için kullanıldığı gibi değiştirmek için kullanın. Ancak, bu deyim tablonun bölümlenme biçimini değiştirmek için kullanılamaz. Bölümlenmiş tabloyu yeniden bölümlendirmek için ALTER PARTITION SCHEME
Şemaya bağlı görünümlere sahip tablolarda kısıtlamalar
Şemaya bağlı görünümlere sahip tablolardaki deyimler için ALTER TABLE geçerli olan kısıtlamalar, basit bir dizine sahip tabloları değiştirirken geçerli olan kısıtlamalarla aynıdır. Sütun eklemeye izin verilir. Ancak, şemaya bağlı herhangi bir görünüme katılan bir sütunun kaldırılmasına veya değiştirilmesine izin verilmez. Deyimi şemaya ALTER TABLE bağlı bir görünümde kullanılan bir sütunun değiştirilmesini gerektiriyorsa, ALTER TABLE başarısız olur ve Veritabanı Altyapısı bir hata iletisi oluşturur. Şema bağlama ve dizine alınan görünümler hakkında daha fazla bilgi için bkz. CREATE VIEW
Temel tablolarda tetikleyicilerin eklenmesi veya kaldırılması, tablolara başvuran şemaya bağlı bir görünüm oluşturulmasından etkilenmez.
Dizinler ve ALTER TABLE
Kısıtlamanın bir parçası olarak oluşturulan dizinler, kısıtlama bırakıldığında bırakılır. ile CREATE INDEX oluşturulan dizinler ile DROP INDEXbırakılmalıdır. Kısıtlama tanımının dizin bölümünü yeniden oluşturmak için The ALTER INDEX deyimini kullanın; kısıtlamanın bırakılması ve ile ALTER TABLEyeniden eklenmesi gerekmez.
Sütunun kaldırılabilmesi için önce bir sütunu temel alan tüm dizinlerin ve kısıtlamaların kaldırılması gerekir.
Kümelenmiş dizin oluşturan bir kısıtlamayı sildiğinizde, kümelenmiş dizinin yaprak düzeyinde depolanan veri satırları, kümelenmemiş bir tabloda depolanır. Seçeneğini belirterek kümelenmiş dizini bırakabilir ve sonuçta elde edilen tabloyu tek bir işlemde başka bir dosya grubuna veya bölüm düzenine MOVE TO taşıyabilirsiniz. seçeneği MOVE TO aşağıdaki kısıtlamalara sahiptir:
MOVE TOdizinlenmiş görünümler veya kümelenmemiş dizinler için geçerli değildir.Bölüm şeması veya dosya grubu zaten mevcut olmalıdır.
Belirtilmezse
MOVE TO, tablo kümelenmiş dizin için tanımlanan bölüm düzeninde veya dosya grubunda bulunur.
Kümelenmiş dizini bıraktığınızda, işlemin temel alınan verilerde ve ilişkili kümelenmemiş dizinlerde sorguları ve değişiklikleri engellememesi için seçeneğini ONLINE = ON belirtinDROP INDEX.
ONLINE = ON aşağıdaki kısıtlamalara sahiptir:
-
ONLINE = ON, devre dışı bırakılmış kümelenmiş dizinler için geçerli değildir. Devre dışı bırakılan dizinler kullanılarakONLINE = OFFbırakılmalıdır. - Aynı anda yalnızca bir dizin bırakılabilir.
-
ONLINE = ONdizinli görünümler, kümelenmemiş dizinler veya yerel geçici tablolardaki dizinler için geçerli değildir. -
ONLINE = ONcolumnstore dizinleri için geçerli değildir.
Kümelenmiş dizini bırakmak için mevcut kümelenmiş dizinin boyutuna eşit geçici disk alanı gereklidir. bu ek alan, işlem tamamlanır tamamlanmaz serbest bırakılır.
Note
altında <drop_clustered_constraint_option> listelenen seçenekler tablolardaki kümelenmiş dizinlere uygulanır ve görünümlerde veya kümelenmemiş dizinlerde kümelenmiş dizinlere uygulanamaz.
Şema değişikliklerini çoğaltma
SQL Server Publisher'da yayımlanan bir tabloda çalıştırdığınızda ALTER TABLE , bu değişiklik varsayılan olarak tüm SQL Server Abonelerine yayılır. Bu işlevin bazı kısıtlamaları vardır. Devre dışı bırakabilirsiniz. Daha fazla bilgi için bkz. Yayın Veritabanlarında Şema Değişiklikleri Yapma.
Veri sıkıştırma
Sistem tabloları sıkıştırma için etkinleştirilemiyor. Tablo bir yığınsa, mod için ONLINE yeniden oluşturma işlemi tek iş parçacıklı olur. Çok iş parçacıklı yığın yeniden oluşturma işlemi için modu kullanın OFFLINE . Veri sıkıştırma hakkında daha fazla bilgi için bkz. Veri sıkıştırma.
Sıkıştırma durumunu değiştirmenin bir tabloyu, dizini veya bölümü nasıl etkilediğini değerlendirmek için sp_estimate_data_compression_savings sistem saklı yordamını kullanın.
Bölümlenmiş tablolar için aşağıdaki kısıtlamalar geçerlidir:
- Tabloda hizalanmamış dizinler varsa tek bir bölümün sıkıştırma ayarını değiştiremezsiniz.
-
ALTER TABLE <table> REBUILD PARTITION... söz dizimi belirtilen bölümü yeniden oluşturur. -
ALTER TABLE <table> REBUILD WITH... söz dizimi tüm bölümleri yeniden oluşturur.
Ntext sütunlarını bırakma
Kullanım dışı bırakılan ntext veri türünü kullanarak sütunları bırakırken, silinen verilerin temizlenmesi tüm satırlarda serileştirilmiş bir işlem olarak gerçekleşir. Temizleme işlemi büyük miktarda zaman gerektirebilir. Çok fazla satır içeren bir tabloda ntext sütununu bırakırken, önce ntext sütununu değere NULL güncelleştirin, sonra sütunu bırakın. Bu seçeneği paralel işlemlerle çalıştırabilir ve çok daha hızlı hale getirebilirsiniz.
Çevrimiçi dizin yeniden oluşturma
Çevrimiçi dizin yeniden derlemesi için DDL deyimini çalıştırmak için, belirli bir tabloda çalışan tüm etkin engelleme işlemlerinin tamamlanması gerekir. Çevrimiçi dizin yeniden derlemesi başlatıldığında, bu tabloda çalışmaya başlamaya hazır olan tüm yeni işlemleri engeller. Çevrimiçi dizin yeniden oluşturma için kilidin süresi kısa olsa da, belirli bir tablodaki tüm açık işlemlerin tamamlanmasını beklemek ve yeni işlemlerin başlatılmasını engellemek aktarım hızını önemli ölçüde etkileyebilir. Bu, bir iş yükünün yavaşlamasına veya zaman aşımına neden olabilir ve temel tabloya erişimi önemli ölçüde sınırlayabilir. seçeneği WAIT_AT_LOW_PRIORITY , DTA'ların çevrimiçi dizin yeniden derlemeleri için gereken S-lock ve Sch-M kilitlerini yönetmesine olanak tanır. Üç durumda da: NONE, SELFve BLOCKERS, bekleme süresi(MAX_DURATION = n [minutes]) () sırasında hiçbir engelleme etkinliği yoksa, çevrimiçi dizin yeniden oluşturma işlemi beklemeden hemen çalıştırılır ve DDL deyimi tamamlanır.
Uyumluluk desteği
deyimi ALTER TABLE yalnızca iki bölümlü (schema.object) tablo adlarını destekler. SQL Server'da, aşağıdaki biçimleri kullanarak bir tablo adı belirtme işlemi derleme zamanında 117 hatasıyla başarısız oluyor.
server.database.schema.table.database.schema.table..schema.table
Önceki sürümlerde, biçimi belirterek server.database.schema.table hata 4902 döndürdü.
.database.schema.table biçimini veya başarılı ..schema.table biçimini belirtme.
Sorunu çözmek için dört bölümlü ön ek kullanımını kaldırın.
Permissions
ALTER Tabloda izin gerektirir.
ALTER TABLE izinleri bir ALTER TABLE SWITCH deyimde yer alan her iki tablo için de geçerlidir. Anahtarlanan tüm veriler hedef tablonun güvenliğini devralır.
Deyiminde ALTER TABLE ortak dil çalışma zamanı (CLR) kullanıcı tanımlı türde veya diğer ad veri türünde bir sütun tanımladıysanız, REFERENCES tür üzerinde izin gereklidir.
Tablonun satırlarını güncelleştiren bir sütunu eklemek veya değiştirmek için tabloda izin gerekir UPDATE . Örneğin, varsayılan değere sahip bir NOT NULL sütun ekleme veya tablo boş olmadığında kimlik sütunu ekleme.
Examples
Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz veya AdventureWorksDW2025 örnek veritabanını kullanır.
| Category | Öne çıkan söz dizimi öğeleri |
|---|---|
| Sütun ve kısıtlama ekleme |
ADD; PRIMARY KEY dizin seçenekleri, seyrek sütunlar ve sütun kümeleri ile |
| sütunları ve kısıtlamaları bırakma |
DROP |
| Sütun tanımını değiştirme | veri türünü değiştirme; sütun boyutunu değiştirme; Harmanlama |
| Tablo tanımını değiştirme |
DATA_COMPRESSION; SWITCH PARTITION; ; LOCK ESCALATION değişiklik izleme |
| Kısıtlamaları ve tetikleyicileri devre dışı bırakma ve etkinleştirme |
CHECK; NO CHECK; ; ENABLE TRIGGERDISABLE TRIGGER |
| Çevrimiçi işlemler | ONLINE |
| Sistem sürümü oluşturma | SYSTEM_VERSIONING |
Sütun ve kısıtlama ekleme
Bu bölümdeki örneklerde tabloya sütun ve kısıtlama ekleme gösterilmektedir.
A. Yeni sütun ekleme
Aşağıdaki örnek, null değerlere izin veren ve bir tanım aracılığıyla hiçbir değer sağlanmayan bir DEFAULT sütun ekler. Yeni sütunda her satırda vardır NULL.
CREATE TABLE dbo.doc_exa (column_a INT);
GO
ALTER TABLE dbo.doc_exa
ADD column_b VARCHAR (20) NULL;
GO
B. Kısıtlaması olan bir sütun ekleme
Aşağıdaki örnek, UNIQUE kısıtlaması olan yeni bir sütun ekler.
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. Var olan bir sütuna doğrulamasız CHECK kısıtlaması ekleme
Aşağıdaki örnek, tablodaki mevcut bir sütuna kısıtlama ekler. Sütun, kısıtlamayı ihlal eden bir değere sahiptir. Bu nedenle, WITH NOCHECK kısıtlamanın mevcut satırlarda doğrulanmasını önlemek ve kısıtlamanın eklenmesine izin vermek için kullanılır.
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. Var olan bir sütuna DEFAULT kısıtlaması ekleme
Aşağıdaki örnek, iki sütunlu bir tablo oluşturur ve ilk sütuna bir değer ekler ve diğer sütun kalır NULL. Daha sonra ikinci sütuna bir DEFAULT kısıtlaması eklenir. Varsayılanın uygulandığını doğrulamak için, ilk sütuna başka bir değer eklenir ve tablo sorgulanır.
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. Kısıtlamaları olan birkaç sütun ekleme
Aşağıdaki örnek, yeni sütunla tanımlanan kısıtlamalara sahip birkaç sütun ekler. İlk yeni sütunda IDENTITY özelliği vardır. Tablodaki her satır, kimlik sütununda yeni artımlı değerlere sahiptir.
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. Varsayılan değerlerle boş değer atanabilir sütun ekleme
Aşağıdaki örnek, DEFAULT tanımına sahip null atanabilir bir sütun ekler ve tablodaki mevcut her satır için değer sağlamak için WITH VALUES kullanır. Kullanılmazsa WITH VALUES , her satırda yeni sütundaki değer NULL bulunur.
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. Dizin veya veri sıkıştırma seçenekleriyle BİrİnCİl ANAHTAR kısıtlaması oluşturma
Aşağıdaki örnek kısıtlamayı PRIMARY KEYPK_TransactionHistoryArchive_TransactionID oluşturur ve , FILLFACTORve ONLINEseçeneklerini PAD_INDEXayarlar. Sonuçta elde edilen kümelenmiş dizin kısıtlamayla aynı ada sahiptir.
Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.
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
Bu benzer örnek, kümelenmiş birincil anahtar uygulanırken sayfa sıkıştırma uygular.
USE AdventureWorks2022;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID
PRIMARY KEY CLUSTERED (TransactionID) WITH (DATA_COMPRESSION = PAGE);
GO
H. Seyrek sütun ekleme
Aşağıdaki örneklerde T1 tablosunda seyrek sütunların eklenmesi ve değiştirilmesi gösterilmektedir. Tablo T1 oluşturma kodu aşağıdaki gibidir.
CREATE TABLE T1
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) SPARSE NULL,
C3 INT SPARSE NULL,
C4 INT
);
GO
C5başka bir seyrek sütun eklemek için aşağıdaki deyimi yürütür.
ALTER TABLE T1
ADD C5 CHAR (100) SPARSE NULL;
GO
Seyrek olmayan C4 sütununu seyrek sütuna dönüştürmek için aşağıdaki deyimi yürütün.
ALTER TABLE T1
ALTER COLUMN C4 ADD SPARSE;
GO
C4 seyrek sütununu seyrek olmayan bir sütuna dönüştürmek için aşağıdaki deyimi yürütün.
ALTER TABLE T1
ALTER COLUMN C4 DROP SPARSE;
GO
I. Sütun kümesi ekleme
Aşağıdaki örneklerde tablo T2sütun ekleme gösterilmektedir. Zaten seyrek sütunlar içeren bir tabloya sütun kümesi eklenemez. Tablo T2 oluşturma kodu aşağıdaki gibidir.
CREATE TABLE T2
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) NULL,
C3 INT NULL,
C4 INT
);
GO
Aşağıdaki üç deyim, CSadlı bir sütun kümesi ekler ve ardından C2 ve C3 sütunları SPARSE olarak değiştirir.
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. Şifrelenmiş sütun ekleme
Aşağıdaki deyim, PromotionCodeadlı şifrelenmiş bir sütun ekler.
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. Devam ettirilebilir işlemle birincil anahtar ekleme
240 dakikalık ALTER TABLE ile (a) sütununda kümelenmiş bir birincil anahtar eklemek için devam ettirilebilen MAX_DURATION işlemi.
ALTER TABLE table1
ADD CONSTRAINT PK_Constrain PRIMARY KEY CLUSTERED (a)
WITH (ONLINE = ON, MAXDOP = 2, RESUMABLE = ON, MAX_DURATION = 240);
Sütunları ve kısıtlamaları bırakma
Bu bölümdeki örneklerde sütunları ve kısıtlamaları bırakma gösterilmektedir.
A. Sütun veya sütun bırakma
İlk örnek, sütunu kaldırmak için tabloyu değiştirir. İkinci örnek birden çok sütunu kaldırır.
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. Kısıtlamaları ve sütunları bırakma
İlk örnek, tablodan UNIQUE kısıtlamasını kaldırır. İkinci örnek iki kısıtlamayı ve tek bir sütunu kaldırır.
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. BİRİnCİl ANAHTAR kısıtlamasını ÇEVRİmİÇİ modunda bırakma
Aşağıdaki örnek, seçeneği olarak ayarlanmış PRIMARY KEYbir ONLINE kısıtlamayı ON siler.
ALTER TABLE Production.TransactionHistoryArchive
DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID
WITH (ONLINE = ON);
GO
D. YABANCı ANAHTAR kısıtlaması ekleme ve bırakma
Aşağıdaki örnek, ContactBackuptablosunu oluşturur ve ardından önce FOREIGN KEYtabloya başvuran bir Person.Person kısıtlaması ekleyerek ve ardından FOREIGN KEY kısıtlamasını bırakarak tabloyu değiştirir.
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;
Sütun tanımını değiştirme
A. Sütunun veri türünü değiştirme
Aşağıdaki örnek, bir tablonun sütununu INTDECIMALolarak değiştirir.
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. Sütunun boyutunu değiştirme
Aşağıdaki örnek, varchar sütununun boyutunu ve ondalık sütununun duyarlık ve ölçeğini artırır. Sütunlar veri içerdiğinden, sütun boyutu yalnızca artırılabilir. Ayrıca col_a benzersiz bir dizinde tanımlandığına dikkat edin. Veri türü col_a olduğundan ve dizin bir kısıtlamanın sonucu olmadığından boyutu PRIMARY KEY yine de artırılabilir.
-- 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. Sütun harmanlamasını değiştirme
Aşağıdaki örnekte bir sütunun harmanlamasını değiştirme işlemi gösterilmektedir. İlk olarak, varsayılan kullanıcı harmanlaması ile bir tablo oluşturulur.
CREATE TABLE T3
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) NULL,
C3 INT NULL,
C4 INT
);
GO
Ardından sütun C2 harmanlama Latin1_General_BIN olarak değiştirilir. Veri türü değiştirilmese bile gereklidir.
ALTER TABLE T3
ALTER COLUMN C2 VARCHAR (50) COLLATE Latin1_General_BIN;
GO
D. Sütunu şifreleme
Aşağıdaki örnekte, güvenli kuşatmalarla Always Encryptedkullanarak bir sütunun nasıl şifrelenmesi gösterilmektedir.
İlk olarak, şifrelenmiş sütunlar olmadan bir tablo oluşturulur.
CREATE TABLE T3
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) NULL,
C3 INT NULL,
C4 INT
);
GO
Ardından , 'C2' sütunu CEK1adlı bir sütun şifreleme anahtarı ve rastgele şifreleme ile şifrelenir. Aşağıdaki deyimin başarılı olması için:
- Sütun şifreleme anahtarının kapanım etkin olması gerekir. Başka bir deyişle, kapanım hesaplamalarına izin veren bir sütun ana anahtarı (CMK) ile şifrelenmelidir.
- Hedef SQL Server örneği güvenli kuşatmalarla Always Encrypted'ı desteklemelidir.
- Deyiminin güvenli kuşatmalarla Always Encrypted için ayarlanmış bir bağlantı üzerinden ve desteklenen bir istemci sürücüsü kullanılarak verilmesi gerekir.
- Çağıran uygulamanın cmk'ye erişimi olmalıdır ve bunu
CEK1korumalıdır.
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
Tablo tanımını değiştirme
Bu bölümdeki örneklerde bir tablonun tanımının nasıl değiştir olduğu gösterilmektedir.
A. Sıkıştırmayı değiştirmek için tabloyu değiştirme
Aşağıdaki örnek bölümlenmemiş bir tablonun sıkıştırmasını değiştirir. Yığın veya kümelenmiş dizin yeniden oluşturulur. Tablo bir yığınsa, tüm kümelenmemiş dizinler yeniden oluşturulur.
ALTER TABLE T1 REBUILD
WITH (DATA_COMPRESSION = PAGE);
Aşağıdaki örnek bölümlenmiş tablonun sıkıştırmasını değiştirir.
REBUILD PARTITION = 1 söz dizimi yalnızca bölüm numarasının yeniden oluşturulmasına 1 neden olur.
Şunlar için geçerlidir: SQL Server.
ALTER TABLE PartitionTable1 REBUILD PARTITION = 1
WITH (DATA_COMPRESSION = NONE);
GO
Aşağıdaki alternatif söz dizimini kullanan aynı işlem, tablodaki tüm bölümlerin yeniden oluşturulmasına neden olur.
Şunlar için geçerlidir: SQL Server.
ALTER TABLE PartitionTable1 REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = PAGE ON PARTITIONS (1));
Ek veri sıkıştırma örnekleri için bkz. Veri sıkıştırma.
B. Arşiv sıkıştırmasını değiştirmek için columnstore tablosunu değiştirme
Aşağıdaki örnek, ek bir sıkıştırma algoritması uygulayarak columnstore tablo bölümünü daha da sıkıştırır. Bu sıkıştırma, tabloyu daha küçük bir boyuta indirir, ancak depolama ve alma için gereken süreyi de artırır. Bu, arşivleme veya daha az alan gerektiren ve depolama ve alma için daha fazla zaman ayırabilen durumlar için kullanışlıdır.
Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri ve Azure SQL Veritabanı.
ALTER TABLE PartitionTable1 REBUILD PARTITION = 1
WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);
GO
Aşağıdaki örnek, seçenekle COLUMNSTORE_ARCHIVE sıkıştırılmış bir columnstore tablo bölümünün sıkıştırmasını kaldırmaktadır. Veriler geri yüklendiğinde, tüm columnstore tabloları için kullanılan columnstore sıkıştırması ile sıkıştırılmaya devam eder.
Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri ve Azure SQL Veritabanı.
ALTER TABLE PartitionTable1 REBUILD PARTITION = 1
WITH (DATA_COMPRESSION = COLUMNSTORE);
GO
C. Tablolar arasında bölümler arasında geçiş yapma
Aşağıdaki örnek, bölüm düzeni myRangePS1 veritabanında zaten oluşturulduğu varsayılarak bölümlenmiş bir tablo oluşturur. Ardından, bölümlenmiş tabloyla aynı yapıya sahip ve tablo PARTITION 2PartitionTable aynı dosya grubunda bölümlenmemiş bir tablo oluşturulur. Tablo PARTITION 2PartitionTable verileri NonPartitionTabletabloya geçirilir.
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. Bölümlenmiş tablolarda kilit yükseltmesine izin ver
Aşağıdaki örnek, kilit yükseltmesini bölümlenmiş bir tablodaki bölüm düzeyine etkinleştirir. Tablo bölümlenmemişse, kilit yükseltme düzeyi TABLE ayarlanır.
Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.
ALTER TABLE dbo.T1 SET (LOCK_ESCALATION = AUTO);
GO
E. Tabloda değişiklik izlemeyi yapılandırma
Aşağıdaki örnek, Person.Person tablosunda değişiklik izlemeyi etkinleştirir.
Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.
USE AdventureWorks2022;
ALTER TABLE Person.Person ENABLE CHANGE_TRACKING;
Aşağıdaki örnek, değişiklik izlemeyi etkinleştirir ve değişiklik sırasında güncelleştirilen sütunların izlenmesini etkinleştirir.
Şunlar için geçerlidir: SQL Server.
USE AdventureWorks2022;
GO
ALTER TABLE Person.Person ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON);
Aşağıdaki örnek, Person.Person tablosunda değişiklik izlemeyi devre dışı bırakır.
Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.
USE AdventureWorks2022;
GO
ALTER TABLE Person.Person DISABLE CHANGE_TRACKING;
Kısıtlamaları ve tetikleyicileri devre dışı bırakma ve etkinleştirme
A. Kısıtlamayı devre dışı bırakma ve yeniden etkinleştirme
Aşağıdaki örnek, verilerde kabul edilen ücretleri sınırlayan bir kısıtlamayı devre dışı bırakır.
NOCHECK CONSTRAINT, kısıtlamayı devre dışı bırakmak ve genellikle kısıtlamayı ihlal edecek bir eklemeye izin vermek için ALTER TABLE ile birlikte kullanılır.
CHECK CONSTRAINT kısıtlamayı yeniden etkinleştirir.
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. Tetikleyiciyi devre dışı bırakma ve yeniden etkinleştirme
Aşağıdaki örnek, tetikleyiciyi devre dışı bırakmak ve genellikle tetikleyiciyi ihlal edecek bir eklemeye izin vermek için DISABLE TRIGGERALTER TABLE seçeneğini kullanır.
ENABLE TRIGGER daha sonra tetikleyiciyi yeniden etkinleştirmek için kullanılır.
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
Çevrimiçi işlemler
A. Düşük öncelikli bekleme seçeneklerini kullanarak çevrimiçi dizin yeniden oluşturma
Aşağıdaki örnek, düşük öncelikli bekleme seçeneklerini belirterek çevrimiçi dizin yeniden oluşturma işleminin nasıl gerçekleştirileceğini gösterir.
Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri ve Azure SQL Veritabanı.
ALTER TABLE T1 REBUILD WITH (
PAD_INDEX = ON,
ONLINE = ON (
WAIT_AT_LOW_PRIORITY (MAX_DURATION = 4 MINUTES, ABORT_AFTER_WAIT = BLOCKERS)
)
);
B. Çevrimiçi alter sütunu
Aşağıdaki örnekte, seçeneğiyle sütun değiştirme işleminin nasıl çalıştırılacakları gösterilmektedir ONLINE .
Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri ve Azure SQL Veritabanı.
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
Sistem sürümü oluşturma
Aşağıdaki dört örnek, sistem sürümü oluşturma kullanma söz dizimini tanımanıza yardımcı olur. Ek yardım için bkz. Sistem sürümüne sahip zamana bağlı tabloları kullanmaya başlama.
Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri ve Azure SQL Veritabanı.
A. Mevcut tablolara sistem sürümü oluşturma ekleme
Aşağıdaki örnekte, mevcut bir tabloya sistem sürümü oluşturmanın nasıl ekleneceği ve gelecekteki bir geçmiş tablosunun nasıl oluşturulacağı gösterilmektedir. Bu örnekte, birincil anahtar tanımlanmış InsurancePolicy adlı bir tablo olduğu varsayılır. Bu örnek, sistem sürümü oluşturma için yeni oluşturulan dönem sütunlarını başlangıç ve bitiş saatlerinin varsayılan değerlerini kullanarak doldurur çünkü bu değerler null olamaz. Bu örnekte, geçerli tabloyla etkileşim kuran mevcut uygulamalar üzerinde hiçbir etki olmadığından emin olmak için yan tümcesi kullanılır HIDDEN . Ayrıca yalnızca SQL Veritabanı'nda kullanılabilenleri kullanır HISTORY_RETENTION_PERIOD .
--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. Sistem sürümü oluşturma özelliğini kullanmak için mevcut çözümü geçirme
Aşağıdaki örnekte, zamansal desteği taklit etmek için tetikleyicileri kullanan bir çözümden sistem sürümü oluşturma işlemine nasıl geçilmesi gösterilmektedir. Örnekte, mevcut çözümü için bir ProjectTask tablo ve ProjectTaskHistory tablo kullanan, dönemleri için ve Changed Date sütunlarını kullananRevised Date, bu dönem sütunlarının datetime2 veri türünü kullanmadığı ve tablonun tanımlanmış bir birincil anahtarı olduğu ProjectTask varsayılır.
-- 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. Tablo şemasını değiştirmek için sistem sürümü oluşturmayı devre dışı bırakma ve yeniden etkinleştirme
Bu örnekte, Department tablosunda sistem sürümü oluşturmayı devre dışı bırakma, sütun ekleme ve sistem sürümü oluşturmayı yeniden etkinleştirme gösterilmektedir. Tablo şemasını değiştirmek için sistem sürümü oluşturmayı devre dışı bırakmak gerekir. DBA'nın sistem sürümünü yeniden etkinleştirirken veri tutarlılığı denetimini atlamasını ve bir performans avantajı elde etmesini sağlayan tablo şemasını güncelleştirirken her iki tabloda da güncelleştirme yapılmasını önlemek için bu adımları bir işlem içinde gerçekleştirin. İstatistik oluşturma, bölümler arasında geçiş yapma veya tablolardan birine veya her iki tabloya sıkıştırma uygulama gibi görevler için sistem sürümü oluşturmanın devre dışı bırakılması gerekmez.
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. Sistem sürümünü kaldırma
Bu örnekte, Department tablosundan sistem sürümü oluşturmanın nasıl tamamen kaldırılacağı ve DepartmentHistory tablosunun nasıl bırakılacağı gösterilmektedir. İsteğe bağlı olarak, sistem sürüm oluşturma bilgilerini kaydetmek için sistem tarafından kullanılan dönem sütunlarını da bırakmak isteyebilirsiniz. Sistem sürümü oluşturma etkinken Department veya DepartmentHistory tablolarını bırakamazsınız.
ALTER TABLE Department
SET (SYSTEM_VERSIONING = OFF);
ALTER TABLE Department
DROP PERIOD FOR SYSTEM_TIME;
DROP TABLE DepartmentHistory;
Örnekler: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)
Aşağıdaki A-C örnekleri, FactResellerSales veritabanındaki tablosunu kullanır.
A. Tablonun bölümlenip bölümlenmediğini belirleme
Tablo FactResellerSales bölümlenmişse aşağıdaki sorgu bir veya daha fazla satır döndürür. Tablo bölümlenmemişse, hiçbir satır döndürülemez.
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. Bölümlenmiş tablo için sınır değerlerini belirleme
Aşağıdaki sorgu, FactResellerSales tablosundaki her bölüm için sınır değerlerini döndürür.
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. Bölümlenmiş tablo için bölüm sütununu belirleme
Aşağıdaki sorgu, tablo için bölümleme sütununun FactResellerSales adını döndürür.
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. İki bölümü birleştirme
Aşağıdaki örnek, bir tablodaki iki bölümü birleştirir.
Customer tablosu aşağıdaki tanıma sahiptir:
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)
)
);
Aşağıdaki komut 10 ve 25 bölüm sınırlarını birleştirir.
ALTER TABLE Customer MERGE RANGE (10);
Tablo için yeni DDL şöyledir:
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. Bölümü bölme
Aşağıdaki örnek, bir tablodaki bölümü böler.
Customer tablosunda aşağıdaki DDL vardır:
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)
)
);
Aşağıdaki komut, 50 ile 100 arasında 75 değerine bağlı yeni bir bölüm oluşturur.
ALTER TABLE Customer SPLIT RANGE (75);
Tablo için yeni DDL şöyledir:
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. Bölümü geçmiş tablosuna taşımak için SWITCH kullanma
Aşağıdaki örnek, Orders tablosunun bir bölümündeki verileri OrdersHistory tablosundaki bir bölüme taşır.
Orders tablosunda aşağıdaki DDL vardır:
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')
)
);
Bu örnekte, Orders tablosunda aşağıdaki bölümler bulunur. Her bölüm veri içerir.
| Partition | Veri var mı? | Sınır aralığı |
|---|---|---|
| 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 |
- Bölüm 1 (veri var):
OrderDate < '2004-01-01' - Bölüm 2 (veri var):
'2004-01-01' <= OrderDate < '2005-01-01' - Bölüm 3 (veri var):
'2005-01-01' <= OrderDate< '2006-01-01' - Bölüm 4 (veri var):
'2006-01-01'<= OrderDate < '2007-01-01' - Bölüm 5 (veri var):
'2007-01-01' <= OrderDate
OrdersHistory tablosunda, Orders tablosuyla aynı sütunlara ve sütun adlara sahip aşağıdaki DDL bulunur. Her ikisi de id sütununda karma olarak dağıtılır.
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')
)
);
Sütun ve sütun adlarının aynı olması gerekse de bölüm sınırlarının aynı olması gerekmez. Bu örnekte, OrdersHistory tablosunda aşağıdaki iki bölüm vardır ve her iki bölüm de boş olur:
- Bölüm 1 (veri yok):
OrderDate < '2004-01-01' - Bölüm 2 (boş):
'2004-01-01' <= OrderDate
Önceki iki tablo için aşağıdaki komut, OrderDate < '2004-01-01' tablosundan Orders tablosuna OrdersHistory olan tüm satırları taşır.
ALTER TABLE Orders SWITCH PARTITION 1 TO OrdersHistory PARTITION 1;
Sonuç olarak, Orders içindeki ilk bölüm boş olur ve OrdersHistory'daki ilk bölüm veri içerir. Tablolar artık aşağıdaki gibi görünür:
Orders tablosu
- Bölüm 1 (boş):
OrderDate < '2004-01-01' - Bölüm 2 (veri var):
'2004-01-01' <= OrderDate < '2005-01-01' - Bölüm 3 (veri var):
'2005-01-01' <= OrderDate< '2006-01-01' - Bölüm 4 (veri var):
'2006-01-01'<= OrderDate < '2007-01-01' - Bölüm 5 (veri var):
'2007-01-01' <= OrderDate
OrdersHistory tablosu
- Bölüm 1 (veri var):
OrderDate < '2004-01-01' - Bölüm 2 (boş):
'2004-01-01' <= OrderDate
Tabloyu temizlemek Orders için, bölümleri birleştirerek ve 1 aşağıdaki gibi boş bölümü 2 kaldırabilirsiniz:
ALTER TABLE Orders MERGE RANGE ('2004-01-01');
Birleştirme işleminden sonra Orders tablosunda aşağıdaki bölümler yer alır:
Orders tablosu
- Bölüm 1 (veri var):
OrderDate < '2005-01-01' - Bölüm 2 (veri var):
'2005-01-01' <= OrderDate< '2006-01-01' - Bölüm 3 (veri var):
'2006-01-01'<= OrderDate < '2007-01-01' - Bölüm 4 (veri var):
'2007-01-01' <= OrderDate
Bir yıl daha geçtiğini ve 2005 yılını arşivlemeye hazır olduğunuzu varsayalım. Boş bölümü aşağıdaki gibi bölerek OrdersHistory tablosunda 2005 yılı için boş bir bölüm ayırabilirsiniz:
ALTER TABLE OrdersHistory SPLIT RANGE ('2005-01-01');
Bölmeden sonra OrdersHistory tablosunda aşağıdaki bölümler vardır:
OrdersHistory tablosu
- Bölüm 1 (veri var):
OrderDate < '2004-01-01' - Bölüm 2 (boş):
'2004-01-01' < '2005-01-01' - Bölüm 3 (boş):
'2005-01-01' <= OrderDate
İlgili içerik
- sys.tables
- sp_rename
- sp_help
- OLAY VERILERI (Transact-SQL)
- TABLO OLUŞTUR (Transact-SQL)
- DROP TABLE (Transact-SQL)
- TABLOYU column_constraint (Transact-SQL)
- TABLOYU column_definition (Transact-SQL)
- ALTER TABLE hesaplanmış_sütun_tanımı (Transact-SQL)
- ALTER TABLE indeks_seçeneği (Transact-SQL)
- TABLOYU table_constraint (Transact-SQL)