Aracılığıyla paylaş


ALTER TABLE (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnalytics Platform Sistemi (PDW)Warehouse in Microsoft FabricSQL veritabanında Microsoft Fabric

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.

Not

Ş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, bellek için iyileştirilmiş tablolar Microsoft Fabric'teki SQL veritabanında kullanılamaz.

Önemli

ALTER TABLE söz dizimi, 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:

Söz dizimi kuralları hakkında daha fazla bilgi için bkz.Transact-SQL söz dizimi kuralları.

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 } )
}

Not

Daha fazla bilgi için bkz:

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

-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse

ALTER TABLE { database_name.schema_name.source_table_name | schema_name.source_table_name | source_table_name }
{
    ALTER COLUMN column_name
        {
            type_name [ ( precision [ , scale ] ) ]
            [ COLLATE Windows_collation_name ]
            [ NULL | NOT NULL ]
        }
    | ADD { <column_definition> | <column_constraint> FOR column_name} [ ,...n ]
    | DROP { COLUMN column_name | [CONSTRAINT] constraint_name } [ ,...n ]
    | REBUILD {
            [ PARTITION = ALL [ WITH ( <rebuild_option> ) ] ]
          | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_option> ] ]
      }
    | { SPLIT | MERGE } RANGE (boundary_value)
    | SWITCH [ PARTITION source_partition_number
        TO target_table_name [ PARTITION target_partition_number ] [ WITH ( TRUNCATE_TARGET = ON | OFF )
}
[;]

<column_definition>::=
{
    column_name
    type_name [ ( precision [ , scale ] ) ]
    [ <column_constraint> ]
    [ COLLATE Windows_collation_name ]
    [ NULL | NOT NULL ]
}

<column_constraint>::=
    [ CONSTRAINT constraint_name ]
    {
        DEFAULT constant_expression
        | PRIMARY KEY NONCLUSTERED (column_name [ ,... n ]) NOT ENFORCED -- Applies to Azure Synapse Analytics only
        | UNIQUE (column_name [ ,... n ]) NOT ENFORCED -- Applies to Azure Synapse Analytics only
    }
<rebuild_option > ::=
{
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
        [ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]
    | XML_COMPRESSION = { ON | OFF }
        [ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]
}

<single_partition_rebuild_option > ::=
{
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
}

Not

Azure Synapse Analytics'teki sunucusuz SQL havuzu yalnızca dış ve geçici tabloları destekler.

Dokuda Ambar söz dizimi

-- Syntax for Warehouse om Microsoft Fabric:

ALTER TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
{
  ADD  { column_name <data_type> [COLLATE collation_name] [ <column_options> ] } [ ,...n ]
| ADD { <column_constraint> FOR column_name} [ ,...n ]
| DROP { [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
    }

Bağımsız değişken

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 COLUMN

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.

  • Tablo için ROWGUIDCOL.

  • Hesaplanan sütun veya hesaplanan sütunda kullanılır.

  • CREATE STATISTICS deyimi tarafından oluşturulan istatistiklerde kullanılır. ALTER COLUMN'ın başarılı olması için kullanıcıların istatistikleri bırakmak için DROP STATISTICS çalıştırması gerekir. 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>');
    

    Not

    Sorgu iyileştiricisi tarafından otomatik olarak oluşturulan istatistikler ALTER COLUMN tarafından otomatik olarak bırakılır.

  • BİrİnCİl ANAHTAR veya [YABANCI ANAHTAR] BAŞVURULAR kısıtlamasında kullanılır.

  • CHECK veya UNIQUE kısıtlamasında kullanılır. Ancak, CHECK veya UNIQUE kısıtlamasında kullanı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)veya xml 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, nchar veya nvarchar sütununu karakter veya varcharolarak değiştirmek, genişletilmiş karakterlerin dönüştürülmesine neden olabilir. Daha fazla bilgi için bkz. CAST ve CONVERT. Bir sütunun duyarlığını veya ölçeğini azaltmak verilerin kesilmesine neden olabilir.

Not

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 NOT NULLNULLolarak değiştirilemez.

Always Encrypted kullanırken (güvenli kuşatmalar olmadan), değiştirilen sütun 'ENCRYPTED WITH' ile şifrelenirse, veri türünü uyumlu bir veri türüne (INT gibi BIGINT olarak) değiştirebilirsiniz, ancak herhangi bir şifreleme ayarı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. Bu durumda 511 veya 1708 hata 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. zaman damgası veri türü sütunu için column_name belirtmezseniz zaman damgası adı kullanılır.

Not

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 kullanılmadan önce CREATE TYPE 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 kullanılmadan önce CREATE TYPE 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_namezaman damgası olamaz.
  • ALTER COLUMN için ANSI_NULL varsayılanlar her zaman açıktır; belirtilmezse, sütun null atanabilir.
  • ANSI_PADDING doldurma, ALTER COLUMN için her zaman ON'dır.
  • Değiştirilen sütun bir kimlik sütunuysa, new_data_type kimlik özelliğini destekleyen bir veri türü olmalıdır.
  • SET ARITHABORT için geçerli ayar yoksayılır. ALTER TABLE, ARITHABORT on olarak ayarlanmış gibi çalışır.

Not

COLLATE yan tümcesi belirtilmezse, bir sütunun veri türünü değiştirmek, veritabanının varsayılan harmanlamada harmanlama değişikliğine neden olur.

duyarlık

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.

ölçeklendirme

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

için geçerlidir: SQL Server (SQL Server 2008 (10.0.x) ve üzeri) 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, ncharve 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ı ALTER TABLE deyimlerini kullanarak 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ğine sahip olamaz:

  • CHECK kısıtlaması, FOREIGN KEY kısıtlaması veya hesaplanan sütunlar sütuna başvuruda bulunursa, sütun değiştirildi.
  • Sütunda herhangi bir dizin, istatistik veya tam metin dizini oluşturulursa. 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şvuruda bulunursa.

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 ALTER TABLE ile yalnızca varsayılan olarak belirtilmişse veya tablo boşsa eklenir. Hesaplanan sütunlar için NOT NULL değerini yalnızca PERSISTED olarak da belirttiyseniz belirtebilirsiniz. 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, tabloda var olan her satır için yeni sütunda varsayılan değeri depolamak için WITH VALUES kullanabilirsiniz.

Yeni sütun null değerlere izin vermiyorsa ve tablo boş değilse, yeni sütuna 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.

BİRİnCİl ANAHTAR kısıtlamalarındaki sütunlar dışında NOT NULL sütununu null değerlere izin vermek üzere zorlamak için ALTER COLUMN içinde NULL belirtebilirsiniz. ALTER COLUMN'da NOT NULL değerini yalnızca sütun null değer içermiyorsa belirtebilirsiniz. ALTER COLUMN NOT NULL değerine izin verilmeden önce null değerlerin bir değere güncelleştirilmesi gerekir, örneğin:

UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL;
ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR(20) NOT NULL;

CREATE TABLE veya ALTER TABLE deyimleriyle 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 uyumsuz sütunlar için NULL veya NOT NULL olarak 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.

Not

ALTER COLUMN ile NULL veya NOT NULL belirtilirse, [(duyarlık [, ölçek ])] new_data_type de belirtilmelidir. Veri türü, duyarlık ve ölçek değiştirilmezse geçerli sütun değerlerini belirtin.

[ {ADD | DROP} ROWGUIDCOL ]

için geçerlidir: SQL Server (SQL Server 2008 (10.0.x) ve üzeri) ve Azure SQL Veritabanı.

ROWGUIDCOL özelliğinin belirtilen sütuna eklendiğini veya bırakıldığını belirtir. ROWGUIDCOL, sütunun satır GUID sütunu olduğunu gösterir. Tablo başına tek bir uniqueidentifier sütununu ROWGUIDCOL sütunu olarak ayarlayabilirsiniz. Ayrıca ROWGUIDCOL özelliğini yalnızca bir uniqueidentifier sütununa atayabilirsiniz. ROWGUIDCOL'i kullanıcı tanımlı veri türündeki bir sütuna atayamazsınız.

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 INSERT deyimlerinde NEWID() veya NEWSEQUENTIALID() işlevini kullanın. Ya da sütun için varsayılan olarak NEWID() veya NEWSEQUENTIALID() işlevini belirtin.

[ {ADD | DROP} KALıCı ]

PERSISTED özelliğinin belirtilen sütuna eklendiğini veya bırakıldığını belirtir. Sütun, belirlenici bir ifadeyle tanımlanan hesaplanan bir sütun olmalıdır. PERSISTED olarak belirtilen sütunlar için Veritabanı Altyapısı hesaplanan değerleri fiziksel olarak tabloda 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 PERSISTED olarak işaretleyerek, belirlenici ancak kesin olmayan ifadelerde tanımlanan hesaplanan sütunlarda dizinler oluşturabilirsiniz. Daha fazla bilgi için bkz.Hesaplanan Sütunlarda Dizinler .

hesaplanan sütunlarda veya dizinlenmiş görünümlerde dizin oluştururken veya değiştirirken SET QUOTED_IDENTIFIER AÇıK olmalıdır. Daha fazla bilgi için bkz. set QUOTED_IDENTIFIER (Transact-SQL).

Bölümlenmiş tablonun bölümleme sütunu olarak kullanılan tüm hesaplanan sütunların AÇıKÇA PERSISTED olarak işaretlenmesi gerekir.

Not

Fabric SQL veritabanında hesaplanan sütunlara izin verilir ancak şu anda Fabric OneLake'e yansıtılmaz.

ÇOĞALTMA IÇIN BıRAKMA

için geçerlidir: SQL Server (SQL Server 2008 (10.0.x) ve üzeri) 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.

SEYREK

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ı NOT NULL olarak ayarlayamazsı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 REBUILD yan tümcesini 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 ')

için geçerlidir: SQL Server (SQL Server 2016 (13.x) ve üzeri) 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()

ALTER ANY MASK izni gerektirir.

Maskeyi bırakmak için DROP MASKEDkullanın. İşlev parametreleri için bkz. Dinamik Veri Maskeleme.

Maske ekleme ve bırakma için ALTER ANY MASK izni gerekir.

WITH ( ONLINE = ON | KAPALI) <bir sütun> değiştirme için geçerlidir

için geçerlidir: SQL Server (SQL Server 2016 (13.x) ve üzeri) 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 KAPALI'dır. 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ının alter column işlemi boyunca değiştirilen sütuna başvurmasını ve bu sayede sorguların her zamanki gibi çalışmasına olanak tanır. İş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, sütuna bağımlılık alabilen tüm işlemler (dizin, görünümler vb.) uygun bir hatayla engellenebilir veya başarısız olabilir. 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.
  • Değiştirilen sütuna kümelenmemiş dizinler tarafından başvurulduğunda, bir sütunun NOT NULL'tan NULL'a değiştirilmesi çevrimiçi bir işlem olarak desteklenmez.
  • Çevrimiçi ALTER, sütuna bir denetim kısıtlaması tarafından başvurulduğunda ve ALTER işlemi sütunun duyarlığı (sayısal veya tarih saat) kısıtladığında desteklenmez.
  • WAIT_AT_LOW_PRIORITY seç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. ALTER sütunu, ÇEVRİmİÇİ seçeneği için hangi 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 YABANCı ANAHTAR veya CHECK kısıtlamasına göre doğrulanıp doğrulanmayacağını belirtir. Belirtmezseniz, YENI kısıtlamalar için WITH CHECK, yeniden etkinleştirilen kısıtlamalar için ISE NOCHECK ile varsayılır.

Mevcut verilerde yeni CHECK veya FOREIGN KEY kısıtlamalarını doğrulamak istemiyorsanız, NOCHECK ile kullanın. 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 NOCHECK ile 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ştirici, NOCHECK ile tanımlanan kı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.

Önemli

ALTER TABLE deyimi kullanılmadan CREATE INDEX, DROP INDEX, ALTER INDEXve PAD_INDEX deyimleri bellek için iyileştirilmiş tablolardaki dizinler için desteklenmez.

EKLEMEK

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.

Not

Tablodaki tüm mevcut sütunlar değiştirildikten sonra yeni sütunlar eklenir.

Önemli

ALTER TABLE deyimi kullanılmadan CREATE INDEX , DROP INDEX, ALTER INDEXve 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 )

için geçerlidir: SQL Server (SQL Server 2017 (14.x) ve üzeri) 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 SYSTEM_TIME için DÖNEM EKLE bağımsız değişkeninin bir parçası olarak yeni sütunlar oluşturabilirsiniz. Sütunları datetime2 veri türüyle ayarlayın ve NOT NULL olarak tanımlayın. Nokta sütununu NULL olarak tanımlarsanız hata sonucu verir. column_constraint ve/veya system_start_time ve system_end_time sütunları için Sütunlar için Varsayılan Değerler Belirt'i tanımlayabilirsiniz. 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.

Bu bağımsız değişkeni SET SYSTEM_VERSIONING bağımsız değişkeniyle kullanarak var olan bir tabloyu geçici bir tablo haline getirin. Daha fazla bilgi için bkz. Zamana Bağlı Tablolar ve Azure SQL Veritabanı'nde Zamana Bağlı Tablolarla Çalışmaya Başlama.

SQL Server 2017 (14.x) itibarıyla, kullanıcılar bu sütunları örtük olarak gizlemek için HIDDEN bayrağıyla bir veya her iki nokta sütununu işaretleyebilir ve SELECT * FROM <table_name> sütunlar için değer döndürmez. 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.

DAMLA

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.

Not

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 dropped_ledger_table içindeki sys.tables sütunu 1olarak ayarlanarak bırakılan sütun olarak 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.

CONSTRAINT 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.

Tabloda bir XML dizini varsa BİRİnCİl ANAHTAR kısıtlaması bırakılamaz.

İNDİS index_name

index_name tablodan kaldırıldığını belirtir.

ALTER TABLE söz dizimi ... ADD/DROP/ALTER INDEX yalnızca bellek için iyileştirilmiş tablolar için desteklenir.

Önemli

ALTER TABLE deyimi kullanılmadan CREATE INDEX, DROP INDEX, ALTER INDEXve 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 INCLUDE olarak dizinde kullanılır
  • CHECK, FOREIGN KEY, UNIQUE veya PRIMARY KEY kısıtlamasında kullanılır.
  • DEFAULT anahtar sözcüğüyle tanımlanan veya varsayılan nesneye bağlı bir varsayılan değerle ilişkilendirildi.
  • Bir kurala bağlı.

Not

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İ

için geçerlidir: SQL Server (SQL Server 2016 (13.x) ve üzeri) ve Azure SQL Veritabanı.

Sistemin sistem sürümü oluşturma için kullanacağı sütunların belirtimini bırakır.

WITH <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

için geçerlidir: SQL Server (SQL Server 2008 (10.0.x) ve üzeri) 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. En yüksek paralellik derecesini yapılandırma Sunucu Yapılandırma Seçeneği.

Paralel plan yürütmede kullanılan işlemci sayısını sınırlamak için MAXDOP seçeneğini kullanın. Maksimum değer 64 işlemcidir.

max_degree_of_parallelism aşağıdaki değerlerden biri olabilir:

  • 1

    Paralel plan oluşturmayı bastırır.

  • >1

    Paralel 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.

Not

Paralel dizin işlemleri SQL Server'ın her sürümünde kullanılamaz. Daha fazla bilgi için bkz. sql server 2022sürümleri ve desteklenen özellikleri.

Ç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 KAPALI'dır. REBUILD'ı ÇEVRİmİÇİ işlem olarak çalıştırabilirsiniz.

ÜZERİNDE
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. Yerel geçici tabloda bir dizin oluşturulurken ONLINE ayarı ON olarak ayarlanamaz. Yalnızca tek iş parçacıklı yığın yeniden derleme işlemine izin verilir.

SWITCH veya çevrimiçi dizin yeniden oluşturma için DDL'yi çalıştırmak için, belirli bir tabloda çalışan tüm etkin engelleme işlemlerinin tamamlanması gerekir. yürütürken, SWITCH veya 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.

KAPALI
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 SELECT deyimleri gibi okuma 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.

Not

Çevrimiçi dizin işlemleri SQL Server'ın her sürümünde kullanılamaz. Daha fazla bilgi için bkz. sql server 2022sürümleri ve desteklenen özellikleri.

{ partition_scheme_name(column_name [ ,...n ] ) | dosya grubu | "default" }

için geçerlidir: SQL Server (SQL Server 2008 (10.0.x) ve üzeri) 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.

Not

Bu bağlamda, varsayılan bir anahtar sözcük değildir. Varsayılan dosya grubu için bir tanımlayıcıdır ve TAŞı "varsayılan" veya MOVE TO [varsayılan]gibi sınırlandırılmalıdır. "varsayılan" belirtilirse, geçerli oturum için QUOTED_IDENTIFIER seçeneği ON olmalıdır. 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 FOREIGN KEY ve CHECK kısıtlamalarıyla kullanılabilir. NOCHECK belirtildiğinde 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 KEY ve UNIQUE kısıtlamaları devre dışı bırakılamaz.

TÜM
Tüm kısıtlamaların NOCHECK seçeneğiyle devre dışı bırakıldığını veya CHECK seçeneğiyle etkinleş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 INSERT, UPDATE veya DELETE deyimleri tabloda çalıştırıldığında tetikleyicideki eylemler tetikleyici yeniden etkinleştirilene kadar gerçekleştirilmez.

TÜM
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

için geçerlidir: SQL Server (SQL Server 2008 (10.0.x) ve üzeri) 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.

WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )

için geçerlidir: SQL Server (SQL Server 2008 (10.0.x) ve üzeri) 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 KAPALI'dır.

[ BÖLÜM source_partition_number_expression ] ÖĞESINI [ schema_nameOLARAK DEĞIŞTIRIN. ] target_table [ BÖLÜM target_partition_number_expression ]

için geçerlidir: SQL Server (SQL Server 2008 (10.0.x) ve üzeri) 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 SWITCH kısıtlaması için 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ş. Bölümleme işlemlerinin çalıştırılabilmesi için önce, derlenmemiş columnstore dizinlerini geçerli biçime (güncelleştirilebilir) yeniden oluşturmanız gerekir.

Sınırlamaları

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" })

için geçerlidir: SQL Server (SQL Server 2008 (10.0.x) ve üzeri). Azure SQL Veritabanı FILESTREAMdesteklemez.

FILESTREAM verilerinin depolandığı yeri belirtir.

SET FILESTREAM_ON yan tümcesiyle ALTER TABLE, yalnızca tabloda FILESTREAM sütunu yoksa başarılı olur. İkinci bir ALTER TABLE deyimini kullanarak FILESTREAM sütunları ekleyebilirsiniz.

partition_scheme_namebelirtirseniz, CREATE TABLE kuralları uygulanır. Tablonun satır verileri için zaten bölümlenmiş olduğundan ve bölüm düzeninin FILESTREAM bölüm düzeniyle aynı bölüm işlevini ve sütunlarını kullandığından emin olun.

filestream_filegroup_name fileSTREAM dosya grubunun adını belirtir. Dosya grubu, CREATE DATABASE veya ALTER DATABASE deyimi veya hata sonuçları kullanılarak dosya grubu için tanımlanmış bir dosyaya sahip olmalıdır.

"varsayılan" DEFAULT özellik kümesine sahip FILESTREAM dosya grubunu belirtir. FILESTREAM dosya grubu yoksa bir hata oluşur.

"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. Bir tabloyla ilişkili tüm FILESTREAM verilerini silmek için SET FILESTREAM_ON = "NULL" kullanın.

SET ( SYSTEM_VERSIONING = { KAPALI | ON [ ( HISTORY_TABLE = schema_name . history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ] } )

için geçerlidir: SQL Server (SQL Server 2016 (13.x) ve üzeri) 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şkeni kullanılmazsa, bu geçmiş tablosunun adı MSSQL_TemporalHistoryFor<primary_table_object_id>olur. 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.

  • Tarih
  • DateTime
  • DateTime2
  • SmallDateTime
  • DateTimeOffset

RETENTION_PERIOD = { SONSUZ | sayı {GÜN | GÜN | HAFTA | HAFTALAR | AY | AYLAR | YIL | YILLAR }}
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 } )

için geçerlidir: SQL Server (SQL Server 2008 (10.0.x) ve üzeri) ve Azure SQL Veritabanı.

Bir tablo için izin verilen kilit yükseltme yöntemlerini belirtir.

OTOMATİK
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 TABLE ayrıntı düzeyine yükseltilmeyecektir.
  • Tablo bölümlenmemişse, kilit yükseltmesi TABLE ayrıntı düzeyine yapılır.

MASA
Kilit yükseltmesi, tablo bölümlenmiş veya bölümlenmemiş olsun tablo düzeyinde ayrıntı düzeyinde yapılır. TABLE varsayılan değerdir.

DEVRE DIŞI BIRAKMAK
Ç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.

YENİ -DEN İNŞA

Bölümlenmiş tablodaki tüm bölümler dahil olmak üzere bir tablonun tamamını yeniden oluşturmak için REBUILD WITH söz dizimini kullanın. Tabloda kümelenmiş dizin varsa, REBUILD seçeneği kümelenmiş dizini yeniden oluşturur. REBUILD, ÇEVRİmİÇİ bir işlem olarak çalıştırılabilir.

Bölümlenmiş bir tablodaki tek bir bölümü yeniden oluşturmak için BÖLÜMİ DERLE söz dizimini kullanın.

BÖLÜM = TÜMÜ

için geçerlidir: SQL Server (SQL Server 2008 (10.0.x) ve üzeri) 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.

REBUILD işlemiyle 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

için geçerlidir: SQL Server (SQL Server 2008 (10.0.x) ve üzeri) 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 Tablosu veya belirtilen bölümler sıkıştırılamaz. Bu seçenek columnstore tablolarına uygulanmaz.

SATIR Tablosu 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.

PAGE Tablosu 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
için geçerlidir: SQL Server (SQL Server 2014 (12.x) ve üzeri) ve Azure SQL Veritabanı.

Yalnızca columnstore tablolarına uygulanır. COLUMNSTORE, COLUMNSTORE_ARCHIVE seçeneğiyle sıkıştırılmış bir bölümün sıkıştırmasını kaldırmayı belirtir. 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
için geçerlidir: SQL Server (SQL Server 2014 (12.x) ve üzeri) ve Azure SQL Veritabanı.

Yalnızca kümelenmiş columnstore diziniyle depolanan tablolar olan columnstore tabloları için geçerlidir. COLUMNSTORE_ARCHIVE belirtilen bölümü daha küçük bir boyuta daha fazla 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.

Microsoft Fabric'teki SQL veritabanında ALTER TABLE REBUILD PARTITION WITH DATA COMPRESSION = ROW veya PAGE izin verilmez.

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:

ÜZERİNDE
xml veri türünü kullanan sütunlar sıkıştırılır.

KAPALI
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 KAPALI'dır. REBUILD'ı ÇEVRİmİÇİ işlem olarak çalıştırabilirsiniz.

ÜZERİNDE
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.

Not

Çevrimiçi dizin yeniden derlemesi, bu bölümün ilerleyen bölümlerinde açıklanan low_priority_lock_wait seçeneklerini ayarlayabilir.

KAPALI
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

için geçerlidir: SQL Server (SQL Server 2008 (10.0.x) ve üzeri) 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

için geçerlidir: SQL Server (SQL Server 2012 (11.x) ve üzeri).

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 )

için geçerlidir: SQL Server (SQL Server 2012 (11.x) ve üzeri). Azure SQL Veritabanı FILETABLEdesteklemez.

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

için geçerlidir: SQL Server (SQL Server 2017 (14.x) ve üzeri).

Bir tablo için Stretch Database'i etkinleştirir veya devre dışı bırakır. Daha fazla bilgi için bkz. Stretch Database.

Önemli

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 Esnetme Veritabanını 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.

önkoşulları. 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.

İzinleri. Bir veritabanı veya tablo için Stretch'i etkinleştirmek için db_owner izinleri gerekir. Bir tablo için Stretch'i etkinleştirmek için tabloda ALTER izinleri de gerekir.

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 } ]

için geçerlidir: SQL Server (SQL Server 2017 (14.x) ve üzeri).

İ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.

Önemli

Kötü performans gösteren bir filtre koşulu sağlarsanız, veri geçişi de düşük performans gösterir. Stretch Database, CROSS APPLY işlecini kullanarak tabloya filtre koşulunu uygular.

Filtre koşulu belirtmezseniz tablonun tamamı geçirilir.

Bir filtre koşulu belirttiğinizde, MIGRATION_STATEde belirtmeniz gerekir.

MIGRATION_STATE = { GIDEN | GELEN | DURAKLATILDI }

için geçerlidir: SQL Server (SQL Server 2017 (14.x) ve üzeri).

  • SQL Server'dan Azure'a veri geçirmek için OUTBOUND belirtin.

  • Tablo için uzak verileri Azure'dan SQL Server'a geri kopyalamak ve tablo için Esnetmeyi devre dışı bırakmak için INBOUND belirtin. 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 PAUSED belirtin. Daha fazla bilgi için bkz. Veri geçişlerini duraklatma ve sürdürme - Stretch Database.

WAIT_AT_LOW_PRIORITY

için geçerlidir: SQL Server (SQL Server 2014 (12.x) ve üzeri) 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. DÜŞÜK ÖNCELİkTE BEKLE seçeneğinin atlanması, WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE)ile aynıdır.

MAX_DURATION = saat [MINUTES ]
için geçerlidir: SQL Server (SQL Server 2014 (12.x) ve üzeri) ve Azure SQL Veritabanı.

dakika cinsinden belirtilen bir tamsayı değeri olan bekleme süresi, SWITCH veya çevrimiçi dizin yeniden oluşturma kilitleri DDL komutunu çalıştırırken düşük öncelikli olarak bekler. İşlem MAX_DURATION süreyle engellenirse, ABORT_AFTER_WAIT eylemlerden biri çalıştırılır. MAX_DURATION zaman her zaman dakika cinsindendir ve MINUTESsözcüğünü atlayabilirsiniz.

ABORT_AFTER_WAIT = [YOK | SELF | BLOCKERS } ]

için geçerlidir: SQL Server (SQL Server 2014 (12.x) ve üzeri) ve Azure SQL Veritabanı.

Hiç kimse
Normal (normal) önceliğe sahip kilidi beklemeye devam edin.

KENDİ
Şu anda çalıştırılmakta olan SWITCH veya çevrimiçi dizin yeniden derleme işleminden herhangi bir işlem yapmadan çıkın.

BLOKER
İşlemin devam edebilmesi için şu anda SWITCH veya çevrimiçi dizin yeniden oluşturma DDL işlemini engelleyen tüm kullanıcı işlemlerini sonlandırma.

TÜM BAĞLANTILARIN DEĞIŞTIRME izni gerektirir.

VARSA

için geçerlidir: SQL Server (SQL Server 2016 (13.x) ve üzeri) ve Azure SQL Veritabanı.

Sütunu veya kısıtlamayı koşullu olarak yalnızca zaten varsa bırakır.

RESUMABLE = { ON | KAPALI}

için geçerlidir: SQL Server 2022 (16.x) ve üzeri.

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_DURATIONRESUMABLE = ON ile kullanıldığında (ONLINE = ONgerektirir), duraklatılmadan önce devam ettirilebilen çevrimiçi ekleme kısıtlama 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şlemlerini etkinleştirme ve kullanma hakkında daha fazla bilgi için bkz. Devam ettirilebilir tablo ekleme kısıtlamaları.

Açıklamalar

Yeni veri satırları eklemek için INSERTkullanın. Veri satırlarını kaldırmak için DELETE kullanın veya TRUNCATE TABLE. Var olan satırlardaki değerleri değiştirmek için UPDATEkullanın.

Yordam önbelleğinde tabloya başvuran herhangi bir yürütme planı 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 OneLakeyansıtılmaz. Daha fazla bilgi için bkz.Doku SQL veritabanı yansıtma sınırlamaları .

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. ALTER COLUMN yan tümcesini kullanın. Sütunda veri varsa, yeni boyut verilerin maksimum boyutundan küçük olamaz. Ayrıca, sütun bir varchar, nvarcharveya varbinary veri türü değilse ve dizin BİRİnCİl ANAHTAR kısıtlamasının sonucu değilse, bir dizinde sütunu tanımlayamazsınız. Sütun Tanımını Değiştirme başlıklı kısa bölümdeki örne bakın.

Kilitler ve ALTER TABLE

ALTER TABLE'da 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, sonunda kısa SCH-M kilidi gerektiren çevrimiçi dizin işlemleri dışında, değişiklik sırasında tablonun meta verilerine başka hiçbir bağlantının başvurmadığından emin olmak için 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ğerle NOT NULL sütunu 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 deyimlerini, birçok satırı etkileyen herhangi bir INSERT, UPDATE veya 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 XEvents

Aşağıdaki XEvents, veçevrimiçi dizin yeniden derlemeleri ile ilgilidir.

  • 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 Edition'dan başlayarak, varsayılan değerle NOT NULL sütunu eklemek, varsayılan değerbir ç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. ADD COLUMN söz diziminin ötesinde çevrimiçi işlemi 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, "Geçici verilerim" sabit ifadesi veya GETUTCDATETIME() sistem işlevi ç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. Çalışma zamanı sabiti olmayan varsayılan değere sahip NOT NULL sütunu 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 UPDATE deyiminde 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, metin, ntext, image, hierarchyid, geometry, geographyveya CLR UDTS ç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 bir ALTER TABLE ADD (dizin tabanlı) CONSTRAINT veya DROP (kümelenmiş dizin) CONSTRAINT deyimini çalıştırmak için kullanılan işlemci sayısı, en yüksek paralellik derecesi 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. MAXDOP seçeneğini belirterek deyimini çalıştırmak için kullanılan işlemci sayısını el ile yapılandırabilirsiniz. Daha fazla bilgi için bkz. En yüksek paralellik derecesini yapılandırma Sunucu Yapılandırma Seçeneği.

Bölümlenmiş tablolar

Bölümlenmiş tablolar içeren SWITCH işlemlerini gerçekleştirmeye ek olarak, 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 ALTER TABLE 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 kullanın ve ALTER PARTITION FUNCTION. Ayrıca, bölümlenmiş bir tablonun sütununun veri türünü değiştiremezsiniz.

Şemaya bağlı görünümlere sahip tablolarda kısıtlamalar

Şemaya bağlı görünümlere sahip tablolarda ALTER TABLE deyimleri için 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. ALTER TABLE deyimi şemaya bağlı görünümde kullanılan bir sütunu değiştirmeyi 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. CREATE INDEX ile oluşturulan dizinler DROP INDEX ile bırakılmalıdır. Kısıtlama tanımının dizin bölümünü yeniden oluşturmak için ALTER INDEX deyimini kullanın; kısıtlamasının bırakılması ve ALTER TABLE ile yeniden 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. Git 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 taşıyabilirsiniz. TAŞı seçeneği aşağıdaki kısıtlamalara sahiptir:

  • GIT, dizinlenmiş 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.
  • ŞURAYA TAŞı belirtilmezse, tablo kümelenmiş dizin için tanımlanan bölüm düzeninde veya dosya grubunda bulunur.

Kümelenmiş dizini bıraktığınızda, DROP INDEX işleminin temel alınan verilerde ve ilişkili kümelenmemiş dizinlerde sorguları ve değişiklikleri engellememesi için ONLINE **=** ON seçeneğini belirtin.

ONLINE = ON aşağıdaki kısıtlamalara sahiptir:

  • ÇEVRIMIÇI = ON, devre dışı bırakılmış kümelenmiş dizinler için geçerli değildir. Devre dışı bırakılmış dizinler, ÇEVRİmİÇİ = KAPALI kullanılarak bırakılmalıdır.
  • Aynı anda yalnızca bir dizin bırakılabilir.
  • ÇEVRİmİÇİ = ON, yerel geçici tablolardaki dizinli görünümler, kümelenmemiş dizinler veya dizinler için geçerli değildir.
  • ONLINE = ON, columnstore 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.

Not

<drop_clustered_constraint_option> altında 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

ALTER TABLE'yi SQL Server Publisher'da yayımlanan bir tabloda çalıştırdığınızda, 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, ÇEVRİmİÇİ modu için 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 ÇEVRİmDIŞI modunu kullanın. 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 etkileyeceğ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ışı NTEXT veri türünü kullanarak sütunları bırakırken, silinen verilerin temizlenmesi tüm satırlarda seri hale getirilmiş 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 NULL değerine 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. WAIT_AT_LOW_PRIORITY seçeneği, 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, SELF ve BLOCKERS, bekleme süresi ( (MAX_DURATION =n [minutes]) ) sırasında engelleyici etkinlik yoksa, çevrimiçi dizin yeniden oluşturma işlemi beklemeden hemen çalıştırılır ve DDL deyimi tamamlanır.

Uyumluluk desteği

ALTER TABLE deyimi yalnızca iki parçalı (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.

İzinler

Tabloda ALTER izni gerektirir.

ALTER TABLE izinleri, ALTER TABLE SWITCH deyiminde yer alan her iki tablo için de geçerlidir. Anahtarlanan tüm veriler hedef tablonun güvenliğini devralır.

ALTER TABLE deyimindeki sütunları ortak dil çalışma zamanı (CLR) kullanıcı tanımlı türünde veya diğer ad veri türünde olacak şekilde tanımladıysanız, tür üzerinde BAŞVURUlar izni gerekir.

Tablonun satırlarını güncelleştiren bir sütunu eklemek veya değiştirmek için tabloda UPDATE izni gerekir. Örneğin, varsayılan değere sahip NOT NULL sütunu ekleme veya tablo boş olmadığında kimlik sütunu ekleme.

Örnekler

Kategori Öne çıkan söz dizimi öğeleri
Sütun ve kısıtlama ekleme ADD * DIZIN seçenekleriyle BİRİnCİl ANAHTAR * seyrek sütunlar ve sütun kümeleri *
sütunları ve kısıtlamaları bırakma DAMLA
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 * BÖLÜM DEĞIŞTIRME * KİlİT YÜKSELTME * değişiklik izleme
Kısıtlamaları ve tetikleyicileri devre dışı bırakma ve etkinleştirme DENETLE * ONAY YOK * TETIKLEYICIYI ETKINLEŞTIR * TETIKLEYICIYI DEVRE DıŞı BıRAK
çevrimiçi işlemleri ÇEVRİMİÇİ
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 DEFAULT tanımı aracılığıyla hiçbir değer sağlanmayan bir sütun ekler. Yeni sütunda her satırda NULLolacaktır.

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
EXEC 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
EXEC 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 NULL olarak kalır. 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

-- Add a PRIMARY KEY identity column.
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
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
EXEC 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. WITH DEĞERLERİ kullanılmıyorsa, her satır yeni sütunda NULL değerine sahiptir.

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 NULL
CONSTRAINT AddDateDflt
DEFAULT GETDATE() WITH VALUES ;
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, PRIMARY KEY kısıtlaması PK_TransactionHistoryArchive_TransactionID oluşturur ve FILLFACTOR, ONLINEve PAD_INDEXseçeneklerini ayarlar. Sonuçta elde edilen kümelenmiş dizin kısıtlamayla aynı ada sahip olur.

için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri ile Azure SQL Veritabanı.

USE AdventureWorks;
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 AdventureWorks;
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

Ben. 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, ONLINE seçeneğinin ONolarak ayarlandığı bİrİnCİl ANAHTAR kısıtlamasını 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 bİrİnCİl ANAHTAR kısıtlamasının sonucu olmadığından boyutu 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ıyla ş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 CEK1koruyarak sütun ana anahtarına erişimi olmalı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şturulacak. 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.

için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri ile Azure SQL Veritabanı.

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.

için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri ile Azure SQL Veritabanı.

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.

için geçerlidir: SQL Server 2014 (12.x) ve üzeri ve Azure SQL Veritabanı.

ALTER TABLE PartitionTable1
REBUILD PARTITION = 1 WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE) ;
GO

Aşağıdaki örnek, COLUMNSTORE_ARCHIVE seçeneğiyle 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.

için geçerlidir: SQL Server 2014 (12.x) ve üzeri 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ükseltmesi TABLE düzeyinde ayarlanır.

için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri ile 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.

için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri ile Azure SQL Veritabanı.

USE AdventureWorks;
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.

için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri.

USE AdventureWorks;
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.

için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri ile Azure SQL Veritabanı.

USE AdventureWorks;
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 will fail.
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 TRANSACTION
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.

için geçerlidir: SQL Server 2014 (12.x) ve üzeri 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, ÇEVRİmİÇİ seçeneğiyle sütun değiştirme işleminin nasıl çalıştırılacakları gösterilmektedir.

için geçerlidir: SQL Server 2016 (13.x) ve üzeri 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
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ı olacaktır. Ek yardım için bkz. System-Versioned Zamana Bağlı Tablolarla Çalışmaya Başlama.

için geçerlidir: SQL Server 2016 (13.x) ve üzeri 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 herhangi bir etki olmadığından emin olmak için HIDDEN yan tümcesi kullanılır. Ayrıca yalnızca SQL Veritabanı'nda kullanılabilen HISTORY_RETENTION_PERIOD kullanır.

--Alter non-temporal table to define periods for system versioning
ALTER TABLE InsurancePolicy
ADD PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo),
ValidFrom datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL
    DEFAULT SYSUTCDATETIME(),
ValidTo datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL
    DEFAULT CONVERT(DATETIME2, '9999-12-31 23:59:59.99999999') ;

--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 tablosu ve tablosu kullanan, dönemleri için ve sütunlarını kullanan, bu dönem sütunlarının veri türü datetime2 kullanmadığı ve tablosunun tanımlanmış birincil anahtarı olduğu 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
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
JOIN sys.indexes AS i
    ON t.object_id = i.object_id
JOIN sys.partitions AS p
    ON i.object_id = p.object_id AND i.index_id = p.index_id
JOIN  sys.partition_schemes AS s
    ON i.data_space_id = s.data_space_id
JOIN sys.partition_functions AS f
    ON s.function_id = f.function_id
LEFT 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 adını döndürür. FactResellerSales.

SELECT t.object_id AS Object_ID, t.name AS TableName,
    ic.column_id as PartitioningColumnID, c.name AS PartitioningColumnName
FROM sys.tables AS t
JOIN sys.indexes AS i
    ON t.object_id = i.object_id
JOIN sys.columns AS c
    ON t.object_id = c.object_id
JOIN sys.partition_schemes AS ps
    ON ps.data_space_id = i.data_space_id
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.

Bölüm Veri var mı? Sınır aralığı
1 Evet OrderDate < '2004-01-01'
2 Evet '2004-01-01' <= OrderDate < '2005-01-01'
3 Evet '2005-01-01' <= OrderDate< '2006-01-01'
4 Evet '2006-01-01'<= OrderDate < '2007-01-01'
5 Evet '2007-01-01' <= SiparişTarihi
  • Bölüm 1 (veriye sahip): OrderDate < '2004-01-01'
  • Bölüm 2 (veriye sahip): '2004-01-01' <= OrderDate < '2005-01-01'
  • Bölüm 3 (veriye sahip): '2005-01-01' <= OrderDate< '2006-01-01'
  • Bölüm 4 (veriye sahip): '2006-01-01'<= OrderDate < '2007-01-01'
  • Bölüm 5 (veriye sahip): '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 (veriye sahip): '2004-01-01' <= OrderDate < '2005-01-01'
  • Bölüm 3 (veriye sahip): '2005-01-01' <= OrderDate< '2006-01-01'
  • Bölüm 4 (veriye sahip): '2006-01-01'<= OrderDate < '2007-01-01'
  • Bölüm 5 (veriye sahip): '2007-01-01' <= OrderDate

OrdersHistory tablosu

  • Bölüm 1 (veriye sahip): OrderDate < '2004-01-01'
  • Bölüm 2 (boş): '2004-01-01' <= OrderDate

Orders tablosunu temizlemek için 1 ve 2. bölümleri aşağıdaki gibi birleştirerek boş bölümü 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 (veriye sahip): OrderDate < '2005-01-01'
  • Bölüm 2 (veriye sahip): '2005-01-01' <= OrderDate< '2006-01-01'
  • Bölüm 3 (veriye sahip): '2006-01-01'<= OrderDate < '2007-01-01'
  • Bölüm 4 (veriye sahip): '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 (veriye sahip): OrderDate < '2004-01-01'
  • Bölüm 2 (boş): '2004-01-01' < '2005-01-01'
  • Bölüm 3 (boş): '2005-01-01' <= OrderDate