Aracılığıyla paylaş


ALTER TABLE (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz Platformu Sistemi (PDW)Microsoft Fabric'te ambarMicrosoft Fabric'te SQL veritabanı

Sütunları ve kısıtlamaları değiştirerek, ekleyerek veya bırakarak tablo tanımını değiştirir. ALTER TABLE ayrıca bölümleri yeniden atar ve yeniden oluşturur ya da kısıtlamaları ve tetikleyicileri devre dışı bırakır ve etkinleştirir.

Note

Şu anda Doku Ambarı'ndaki ALTER TABLE yalnızca kısıtlamalar ve null atanabilir sütunlar eklemek için desteklenmektedir. Bkz. Microsoft Fabric 'da Ambar içinSözdizimi. Şu anda, Microsoft Fabric'teki SQL veritabanında bellek optimize edilmiş tablolar mevcut değildir.

için söz dizimi ALTER TABLE , disk tabanlı tablolar ve bellek için iyileştirilmiş tablolar için farklıdır. Sizi tablo türleriniz için uygun söz dizimi bloğuna ve uygun söz dizimi örneklerine doğrudan götürmek için aşağıdaki bağlantıları kullanın:

Disk tabanlı tablolar:

Bellek için iyileştirilmiş tablolar:

Söz dizimi kuralları hakkında daha fazla bilgi için bkz.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 } )
}

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

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

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

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

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

Note

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

Dokuda Ambar söz dizimi

ALTER TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
{
  ADD  { column_name <data_type> [COLLATE collation_name] [ <column_options> ] } [ ,...n ]
| ADD { <column_constraint> FOR column_name} [ ,...n ]
| DROP { COLUMN column_name | [CONSTRAINT] constraint_name } [ ,...n ]
}
[ ; ]

<column_options> ::=
[ NULL ] -- default is NULL

<data type> ::=
datetime2 ( n )
| date
| time ( n )
| float [ ( n ) ]
| real [ ( n ) ]
| decimal [ ( precision [ , scale ] ) ]
| numeric [ ( precision [ , scale ] ) ]
| bigint
| int
| smallint
| bit
| varchar [ ( n ) ]
| char [ ( n ) ]
| varbinary [ ( n ) ]
| uniqueidentifier

<column_constraint>::=
    [ CONSTRAINT constraint_name ]
    {
       PRIMARY KEY NONCLUSTERED (column_name [ ,... n ]) NOT ENFORCED
        | UNIQUE NONCLUSTERED (column_name [ ,... n ]) NOT ENFORCED
    | FOREIGN KEY
        ( column [ ,...n ] )
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ] NOT ENFORCED
    }

Arguments

database_name

Tablonun oluşturulduğu veritabanının adı.

schema_name

Tablonun ait olduğu şemanın adı.

table_name

Değiştirilecek tablonun adı. Tablo geçerli veritabanında değilse veya geçerli kullanıcının sahip olduğu şema tarafından kapsandıysa, veritabanını ve şemayı açıkça belirtmeniz gerekir.

ALTER SÜTUNU

Adlandırılmış sütunun değiştirileceği veya değiştirileceği belirtir.

Değiştirilen sütun şu şekilde olamaz:

  • Veri türü zaman damgasına sahip bir sütun.

  • ROWGUIDCOL Tablo için.

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

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

    Note

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

  • Veya PRIMARY KEY[FOREIGN KEY] REFERENCES kısıtlamasında kullanılır.

  • Veya CHECKUNIQUE kısıtlamasında kullanılır. Ancak, bir veya CHECK kısıtlamasında UNIQUE 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.

Note

Bölümlenmiş tablonun sütununun veri türü değiştirilemez.

Sütun varchar, nvarcharveya varbinary veri türü değilse ve yeni boyut eski boyuta eşit veya ondan büyük değilse, dizine dahil edilen sütunların veri türü değiştirilemez.

Birincil anahtar kısıtlamasına dahil olan bir sütun olarak NOT NULLNULLdeğiştirilemez.

Always Encrypted kullanırken (güvenli kuşatmalar olmadan), değiştirilen sütun ile ENCRYPTED WITHşifrelenirse, veri türünü uyumlu bir veri türüyle (örneğin INTBIGINT, ) değiştirebilirsiniz, ancak şifreleme ayarlarını değiştiremezsiniz.

Always Encrypted'ı güvenli kuşatmalarla kullanırken, sütunu koruyan sütun şifreleme anahtarı (ve anahtarı değiştiriyorsanız yeni sütun şifreleme anahtarı) kapanım hesaplamalarını destekliyorsa (kapanım özellikli sütun ana anahtarlarıyla şifrelenir) herhangi bir şifreleme ayarını değiştirebilirsiniz. Ayrıntılar için bkz. Güvenli kuşatmalarla Always Encrypted.

Bir sütunu değiştirdiğinizde, Veritabanı Altyapısı sistem tablosuna bir satır ekleyerek ve önceki sütun değişikliğini bırakılan sütun olarak işaretleyerek her değişikliği izler. Bir sütunu çok fazla değiştirdiğiniz nadir durumlarda, Veritabanı Altyapısı kayıt boyutu sınırına ulaşabilir. Böyle bir durumda 511 veya 1708 hatası alırsınız. Bu hataları önlemek için, tablodaki kümelenmiş dizini düzenli aralıklarla yeniden derleyin veya sütun değişikliği sayısını azaltın.

column_name

Değiştirilecek, eklenecek veya bırakılacak sütunun adı. en fazla column_name 128 karakterdir. Yeni sütunlar için, zaman damgası veri türüyle oluşturulan sütunlar için column_name atlayabilirsiniz. zaman damgası veri türü sütunu için column_name belirtmezseniz zaman damgası adı kullanılır.

Note

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

[ type_schema_name. ] type_name

Değiştirilen sütunun yeni veri türü veya eklenen sütunun veri türü. Bölümlenmiş tabloların mevcut sütunları için type_name belirtemezsiniz. type_name aşağıdaki türlerden herhangi biri olabilir:

  • SQL Server sistem veri türü.
  • SQL Server sistem veri türünü temel alan diğer ad veri türü. Bir tablo tanımında CREATE TYPE kullanılmadan önce deyimiyle diğer ad veri türleri oluşturursunuz.
  • .NET Framework kullanıcı tanımlı türü ve ait olduğu şema. Bir tablo tanımında CREATE TYPE kullanılmadan önce deyimiyle kullanıcı tanımlı türler oluşturursunuz.

Değiştirilen bir sütunun type_name ölçütleri şunlardır:

  • Önceki veri türü, yeni veri türüne örtük olarak dönüştürülebilir olmalıdır.
  • type_namezaman damgası olamaz.
  • ANSI_NULL için varsayılanlar her zaman açıktır ALTER COLUMN; belirtilmezse sütun null atanabilir.
  • ANSI_PADDING doldurma her zaman ON içindir ALTER COLUMN.
  • Değiştirilen sütun bir kimlik sütunuysa, new_data_type kimlik özelliğini destekleyen bir veri türü olmalıdır.
  • için SET ARITHABORT geçerli ayar yoksayılır. ALTER TABLEolarak ayarlanmış ARITHABORTgibi ON çalışır.

Note

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

precision

Belirtilen veri türü için duyarlık. Geçerli duyarlık değerleri hakkında daha fazla bilgi için bkz . Duyarlık, ölçek ve uzunluk.

scale

Belirtilen veri türü için ölçek. Geçerli ölçek değerleri hakkında daha fazla bilgi için bkz . Duyarlık, ölçek ve uzunluk.

max

Yalnızca varchar, nvarcharve 2^31-1 bayt karakter, ikili veri ve Unicode verilerini depolamak için varbinary veri türleri için geçerlidir.

xml_schema_collection

Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.

Yalnızca xml şemasını türle ilişkilendirmek için xml veri türü için geçerlidir. Bir şema koleksiyonuna xml sütunu yazmadan önce, CREATE XML SCHEMA COLLECTIONkullanarak veritabanında şema koleksiyonunu oluşturursunuz.

HARMANLAMA <collation_name>

Değiştirilen sütun için yeni harmanlamayı belirtir. Belirtilmezse, sütuna veritabanının varsayılan harmanlaması atanır. Harmanlama adı bir Windows harmanlama adı veya SQL harmanlama adı olabilir. Liste ve daha fazla bilgi için bkz. Windows harmanlama adı ve SQL Server Harmanlama Adı.

COLLATE yan tümcesi yalnızca char, varchar, nchar ve nvarchar veri türlerinin sütunlarının harmanlamalarını değiştirir. Kullanıcı tanımlı diğer ad veri türü sütununun harmanlamasını değiştirmek için ayrı deyimler kullanarak ALTER TABLE sütunu bir SQL Server sistem veri türüne değiştirin. Ardından harmanlamasını değiştirin ve sütunu bir diğer ad veri türüne geri döndürin.

ALTER COLUMN aşağıdaki koşullardan biri veya daha fazlası mevcutsa harmanlama değişikliği olamaz:

  • Kısıtlama CHECK , FOREIGN KEY kısıtlama veya hesaplanan sütunlar değiştirilen sütuna başvurur.
  • Sütunda tüm dizinler, istatistikler veya tam metin dizinleri oluşturulur. Sütun harmanlaması değiştirilirse, değiştirilen sütunda otomatik olarak oluşturulan istatistikler bırakılır.
  • Şemaya bağlı bir görünüm veya işlev sütuna başvurur.

Desteklenen harmanlamalar hakkında daha fazla bilgi için bkz. COLLATE .

NULL | NOT NULL

Sütunun null değerleri kabul edip etmeyeceğini belirtir. Null değerlere izin vermeyen sütunlar, yalnızca varsayılan olarak belirtilmişse veya tablo boşsa ile ALTER TABLE eklenir. Hesaplanan sütunlar için yalnızca öğesini de belirttiyseniz belirtebilirsiniz NOT NULLPERSISTED. Yeni sütun null değerlere izin veriyorsa ve varsayılan değer belirtmezseniz, yeni sütun tablodaki her satır için bir null değer içerir. Yeni sütun null değerlere izin veriyorsa ve yeni sütunla varsayılan bir tanım eklerseniz, varsayılan değeri tablodaki mevcut her satır için yeni sütunda depolamak için kullanabilirsiniz WITH VALUES .

Yeni sütun null değerlere izin vermiyorsa ve tablo boş değilse, yeni sütunla bir DEFAULT tanım eklemeniz gerekir. Ayrıca yeni sütun, mevcut her satırdaki yeni sütunlarda varsayılan değerle otomatik olarak yüklenir.

kısıtlamalarındaki NULL sütunlar dışında, bir ALTER COLUMN sütunu null değerlere izin verecek şekilde zorlamak için öğesini NOT NULL belirtebilirsinizPRIMARY KEY. içinde NOT NULL yalnızca sütun null değer içermiyorsa belirtebilirsinizALTER COLUMN. Null değerlere izin verilmeden önce ALTER COLUMNNOT NULL bir değere güncelleştirilmelidir, örneğin:

UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL;

ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR (20) NOT NULL;

veya CREATE TABLE deyimleriyle ALTER TABLE tablo oluşturduğunuzda veya değiştirdiğinizde, veritabanı ve oturum ayarları sütun tanımında kullanılan veri türünün null atanabilirliğini etkiler ve geçersiz kılar. Bir sütunu her zaman veya uyumsuz sütunlar NULLNOT NULL için açıkça tanımladığınızdan emin olun.

Kullanıcı tanımlı veri türüne sahip bir sütun eklerseniz, sütunu kullanıcı tanımlı veri türüyle aynı null atanabilirlikle tanımladığınızdan emin olun. Ayrıca, sütun için varsayılan bir değer belirtin. Daha fazla bilgi için bkz. CREATE TABLE.

Note

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

[ {ADD | DÜŞER} ROWGUIDCOL ]

Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.

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

ROWGUIDCOL sütunda depolanan değerlerin benzersizliğini zorlamaz ve tabloya eklenen yeni satırlar için otomatik olarak değer oluşturmaz. Her sütun için benzersiz değerler oluşturmak için NEWID() deyimlerinde NEWSEQUENTIALID() veya INSERT işlevini kullanın. Ya da sütun için varsayılan olarak NEWID() veya NEWSEQUENTIALID() işlevini belirtin.

[ {ADD | DROP} KALıCı ]

Özelliğin belirtilen sütuna PERSISTED eklendiğini veya bırakıldığını belirtir. Sütun, belirlenici bir ifadeyle tanımlanan hesaplanan bir sütun olmalıdır. olarak PERSISTEDbelirtilen sütunlar için Veritabanı Altyapısı hesaplanan değerleri tabloda fiziksel olarak depolar ve hesaplanan sütunun bağımlı olduğu diğer sütunlar güncelleştirildiğinde değerleri güncelleştirir. Hesaplanan sütunu olarak PERSISTEDişaretleyerek, belirlenici ancak kesin olmayan ifadelerde tanımlanan hesaplanan sütunlarda dizinler oluşturabilirsiniz. Daha fazla bilgi için bkz. Hesaplanan sütunlardaki dizinler.

SET QUOTED_IDENTIFIER hesaplanan sütunlarda veya dizinlenmiş görünümlerde dizin oluştururken veya değiştirirken olmalıdır ON . Daha fazla bilgi için bkz. set QUOTED_IDENTIFIER.

Bölümlenmiş tablonun bölümleme sütunu olarak kullanılan tüm hesaplanan sütunlar açıkça işaretlenmelidir PERSISTED.

Note

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

ÇOĞALTMA IÇIN BıRAKMA

Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.

Çoğaltma aracıları ekleme işlemleri gerçekleştirdiğinde kimlik sütunlarında değerlerin artırıldığını belirtir. Bu yan tümceyi yalnızca column_name bir kimlik sütunuysa belirtebilirsiniz.

SPARSE

Sütunun seyrek bir sütun olduğunu gösterir. Seyrek sütunların depolanması null değerler için iyileştirilmiştir. Seyrek sütunları olarak NOT NULLayarlayamazsınız. Bir sütunu seyrekten seyrek olmayana veya seyrek olmayandan seyrek olarak dönüştürdüğünüzde, bu seçenek tabloyu komut yürütme süresi boyunca kilitler. Herhangi bir alan tasarrufunu geri kazanmak için yan tümcesini REBUILD kullanmanız gerekebilir. Seyrek sütunlar hakkında ek kısıtlamalar ve daha fazla bilgi için bkz. Seyrek sütunları kullanma.

ŞUNUNLA MASKELENDİ EKLE ( İŞLEV = 'mask_function')

Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

Dinamik bir veri maskesi belirtir. mask_function, uygun parametrelerle maskeleme işlevinin adıdır. Üç işlev kullanılabilir:

  • default()
  • email()
  • partial()
  • random()

İzin gerektirir ALTER ANY MASK .

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

İzin gerektiren ALTER ANY MASK bir maske ekleyin ve bırakın.

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

Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

Tablo kullanılabilir durumdayken birçok değişiklik sütunu eyleminin gerçekleştirilmesini sağlar. Varsayılan değer OFF. Veri türü, sütun uzunluğu veya duyarlık, null atanabilirlik, seyreklik ve harmanlama ile ilgili sütun değişiklikleri için alter sütununu çevrimiçi olarak çalıştırabilirsiniz.

Çevrimiçi alter sütunu, kullanıcı tarafından oluşturulan ve otomatik durumsal yöntemlerin işlem süresi boyunca değiştirilen sütuna başvurmasını sağlar ve bu da sorguların ALTER COLUMN her zamanki gibi çalışmasını sağlar. İşlemin sonunda sütuna başvuran otomatik istatistikler bırakılır ve kullanıcı tarafından oluşturulan istatistikler geçersiz kılınmış olur. Kullanıcı, işlem tamamlandıktan sonra kullanıcı tarafından oluşturulan istatistikleri el ile güncelleştirmelidir. Sütun herhangi bir istatistik veya dizin için bir filtre ifadesinin parçasıysa, sütun değiştirme işlemi gerçekleştiremezsiniz.

  • Çevrimiçi değişiklik sütunu işlemi çalışırken, bu sütuna bağlı olabilecek tüm DDL işlemleri (dizinler, görünümler vb. oluşturma veya değiştirme gibi) engellenir veya uygun bir hatayla başarısız olur. Bu davranış, işlem çalışırken ortaya konan bağımlılıklar nedeniyle çevrimiçi alter sütununun başarısız olmayacağı garanti eder.

  • Bir sütunun NOT NULL olarak değiştirilmesi, değiştirilen sütuna NULL kümelenmemiş dizinler tarafından başvurulduğunda çevrimiçi bir işlem olarak desteklenmez.

  • Bir denetim kısıtlaması tarafından sütuna başvurulduğunda ve işlem sütunun ALTER duyarlığı (ALTER veya tarih saat) kısıtlandığında çevrimiçi 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, seçenek için ONLINE 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 FOREIGN KEYCHECK ya da kısıtlamaya göre doğrulanıp doğrulanmayacağını belirtir. Belirtmezseniz, WITH CHECK yeni kısıtlamalar için kabul edilir ve WITH NOCHECK yeniden etkinleştirilen kısıtlamalar için varsayılır.

Yeni CHECK verileri veya FOREIGN KEY mevcut verilerle ilgili kısıtlamaları doğrulamak istemiyorsanız kullanın WITH NOCHECK. Nadir durumlar dışında bunu yapmanızı önermiyoruz. Yeni kısıtlama sonraki tüm veri güncelleştirmelerinde değerlendirilir. Kısıtlama eklendiğinde tarafından WITH NOCHECK gizlenen kısıtlama ihlalleri, satırları kısıtlamaya uymayan verilerle güncelleştirdiklerinde gelecekteki güncelleştirmelerin başarısız olmasına neden olabilir. Sorgu iyileştiricisi tanımlanan WITH NOCHECKkısıtlamaları dikkate almaz. Bu tür kısıtlamalar ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALLkullanılarak yeniden etkinleştirilene kadar yoksayılır. Daha fazla bilgi için bkz. INSERT ve UPDATE deyimleriyle yabancı anahtar kısıtlamalarını devre dışı bırakma.

ALTER INDEX index_name

index_name için demet sayısının değiştirileceği veya değiştirileceği belirtir.

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

Important

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

ADD

Bir veya daha fazla sütun tanımının, hesaplanan sütun tanımının veya tablo kısıtlamasının eklendiğini belirtir. Ya da sistemin sistem sürümü oluşturma için kullandığı sütunlar eklenir. Bellek için iyileştirilmiş tablolar için dizin ekleyebilirsiniz.

Note

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

Important

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

SYSTEM_TIME DÖNEMİ ( system_start_time_column_name, system_end_time_column_name )

Şunlar için geçerlidir: SQL Server 2017 (14.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

Sistemin bir kaydın geçerli olduğu süreyi kaydetmek için kullandığı sütunların adlarını belirtir. Var olan sütunları belirtebilir veya bağımsız değişkenin ADD PERIOD FOR SYSTEM_TIME bir parçası olarak yeni sütunlar oluşturabilirsiniz. Sütunları datetime2 veri türüyle ayarlayın ve olarak NOT NULLtanımlayın. Nokta sütununu olarak NULLtanımlarsanız, hata sonucu verir. bir column_constraint tanımlayabilir ve/veya system_start_time ve system_end_time sütunları için sütunlar için varsayılan değerleri belirtebilirsiniz. Aşağıdaki Sistem Sürümü Oluşturma örneklerinde system_end_time sütunu için varsayılan değerin kullanılmasını gösteren Örnek A'ya bakın.

Var olan bir tabloyu zamansal tablo yapmak için bu bağımsız değişkeni bağımsız değişkenle SET SYSTEM_VERSIONING birlikte kullanın. Daha fazla bilgi için bkz . Geçici tablolar ve Geçici tabloları kullanmaya başlama.

SQL Server 2017 (14.x) itibarıyla kullanıcılar, sütunlar için değer döndürmeyen bu sütunları örtük olarak gizlemek için bir veya iki nokta sütununu HIDDEN bayrakla SELECT * FROM <table_name> işaretleyebilir. Varsayılan olarak nokta sütunları gizli değildir. Kullanılabilmesi için, gizli sütunların doğrudan zamana bağlı tabloya başvuran tüm sorgulara açıkça dahil edilmesi gerekir.

DROP

Bir veya daha fazla sütun tanımının, hesaplanan sütun tanımlarının veya tablo kısıtlamalarının bırakıldığını veya sistemin sistem sürümü oluşturma için kullandığı sütunların belirtimini bırakıldığını belirtir.

Note

Kayıt defteri tablolarında bırakılan sütunlar yalnızca geçici olarak silinir. Bırakılan sütun kayıt defteri tablosunda kalır, ancak içindeki sütunu olarak ayarlanarak dropped_ledger_table bırakılan sütun sys.tables1olarak işaretlenir. Bırakılan kayıt defteri tablosunun genel muhasebe görünümü, dropped_ledger_view'daki sys.tables sütunu 1olarak ayarlanarak bırakıldı olarak da işaretlenir. Bırakılan bir kayıt defteri tablosu, geçmiş tablosu ve kayıt defteri görünümü bir ön ek eklenerek (MSSQL_DroppedLedgerTable, MSSQL_DroppedLedgerHistory, MSSQL_DroppedLedgerView) ve özgün ada guid eklenerek yeniden adlandırılır.

KISITLAMA constraint_name

constraint_name tablodan kaldırıldığını belirtir. Birden çok kısıtlama listelenebilir.

sys.check_constraint, sys.default_constraints, sys.key_constraintsve sys.foreign_keys katalog görünümlerini sorgulayarak kısıtlamanın kullanıcı tanımlı veya sistem tarafından sağlanan adını belirleyebilirsiniz.

PRIMARY KEY Tabloda bir XML dizini varsa kısıtlama bırakılamaz.

İNDİS index_name

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

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

Important

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

SÜTUN column_name

constraint_name veya column_name tablodan kaldırıldığını belirtir. Birden çok sütun listelenebilir.

Sütun şu durumlarda bırakılamaz:

  • Anahtar sütun olarak veya bir dizinde kullanılır INCLUDE
  • , CHECKFOREIGN KEY, UNIQUEveya PRIMARY KEY kısıtlamasında kullanılır.
  • anahtar sözcüğüyle tanımlanan veya varsayılan nesneye DEFAULT bağlı bir varsayılan değerle ilişkilendirildi.
  • Bir kurala bağlı.

Note

Sütunun düşmesi sütunun disk alanını geri kazanmaz. Bir tablonun satır boyutu sınırına yaklaştığında veya aşıldığında bırakılan sütunun disk alanını geri kazanmanız gerekebilir. tabloda kümelenmiş dizin oluşturarak veya ALTER INDEXkullanarak mevcut kümelenmiş dizini yeniden oluşturarak alanı geri kazanabilirsiniz. LOB veri türlerini bırakmanın etkisi hakkında bilgi için bu CSS blog girdisinebakın.

SYSTEM_TIME DÖNEMİ

Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

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

ILE <drop_clustered_constraint_option>

Bir veya daha fazla bırakma kümelenmiş kısıtlama seçeneğinin ayarlandığını belirtir.

MAXDOP = max_degree_of_parallelism

Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.

maksimum paralellik derecesi yapılandırma seçeneğini yalnızca işlem süresi boyunca geçersiz kılar. Daha fazla bilgi için bkz . Sunucu yapılandırması: maksimum paralellik derecesi.

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

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

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

Note

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: OFF. İşlem olarak REBUILD çalıştırabilirsinizONLINE.

  • ON

    Uzun süreli tablo kilitleri dizin işlemi boyunca tutulmaz. Dizin işleminin ana aşamasında, kaynak tabloda yalnızca bir Amaç Paylaşımı (IS) kilidi tutulur. Bu davranış, temel alınan tablo ve dizinlerde sorguların veya güncelleştirmelerin devam etmelerini sağlar. İşlemin başlangıcında, kaynak nesnede kısa bir süre için Paylaşılan (S) kilidi tutulur. İşlemin sonunda, kümelenmemiş bir dizin oluşturulursa kaynakta kısa bir süre için bir S (Paylaşılan) kilidi alınır. Öte yandan, kümelenmiş dizin çevrimiçi oluşturulduğunda veya bırakıldığında ve kümelenmiş veya kümelenmemiş bir dizin yeniden oluşturulduğunda bir Sch-M (Şema Değişikliği) kilidi alınır. ONLINE yerel geçici tabloda bir dizin oluşturulurken olarak ayarlanamaz ON . Yalnızca tek iş parçacıklı yığın yeniden derleme işlemine izin verilir.

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

  • OFF

    Tablo kilitleri dizin işleminin süresi için geçerlidir. Kümelenmiş dizini oluşturan, yeniden derleyen veya düşüren ya da kümelenmemiş bir dizini yeniden oluşturan veya düşüren, tabloda şema değişikliği (Sch-M) kilidi alan çevrimdışı dizin işlemi. Bu kilit, işlem süresi boyunca temel alınan tabloya tüm kullanıcı erişimini engeller. Kümelenmemiş dizin oluşturan çevrimdışı dizin işlemi, tabloda Paylaşılan (S) kilidi alır. Bu kilit, temel tablo güncelleştirmelerini engeller, ancak deyimler gibi SELECT 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?

    Note

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

Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.

Veri satırlarını kümelenmiş dizinin yaprak düzeyinde taşımak için bir konum belirtir. Tablo yeni konuma taşınır. Bu seçenek yalnızca kümelenmiş dizin oluşturan kısıtlamalar için geçerlidir.

Note

Bu bağlamda anahtar default sözcük değildir. Varsayılan dosya grubu için bir tanımlayıcıdır ve veya MOVE TO "default"içinde MOVE TO [default] olduğu gibi sınırlandırılmalıdır. belirtilirse "default" , QUOTED_IDENTIFIER seçeneği geçerli oturum için olmalıdır ON . Bu varsayılan ayardır. Daha fazla bilgi için bkz. set QUOTED_IDENTIFIER.

{ CHECK | NOCHECK } KıSıTLAMASı

constraint_name etkinleştirildiğini veya devre dışı bırakıldığını belirtir. Bu seçenek yalnızca ve FOREIGN KEY kısıtlamalarıyla CHECK kullanılabilir. Belirtildiğinde NOCHECK kısıtlama devre dışı bırakılır ve sütuna gelecek eklemeler veya güncelleştirmeler kısıtlama koşullarına göre doğrulanmaz. DEFAULT, PRIMARY KEYve UNIQUE kısıtlamaları devre dışı bırakılamaz.

  • ALL

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

  • ALL

    Tablodaki tüm tetikleyicilerin etkinleştirildiğini veya devre dışı bırakıldığını belirtir.

  • trigger_name

    Devre dışı bırakacak veya etkinleştirecek tetikleyicinin adını belirtir.

{ ETKİnLEŞTİr | DISABLE } CHANGE_TRACKING

Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.

Değişiklik izlemenin tablo için devre dışı bırakılıp etkinleştirilmediğini belirtir. Varsayılan olarak, değişiklik izleme devre dışıdır.

Bu seçenek yalnızca veritabanı için değişiklik izleme etkinleştirildiğinde kullanılabilir. Daha fazla bilgi için bkz. ALTER DATABASE SET options.

Değişiklik izlemeyi etkinleştirmek için tablonun birincil anahtarı olmalıdır.

ILE ( TRACK_COLUMNS_UPDATED = { ÜZERINDE | KAPALI } )

Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.

İzlenen sütunların güncelleştirildiği Veritabanı Altyapısı'nın izlenip izlenmediğini belirtir. Varsayılan değer OFF.

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

Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.

Veri bloğunu aşağıdaki yollardan biriyle değiştirir:

  • Bir tablonun tüm verilerini bölüm olarak zaten var olan bir bölümlenmiş tabloya yeniden atayın.
  • Bölümlenmiş bir tablodan diğerine bölüm değiştirir.
  • Bölümlenmiş tablonun bir bölümündeki tüm verileri mevcut bölümlenmemiş bir tabloya yeniden atayın.

tablo bölümlenmiş bir tabloysa, source_partition_number_expressionbelirtmeniz gerekir. target_table bölümlenmişse, target_partition_number_expressionbelirtmeniz gerekir. Bir tablonun verilerini zaten var olan bir bölümlenmiş tabloya bölüm olarak yeniden atadığınızda veya bölümlenmiş bir tablodan diğerine geçtiğinde, hedef bölüm mevcut olmalı ve boş olmalıdır.

Tek bir tablo oluşturmak için bir bölümün verilerini yeniden atadığınızda, hedef tablo zaten mevcut olmalı ve boş olmalıdır. Hem kaynak tablo ya da bölüm hem de hedef tablo veya bölüm aynı dosya grubunda bulunmalıdır. Karşılık gelen dizinler veya dizin bölümleri de aynı dosya grubunda bulunmalıdır. Bölümler arasında geçiş yapmak için birçok ek kısıtlama geçerlidir. tablo ve target_table aynı olamaz. target_table çok parçalı bir tanımlayıcı olabilir.

Hem source_partition_number_expression hem de target_partition_number_expression değişkenlere ve işlevlere başvurabilen sabit ifadelerdir. Bunlar kullanıcı tanımlı tür değişkenlerini ve kullanıcı tanımlı işlevleri içerir. Transact-SQL ifadelere başvuramaz.

Kümelenmiş columnstore dizini olan bölümlenmiş tablo, bölümlenmiş yığın gibi davranır:

  • Birincil anahtar bölüm anahtarını içermelidir.
  • Benzersiz bir dizin bölüm anahtarını içermelidir. Ancak, mevcut bir benzersiz dizine sahip bölüm anahtarı dahil olmak benzersizliği değiştirebilir.
  • Bölümleri değiştirmek için, tüm kümelenmemiş dizinlerin bölüm anahtarını içermesi gerekir.

Çoğaltma kullanırken kısıtlama için SWITCH bkz . Bölümlenmiş Tabloları ve Dizinleri Çoğaltma.

Kümelenmemiş columnstore dizinleri, SQL Server 2016(13.x) öncesi salt okunur biçimde ve V12 sürümünden önceki SQL Veritabanı için oluşturulmuş. Herhangi bir PARTITION işlemin çalıştırılabilmesi için önce derlenmemiş columnstore dizinlerini geçerli biçime (güncelleştirilebilir) yeniden oluşturmanız gerekir.

Limitations

Her iki tablo da kümelenmemiş dizinler de dahil olmak üzere aynı şekilde bölümlenmişse ve hedef tabloda kümelenmemiş dizin yoksa , 4907 hatası alabilirsiniz.

Örnek çıkış:

Msg 4907, Level 16, State 1, Line 38
'ALTER TABLE SWITCH' statement failed. The table 'MyDB.dbo.PrtTable1' has 4 partitions while index 'MS1' has 6 partitions.

SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | "varsayılan" | "NULL" })

Şunlar için geçerlidir: SQL Server. Azure SQL Veritabanı FILESTREAMdesteklemez.

FILESTREAM verilerinin depolandığı yeri belirtir.

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

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 kullanılarak dosya grubu için tanımlanmış bir dosyaya sahip olmalıdır veya bir hata alırsınız.

"default" , özellik kümesine sahip DEFAULT FILESTREAM dosya grubunu belirtir. FILESTREAM dosya grubu yoksa bir hata alırsınız.

"NULL" tablo için FILESTREAM dosya gruplarına yapılan tüm başvuruların kaldırıldığını belirtir. Önce tüm FILESTREAM sütunları bırakılmalıdır. Tabloyla ilişkili tüm FILESTREAM verilerini silmek için kullanın SET FILESTREAM_ON = "NULL" .

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

Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

Tablonun sistem sürümü oluşturmayı devre dışı bırakır veya etkinleştirir. Bir tablonun sistem sürümü oluşturmayı etkinleştirmek için sistem, sistem sürümü oluşturma için veri türü, null atanabilirlik kısıtlaması ve birincil anahtar kısıtlaması gereksinimlerinin karşılandığını doğrular. Sistem, sistem sürümüne sahip tablodaki her kaydın geçmişini ayrı bir geçmiş tablosuna kaydeder. HISTORY_TABLE Bağımsız değişken kullanılmıyorsa, bu geçmiş tablosunun adı olurMSSQL_TemporalHistoryFor<primary_table_object_id>. Geçmiş tablosu yoksa, sistem geçerli tablonun şemasıyla eşleşen yeni bir geçmiş tablosu oluşturur, iki tablo arasında bir bağlantı oluşturur ve sistemin geçmiş tablosundaki geçerli tablodaki her kaydın geçmişini kaydetmesini sağlar. HISTORY_TABLE bağımsız değişkenini kullanarak bir bağlantı oluşturur ve var olan bir geçmiş tablosunu kullanırsanız, sistem geçerli tabloyla belirtilen tablo arasında bir bağlantı oluşturur. Var olan bir geçmiş tablosuna bağlantı oluştururken veri tutarlılığı denetimi yapmayı seçebilirsiniz. Bu veri tutarlılığı denetimi, mevcut kayıtların çakışmamasını sağlar. Veri tutarlılığı denetimini çalıştırmak varsayılandır. Var olan tabloyu geçici bir tablo yapmak için SYSTEM_VERSIONING = ON yan tümcesiyle tanımlanan bir tablodaki PERIOD FOR SYSTEM_TIME bağımsız değişkenini kullanın. Daha fazla bilgi için bkz. Zamana bağlı tablolar.

HISTORY_RETENTION_PERIOD = { SONSUZ | sayı { GÜN | GÜN | HAFTA | HAFTALAR | AY | AYLAR | YIL | YIL } }

için geçerlidir: SQL Server 2017 (14.x) ve Azure SQL Veritabanı.

Zamana bağlı bir tablodaki geçmiş veriler için sonlu veya sonsuz saklamayı belirtir. Atlanırsa, sonsuz saklama varsayılır.

DATA_DELETION

Şunlar için geçerlidir: Azure SQL Edge yalnızca

Bir veritabanı içindeki tablolardan eski veya eski verilerin saklama ilkesi tabanlı temizlenmesini sağlar. Daha fazla bilgi için bkz. Veri Saklamayı Etkinleştirme ve Devre Dışı Bırakma. Veri saklamanın etkinleştirilmesi için aşağıdaki parametreler belirtilmelidir.

  • FILTER_COLUMN = { column_name }

    Tablodaki satırların eski olup olmadığını belirlemek için kullanılacak sütunu belirtir. Filtre sütunu için aşağıdaki veri türlerine izin verilir.

    • date
    • datetime
    • datetime2
    • smalldatetime
    • datetimeoffset
  • RETENTION_PERIOD = { SONSUZ | sayı { GÜN | GÜN | HAFTA | HAFTALAR | AY | AYLAR | YIL | YIL } }

    Tablo için bekletme süresi ilkesini belirtir. Bekletme süresi, pozitif bir tamsayı değeri ile tarih bölümü biriminin birleşimi olarak belirtilir.

SET ( LOCK_ESCALATION = { AUTO | TABLO | DISABLE } )

Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.

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

  • AUTO

    Bu seçenek, SQL Server Veritabanı Altyapısı'nın tablo şemasına uygun kilit yükseltme ayrıntı düzeyini seçmesine olanak tanır.

    • Tablo bölümlenmişse, yığına veya B ağacı (HoBT) ayrıntı düzeyine kilit yükseltmesine izin verilir. Başka bir deyişle, bölüm düzeyine yükseltmeye izin verilir. Kilit HoBT düzeyine yükseltildikten sonra, kilit daha sonra ayrıntı düzeyine TABLE yükseltilmeyecektir.

    • Tablo bölümlenmemişse, kilit yükseltmesi ayrıntı düzeyine TABLE yapılır.

  • TABLE

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

  • DISABLE

    Çoğu durumda kilit yükseltmesini önler. Tablo düzeyinde kilitlere tamamen izin verilmez. Örneğin, serileştirilebilir yalıtım düzeyi altında kümelenmiş dizini olmayan bir tabloyu tararken, Veri bütünlüğünü korumak için Veritabanı Altyapısı'nın tablo kilidi alması gerekir.

REBUILD

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

Bölümlenmiş tablodaki REBUILD PARTITION tek bir bölümü yeniden oluşturmak için söz dizimini kullanın.

BÖLÜM = TÜMÜ

Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.

Bölüm sıkıştırma ayarlarını değiştirirken tüm bölümleri yeniden oluşturur.

İLE YENIDEN OLUŞTURMA ( <rebuild_option> )

Tüm seçenekler kümelenmiş dizine sahip bir tabloya uygulanır. Tabloda kümelenmiş dizin yoksa yığın yapısı yalnızca bazı seçeneklerden etkilenir.

İşlemle REBUILD belirli bir sıkıştırma ayarı belirtilmediğinde, bölüm için geçerli sıkıştırma ayarı kullanılır. Geçerli ayarı döndürmek için data_compression katalog görünümündeki sys.partitions sütununu sorgula.

Yeniden oluşturma seçeneklerinin tam açıklamaları için bkz. ALTER TABLE index_option.

DATA_COMPRESSION

Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.

Belirtilen tablo, bölüm numarası veya bölüm aralığı için veri sıkıştırma seçeneğini belirtir. Seçenekler şunlardır:

  • NONE

    Tablo veya belirtilen bölümler sıkıştırılamaz. Bu seçenek columnstore tablolarına uygulanmaz.

  • SIRA

    Tablo veya belirtilen bölümler satır sıkıştırma kullanılarak sıkıştırılır. Bu seçenek columnstore tablolarına uygulanmaz.

  • SAYFA

    Tablo veya belirtilen bölümler sayfa sıkıştırma kullanılarak sıkıştırılır. Bu seçenek columnstore tablolarına uygulanmaz.

  • COLUMNSTORE

    Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

    Yalnızca columnstore tablolarına uygulanır. COLUMNSTORE seçeneğiyle sıkıştırılmış bir bölümün sıkıştırmasını kaldırmayı COLUMNSTORE_ARCHIVE 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

    Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

    Yalnızca kümelenmiş columnstore diziniyle depolanan tablolar olan columnstore tabloları için geçerlidir. COLUMNSTORE_ARCHIVE belirtilen bölümü daha küçük bir boyuta sıkıştırır. Arşivleme veya daha az depolama gerektiren ve depolama ve alma için daha fazla zaman ayırabilen diğer durumlar için bu seçeneği kullanın.

    Aynı anda birden çok bölümü yeniden derlemek için bkz. index_option. Tabloda kümelenmiş dizin yoksa, veri sıkıştırmanın değiştirilmesi yığın ve kümelenmemiş dizinleri yeniden oluşturur. Sıkıştırma hakkında daha fazla bilgi için bkz. Veri sıkıştırma.

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

XML_COMPRESSION

için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümler, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği.

Tablodaki xml veri türü sütunları için XML sıkıştırma seçeneğini belirtir. Seçenekler şunlardır:

  • ON

    xml veri türünü kullanan sütunlar sıkıştırılır.

  • OFF

    xml veri türünü kullanan sütunlar sıkıştırılamaz.

ÇEVRİmİÇİ = { ON | OFF } <single_partition_rebuild_option> için geçerlidir

Dizin işlemi sırasında sorgular ve veri değişikliği için temel tabloların ve ilişkili dizinlerin tek bir bölümünün kullanılabilir olup olmadığını belirtir. Varsayılan değer: OFF. İşlem olarak REBUILD çalıştırabilirsinizONLINE.

  • ON

    Uzun süreli tablo kilitleri dizin işlemi boyunca tutulmaz. Tablodaki S kilidi, dizin yeniden oluşturma işleminin başlangıcında ve çevrimiçi dizin yeniden oluşturma işleminin sonunda tabloda Sch-M kilidi gereklidir. Her iki kilit de kısa meta veri kilitleri olsa da, Sch-M kilidi tüm engelleme işlemlerinin tamamlanmasını beklemelidir. Bekleme süresi boyunca, Sch-M kilidi aynı tabloya erişirken bu kilidin arkasında bekleyen diğer tüm işlemleri engeller.

    Note

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

  • OFF

    Tablo kilitleri dizin işlemi süresi boyunca uygulanır. Bu, işlem süresi boyunca temel alınan tabloya tüm kullanıcı erişimini engeller.

ALL_SPARSE_COLUMNS IÇIN XML COLUMN_SET column_set_name

Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.

Sütun kümesinin adı. Sütun kümesi, tablonun tüm seyrek sütunlarını yapılandırılmış bir çıktıda birleştiren, yazılmamış bir XML gösterimidir. Seyrek sütun içeren bir tabloya sütun kümesi eklenemez. Sütun kümeleri hakkında daha fazla bilgi için bkz. Sütun kümelerini kullanma.

{ ETKİnLEŞTİr | DISABLE } FILETABLE_NAMESPACE

Şunlar için geçerlidir: SQL Server.

FileTable'da sistem tanımlı kısıtlamaları etkinleştirir veya devre dışı bırakır. Yalnızca bir FileTable ile kullanılabilir.

SET ( FILETABLE_DIRECTORY = directory_name )

Şunlar için geçerlidir: SQL Server. Azure SQL Veritabanı FileTable'i desteklemez.

Windows uyumlu FileTable dizin adını belirtir. Bu ad, veritabanındaki tüm FileTable dizin adları arasında benzersiz olmalıdır. SQL harmanlama ayarlarına rağmen benzersizlik karşılaştırması büyük/küçük harfe duyarlı değildir. Yalnızca bir FileTable ile kullanılabilir.

REMOTE_DATA_ARCHIVE

Şunlar için geçerlidir: SQL Server 2017 (14.x) ve sonraki sürümler.

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

Important

Stretch Database, SQL Server 2022 (16.x) ve Azure SQL Veritabanı'nda kullanım dışıdır. Bu özellik, Veritabanı Altyapısı'nın gelecekteki bir sürümünde kaldırılacaktır. Bu özelliği yeni geliştirme çalışmalarında kullanmaktan kaçının ve şu anda bu özelliği kullanan uygulamaları değiştirmeyi planlayın.

Tablo için Stretch Database'i etkinleştirme

ONbelirterek bir tablo için Esnetmeyi etkinleştirdiğinizde, verileri hemen geçirmeyi başlatmak için MIGRATION_STATE = OUTBOUND veya veri geçişlerini ertelemek için MIGRATION_STATE = PAUSED belirtmeniz gerekir. Varsayılan değer MIGRATION_STATE = OUTBOUND. Bir tablo için Esnetmeyi etkinleştirme hakkında daha fazla bilgi için bkz. bir tablo için Stretch Database'i etkinleştirme.

Prerequisites. Bir tablo için Stretch'i etkinleştirmeden önce, sunucuda ve veritabanında Stretch'i etkinleştirmeniz gerekir. Daha fazla bilgi için bkz. bir veritabanı için Stretch Database'i etkinleştirme.

Permissions. Bir veritabanı veya tablo için Stretch'i etkinleştirmek için db_owner izinleri gerekir. Bir tablo için Esnetme'yi etkinleştirmek için tabloda da izinler gerekir ALTER .

Tablo için Stretch Database'i devre dışı bırakma

Bir tablo için Esnetmeyi devre dışı bırakırsanız, Azure'a zaten geçirilmiş olan uzak veriler için iki seçeneğiniz vardır. Daha fazla bilgi için bkz. Stretch Database'i devre dışı bırakma veuzak verileri geri getirme.

  • Bir tablo için Stretch'i devre dışı bırakmak ve tablonun uzak verilerini Azure'dan SQL Server'a geri kopyalamak için aşağıdaki komutu çalıştırın. Bu komut iptal edilemiyor.

    ALTER TABLE <table_name>
       SET ( REMOTE_DATA_ARCHIVE ( MIGRATION_STATE = INBOUND ) ) ;
    

Bu işlem veri aktarımı maliyetlerine neden olur ve iptal edilemez. Daha fazla bilgi için bkz. Veri Aktarımları Fiyatlandırma Ayrıntıları.

Tüm uzak veriler Azure'dan SQL Server'a geri kopyalandıktan sonra, tablo için Stretch devre dışı bırakılır.

  • Bir tablo için Stretch'i devre dışı bırakmak ve uzak verileri bırakmak için aşağıdaki komutu çalıştırın.

    ALTER TABLE <table_name>
       SET ( REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY ( MIGRATION_STATE = PAUSED ) ) ;
    

Bir tablo için Stretch Database'i devre dışı bırakdıktan sonra, veri geçişi durdurulur ve sorgu sonuçları artık uzak tablodan sonuçlar içermez.

Esnetme'nin devre dışı bırakılması uzak tabloyu kaldırmaz. Uzak tabloyu silmek istiyorsanız Azure portalını kullanarak bırakın.

[ FILTER_PREDICATE = { null | koşul } ]

Şunlar için geçerlidir: SQL Server 2017 (14.x) ve sonraki sürümler.

İsteğe bağlı olarak, hem geçmiş hem de geçerli verileri içeren bir tablodan geçirilebilen satırları seçmek için bir filtre koşulu belirtir. Koşul, belirleyici bir satır içi tablo değerli işlevi çağırmalıdır. Daha fazla bilgi için bkz. Bir tablo için Esnetme Veritabanını Etkinleştirme ve filtre işlevi kullanarak geçirileceği satırları seçme - Stretch Database.

Important

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

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

Bir filtre koşulu belirttiğinizde de belirtmeniz MIGRATION_STATEgerekir.

MIGRATION_STATE = { GIDEN | GELEN | DURAKLATILDI }

Şunlar için geçerlidir: SQL Server 2017 (14.x) ve sonraki sürümler.

  • SQL Server'dan Azure'a veri geçirmek için 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

Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

Çevrimiçi dizin yeniden derlemesi, bu tabloda engelleme işlemlerini beklemek zorunda. WAIT_AT_LOW_PRIORITY çevrimiçi dizin yeniden oluşturma işleminin düşük öncelikli kilitleri beklediğini ve çevrimiçi dizin derleme işlemi beklerken diğer işlemlerin devam etmelerine olanak tanıydığını gösterir. Seçeneğin atlanması WAIT AT LOW PRIORITY ile aynıdır WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).

MAX_DURATION = saat [ DAKİkA ]

Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

dakika cinsinden belirtilen bir tamsayı değeri olan veya çevrimiçi dizini yeniden oluşturmanın SWITCH DDL komutunu çalıştırırken düşük öncelikli olarak beklediği bekleme süresi. İşlem bu süre boyunca MAX_DURATION engellenirse, eylemlerden ABORT_AFTER_WAIT biri çalışır. MAX_DURATION zaman her zaman dakika cinsindendir ve sözcüğünü MINUTESatlayabilirsiniz.

ABORT_AFTER_WAIT = { YOK | SELF | ENGELLEYICILER }

Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

  • NONE

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

  • SELF

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

  • BLOCKERS

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

    İzin gerektirir ALTER ANY CONNECTION .

VARSA

Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

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

RESUMABLE = { ON | KAPALI}

Şunlar için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümleri.

bir ALTER TABLE ADD CONSTRAINT işleminin devam ettirilebilir olup olmadığını belirtir. ONtablo kısıtlaması ekleme işlemi devam ettirilebilir. OFFtablo kısıtlaması ekleme işlemi devam ettirilemez. Varsayılan değer OFF. RESUMABLE seçeneği, ALTER TABLE table_constraintiçindeki ALTER TABLE index_option parçası olarak kullanılabilir.

MAX_DURATION ile RESUMABLE = ON kullanıldığında (gerektirir ONLINE = ON), duraklatılmadan önce devam ettirilebilir bir çevrimiçi ekleme kısıtlaması işleminin yürütüldüğünü belirten zamanı (dakika cinsinden belirtilen bir tamsayı değeri) gösterir. Belirtilmezse, işlem tamamlanmadan devam eder.

Devam ettirilebilen ALTER TABLE ADD CONSTRAINT işlemleri etkinleştirme ve kullanma hakkında daha fazla bilgi için bkz. Devam ettirilebilir tablo ekleme kısıtlamaları.

Remarks

Yeni veri satırları eklemek için INSERTkullanın. Veri satırlarını kaldırmak için 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 yürütme planları varsa, ALTER TABLE bunları bir sonraki yürütmelerinde yeniden derlenecek şekilde işaretler.

Microsoft Fabric'teki SQL veritabanında bazı tablo özellikleri oluşturulabilir ancak Fabric OneLake'e yansıtılmaz. Daha fazla bilgi için, Fabric SQL veritabanı aynalama için Sınırlamalar bölümüne bakınız.

Sütunun boyutunu değiştirme

Sütun veri türü için yeni bir boyut belirterek sütunun uzunluğunu, duyarlığı veya ölçeğini değiştirebilirsiniz. yan tümcesini ALTER COLUMN kullanın. Sütunda veri varsa, yeni boyut verilerin maksimum boyutundan küçük olamaz. Ayrıca, sütun bir varchar, nvarchar veya varbinary veri türü değilse ve dizin bir PRIMARY KEY kısıtlamanın sonucu değilse, dizinde sütunu tanımlayamazsınız. Sütun Tanımını Değiştirme başlıklı kısa bölümdeki örne bakın.

Kilitler ve ALTER TABLE

içinde ALTER TABLE belirttiğiniz değişiklikler hemen uygulanır. Değişiklikler tablodaki satırların değiştirilmesini gerektiriyorsa, ALTER TABLE satırları güncelleştirir. ALTER TABLE , değişiklik sırasında tablonun meta verilerine başka hiçbir bağlantının başvurmadığından emin olmak için, sonunda kısa bir Sch-M kilidi gerektiren çevrimiçi dizin işlemleri dışında tablo üzerinde bir şema değiştirme (Sch-M) kilidi alır. ALTER TABLE...SWITCH bir işlemde kilit hem kaynak hem de hedef tablolarda alınır. Tabloda yapılan değişiklikler günlüğe kaydedilir ve tamamen kurtarılabilir. Sütun bırakma veya SQL Server'ın bazı sürümlerinde varsayılan değere sahip bir NOT NULL sütun ekleme gibi büyük tablolardaki tüm satırları etkileyen değişikliklerin tamamlanması ve çok sayıda günlük kaydı oluşturulması uzun sürebilir. Bu ALTER TABLE deyimleri, birçok satırı etkileyen herhangi bir INSERT, UPDATEveya DELETE deyimiyle aynı özenle çalıştırın.

Microsoft Fabric'teki Ambarı için geçerlidir.

ALTER TABLE açık bir işlemin parçası olamaz.

Bölüm anahtarı için Genişletilmiş Olaylar (XEvents)

Aşağıdaki XEvents, 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 sürümü ve sonraki sürümlerinde varsayılan değere sahip bir NOT NULL sütun eklemek, varsayılan değer çalışma zamanı sabiti olduğunda çevrimiçi bir işlemdir. Bu, tablodaki satır sayısına rağmen işlemin neredeyse anında tamamlandığı anlamına gelir, çünkü tablodaki mevcut satırlar işlem sırasında güncelleştirilmez. Bunun yerine, varsayılan değer yalnızca tablonun meta verilerinde depolanır ve değer gerektiğinde bu satırlara erişen sorgularda aranır. Bu davranış otomatiktir. Çevrimiçi işlemi söz diziminin ötesinde ADD COLUMN uygulamak için ek söz dizimi gerekmez. Çalışma zamanı sabiti, determinizmine rağmen tablodaki her satır için çalışma zamanında aynı değeri üreten bir ifadedir. Örneğin, sabit ifadesi "My temporary data"veya sistem işlevi GETUTCDATETIME() çalışma zamanı sabitleridir. Buna karşılık, tablodaki her satır için benzersiz bir değer üretildiği için NEWID() veya NEWSEQUENTIALID() işlevleri çalışma zamanı sabitleri değildir. NOT NULL Çalışma zamanı sabiti olmayan varsayılan değere sahip bir sütun eklemek her zaman çevrimdışı çalıştırılır ve işlem süresi boyunca özel (Sch-M) bir kilit alınır.

Mevcut satırlar meta verilerde depolanan değere başvururken, eklenen ve sütun için başka bir değer belirtmeyen yeni satırlar için varsayılan değer satırda depolanır. Meta verilerde depolanan varsayılan değer, satır güncelleştirildiğinde (gerçek sütun deyiminde UPDATE belirtilmemiş olsa bile) veya tablo veya kümelenmiş dizin yeniden oluşturulduğunda var olan bir satıra taşınır.

Varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography veya CLR kullanıcı tanımlı türlerdeki sütunlar çevrimiçi bir işleme eklenemez. Bunun yapılması, olası en büyük satır boyutunun 8.060 bayt sınırını aşmasına neden oluyorsa, sütun çevrimiçi eklenemez. Bu durumda sütun çevrimdışı bir işlem olarak eklenir.

Paralel plan yürütme

SQL Server 2012 (11.x) Enterprise sürümü ve sonraki sürümlerinde, tek ALTER TABLE ADD bir (dizin tabanlı) veya CONSTRAINT (kümelenmiş dizin) DROPCONSTRAINT deyimini çalıştırmak için kullanılan işlemci sayısı, en yüksek paralellik yapılandırma seçeneği ve geçerli iş yükü tarafından belirlenir. Veritabanı Altyapısı sistemin meşgul olduğunu algılarsa, deyimi yürütme başlamadan önce işlemin paralellik derecesi otomatik olarak azaltılır. seçeneğini belirterek MAXDOP deyimini çalıştırmak için kullanılan işlemci sayısını el ile yapılandırabilirsiniz. Daha fazla bilgi için bkz . Sunucu yapılandırması: maksimum paralellik derecesi.

Bölümlenmiş tablolar

Bölümlenmiş tablolar içeren SWITCH işlemlerini gerçekleştirmeye ek olarak, ALTER TABLE bölümlenmiş bir tablonun sütunlarının, kısıtlamalarının ve tetikleyicilerinin durumunu bölümlenmemiş tablolar için kullanıldığı gibi değiştirmek için kullanın. Ancak, bu deyim tablonun bölümlenme biçimini değiştirmek için kullanılamaz. Bölümlenmiş tabloyu yeniden bölümlendirmek için ALTER PARTITION SCHEME 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 tablolardaki deyimler için ALTER TABLE geçerli olan kısıtlamalar, basit bir dizine sahip tabloları değiştirirken geçerli olan kısıtlamalarla aynıdır. Sütun eklemeye izin verilir. Ancak, şemaya bağlı herhangi bir görünüme katılan bir sütunun kaldırılmasına veya değiştirilmesine izin verilmez. Deyimi şemaya ALTER TABLE bağlı bir görünümde kullanılan bir sütunun değiştirilmesini gerektiriyorsa, ALTER TABLE başarısız olur ve Veritabanı Altyapısı bir hata iletisi oluşturur. Şema bağlama ve dizine alınan görünümler hakkında daha fazla bilgi için bkz. CREATE VIEW.

Temel tablolarda tetikleyicilerin eklenmesi veya kaldırılması, tablolara başvuran şemaya bağlı bir görünüm oluşturulmasından etkilenmez.

Dizinler ve ALTER TABLE

Kısıtlamanın bir parçası olarak oluşturulan dizinler, kısıtlama bırakıldığında bırakılır. ile CREATE INDEX oluşturulan dizinler ile DROP INDEXbırakılmalıdır. Kısıtlama tanımının dizin bölümünü yeniden oluşturmak için The ALTER INDEX deyimini kullanın; kısıtlamanın bırakılması ve ile ALTER TABLEyeniden eklenmesi gerekmez.

Sütunun kaldırılabilmesi için önce bir sütunu temel alan tüm dizinlerin ve kısıtlamaların kaldırılması gerekir.

Kümelenmiş dizin oluşturan bir kısıtlamayı sildiğinizde, kümelenmiş dizinin yaprak düzeyinde depolanan veri satırları, kümelenmemiş bir tabloda depolanır. Seçeneğini belirterek kümelenmiş dizini bırakabilir ve sonuçta elde edilen tabloyu tek bir işlemde başka bir dosya grubuna veya bölüm düzenine MOVE TO taşıyabilirsiniz. seçeneği MOVE TO aşağıdaki kısıtlamalara sahiptir:

  • MOVE TO 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.

  • Belirtilmezse MOVE TO , tablo kümelenmiş dizin için tanımlanan bölüm düzeninde veya dosya grubunda bulunur.

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

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

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

Note

altında <drop_clustered_constraint_option> listelenen seçenekler tablolardaki kümelenmiş dizinlere uygulanır ve görünümlerde veya kümelenmemiş dizinlerde kümelenmiş dizinlere uygulanamaz.

Şema değişikliklerini çoğaltma

SQL Server Publisher'da yayımlanan bir tabloda çalıştırdığınızda ALTER TABLE , bu değişiklik varsayılan olarak tüm SQL Server Abonelerine yayılır. Bu işlevin bazı kısıtlamaları vardır. Devre dışı bırakabilirsiniz. Daha fazla bilgi için bkz. Yayın Veritabanlarında Şema Değişiklikleri Yapma.

Veri sıkıştırma

Sistem tabloları sıkıştırma için etkinleştirilemiyor. Tablo bir yığınsa, mod için ONLINE yeniden oluşturma işlemi tek iş parçacıklı olur. Çok iş parçacıklı yığın yeniden oluşturma işlemi için modu kullanın OFFLINE . Veri sıkıştırma hakkında daha fazla bilgi için bkz. Veri sıkıştırma.

Sıkıştırma durumunu değiştirmenin bir tabloyu, dizini veya bölümü nasıl etkilediğini değerlendirmek için sp_estimate_data_compression_savings sistem saklı yordamını kullanın.

Bölümlenmiş tablolar için aşağıdaki kısıtlamalar geçerlidir:

  • Tabloda hizalanmamış dizinler varsa tek bir bölümün sıkıştırma ayarını değiştiremezsiniz.
  • ALTER TABLE <table> REBUILD PARTITION ... söz dizimi belirtilen bölümü yeniden oluşturur.
  • ALTER TABLE <table> REBUILD WITH ... söz dizimi tüm bölümleri yeniden oluşturur.

Ntext sütunlarını bırakma

Kullanım dışı bırakılan ntext veri türünü kullanarak sütunları bırakırken, silinen verilerin temizlenmesi tüm satırlarda serileştirilmiş bir işlem olarak gerçekleşir. Temizleme işlemi büyük miktarda zaman gerektirebilir. Çok fazla satır içeren bir tabloda ntext sütununu bırakırken, önce ntext sütununu değere NULL güncelleştirin, sonra sütunu bırakın. Bu seçeneği paralel işlemlerle çalıştırabilir ve çok daha hızlı hale getirebilirsiniz.

Çevrimiçi dizin yeniden oluşturma

Çevrimiçi dizin yeniden derlemesi için DDL deyimini çalıştırmak için, belirli bir tabloda çalışan tüm etkin engelleme işlemlerinin tamamlanması gerekir. Çevrimiçi dizin yeniden derlemesi başlatıldığında, bu tabloda çalışmaya başlamaya hazır olan tüm yeni işlemleri engeller. Çevrimiçi dizin yeniden oluşturma için kilidin süresi kısa olsa da, belirli bir tablodaki tüm açık işlemlerin tamamlanmasını beklemek ve yeni işlemlerin başlatılmasını engellemek aktarım hızını önemli ölçüde etkileyebilir. Bu, bir iş yükünün yavaşlamasına veya zaman aşımına neden olabilir ve temel tabloya erişimi önemli ölçüde sınırlayabilir. seçeneği WAIT_AT_LOW_PRIORITY , DTA'ların çevrimiçi dizin yeniden derlemeleri için gereken S-lock ve Sch-M kilitlerini yönetmesine olanak tanır. Üç durumda da: NONE, SELFve BLOCKERS, bekleme süresi(MAX_DURATION = n [minutes]) () sırasında hiçbir engelleme etkinliği yoksa, çevrimiçi dizin yeniden oluşturma işlemi beklemeden hemen çalıştırılır ve DDL deyimi tamamlanır.

Uyumluluk desteği

deyimi ALTER TABLE yalnızca iki bölümlü (schema.object) tablo adlarını destekler. SQL Server'da, aşağıdaki biçimleri kullanarak bir tablo adı belirtme işlemi derleme zamanında 117 hatasıyla başarısız oluyor.

  • server.database.schema.table
  • .database.schema.table
  • ..schema.table

Önceki sürümlerde, biçimi belirterek server.database.schema.table hata 4902 döndürdü. .database.schema.table biçimini veya başarılı ..schema.table biçimini belirtme.

Sorunu çözmek için dört bölümlü ön ek kullanımını kaldırın.

Permissions

ALTER Tabloda izin gerektirir.

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

Deyiminde ALTER TABLE ortak dil çalışma zamanı (CLR) kullanıcı tanımlı türde veya diğer ad veri türünde bir sütun tanımladıysanız, REFERENCES tür üzerinde izin gereklidir.

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

Examples

Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz veya AdventureWorksDW2025 örnek veritabanını kullanır.

Category Öne çıkan söz dizimi öğeleri
Sütun ve kısıtlama ekleme ADD; PRIMARY KEY dizin seçenekleri, seyrek sütunlar ve sütun kümeleri ile
sütunları ve kısıtlamaları bırakma DROP
Sütun tanımını değiştirme veri türünü değiştirme; sütun boyutunu değiştirme; Harmanlama
Tablo tanımını değiştirme DATA_COMPRESSION; SWITCH PARTITION; ; LOCK ESCALATION değişiklik izleme
Kısıtlamaları ve tetikleyicileri devre dışı bırakma ve etkinleştirme CHECK; NO CHECK; ; ENABLE TRIGGERDISABLE TRIGGER
Çevrimiçi işlemler ONLINE
Sistem sürümü oluşturma SYSTEM_VERSIONING

Sütun ve kısıtlama ekleme

Bu bölümdeki örneklerde tabloya sütun ve kısıtlama ekleme gösterilmektedir.

A. Yeni sütun ekleme

Aşağıdaki örnek, null değerlere izin veren ve bir tanım aracılığıyla hiçbir değer sağlanmayan bir DEFAULT sütun ekler. Yeni sütunda her satırda vardır NULL.

CREATE TABLE dbo.doc_exa (column_a INT);
GO

ALTER TABLE dbo.doc_exa
    ADD column_b VARCHAR (20) NULL;
GO

B. Kısıtlaması olan bir sütun ekleme

Aşağıdaki örnek, UNIQUE kısıtlaması olan yeni bir sütun ekler.

CREATE TABLE dbo.doc_exc (column_a INT);
GO

ALTER TABLE dbo.doc_exc
    ADD column_b VARCHAR (20) NULL
        CONSTRAINT exb_unique UNIQUE;
GO

EXECUTE sp_help doc_exc;
GO

DROP TABLE dbo.doc_exc;
GO

C. Var olan bir sütuna doğrulamasız CHECK kısıtlaması ekleme

Aşağıdaki örnek, tablodaki mevcut bir sütuna kısıtlama ekler. Sütun, kısıtlamayı ihlal eden bir değere sahiptir. Bu nedenle, WITH NOCHECK kısıtlamanın mevcut satırlarda doğrulanmasını önlemek ve kısıtlamanın eklenmesine izin vermek için kullanılır.

CREATE TABLE dbo.doc_exd (column_a INT);
GO

INSERT INTO dbo.doc_exd VALUES (-1);
GO

ALTER TABLE dbo.doc_exd WITH NOCHECK
    ADD CONSTRAINT exd_check CHECK (column_a > 1);
GO

EXECUTE sp_help doc_exd;
GO

DROP TABLE dbo.doc_exd;
GO

D. Var olan bir sütuna DEFAULT kısıtlaması ekleme

Aşağıdaki örnek, iki sütunlu bir tablo oluşturur ve ilk sütuna bir değer ekler ve diğer sütun kalır NULL. Daha sonra ikinci sütuna bir DEFAULT kısıtlaması eklenir. Varsayılanın uygulandığını doğrulamak için, ilk sütuna başka bir değer eklenir ve tablo sorgulanır.

CREATE TABLE dbo.doc_exz
(
    column_a INT,
    column_b INT
);
GO

INSERT INTO dbo.doc_exz (column_a) VALUES (7);
GO

ALTER TABLE dbo.doc_exz
    ADD CONSTRAINT col_b_def
        DEFAULT 50 FOR column_b;
GO

INSERT INTO dbo.doc_exz (column_a) VALUES (10);
GO

SELECT * FROM dbo.doc_exz;
GO

DROP TABLE dbo.doc_exz;
GO

E. Kısıtlamaları olan birkaç sütun ekleme

Aşağıdaki örnek, yeni sütunla tanımlanan kısıtlamalara sahip birkaç sütun ekler. İlk yeni sütunda IDENTITY özelliği vardır. Tablodaki her satır, kimlik sütununda yeni artımlı değerlere sahiptir.

CREATE TABLE dbo.doc_exe
(
    column_a INT
        CONSTRAINT column_a_un UNIQUE
);
GO

ALTER TABLE dbo.doc_exe

    -- Add a PRIMARY KEY identity column.
    ADD column_b INT IDENTITY
        CONSTRAINT column_b_pk PRIMARY KEY,

    -- Add a column that references another column in the same table.
        column_c INT NULL
            CONSTRAINT column_c_fk FOREIGN KEY REFERENCES doc_exe (column_a),

    -- Add a column with a constraint to enforce that
    -- nonnull data is in a valid telephone number format.
        column_d VARCHAR (16) NULL
            CONSTRAINT column_d_chk CHECK (column_d LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'
                                       OR column_d LIKE '([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'),

    -- Add a nonnull column with a default.
        column_e DECIMAL (3, 3)
            CONSTRAINT column_e_default DEFAULT .081;
GO

EXECUTE sp_help doc_exe;
GO

DROP TABLE dbo.doc_exe;
GO

F. Varsayılan değerlerle boş değer atanabilir sütun ekleme

Aşağıdaki örnek, DEFAULT tanımına sahip null atanabilir bir sütun ekler ve tablodaki mevcut her satır için değer sağlamak için WITH VALUES kullanır. Kullanılmazsa WITH VALUES , her satırda yeni sütundaki değer NULL bulunur.

CREATE TABLE dbo.doc_exf (column_a INT);
GO

INSERT INTO dbo.doc_exf VALUES (1);
GO

ALTER TABLE dbo.doc_exf
    ADD AddDate SMALLDATETIME
        CONSTRAINT AddDateDflt DEFAULT GETDATE() WITH VALUES NULL;
GO

DROP TABLE dbo.doc_exf;
GO

G. Dizin veya veri sıkıştırma seçenekleriyle BİrİnCİl ANAHTAR kısıtlaması oluşturma

Aşağıdaki örnek kısıtlamayı PRIMARY KEYPK_TransactionHistoryArchive_TransactionID oluşturur ve , FILLFACTORve ONLINEseçeneklerini PAD_INDEXayarlar. Sonuçta elde edilen kümelenmiş dizin kısıtlamayla aynı ada sahiptir.

Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.

USE AdventureWorks2022;
GO

ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
    ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID
        PRIMARY KEY CLUSTERED (TransactionID) WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON);
GO

Bu benzer örnek, kümelenmiş birincil anahtar uygulanırken sayfa sıkıştırma uygular.

USE AdventureWorks2022;
GO

ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
    ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID
        PRIMARY KEY CLUSTERED (TransactionID) WITH (DATA_COMPRESSION = PAGE);
GO

H. Seyrek sütun ekleme

Aşağıdaki örneklerde T1 tablosunda seyrek sütunların eklenmesi ve değiştirilmesi gösterilmektedir. Tablo T1 oluşturma kodu aşağıdaki gibidir.

CREATE TABLE T1
(
    C1 INT PRIMARY KEY,
    C2 VARCHAR (50) SPARSE NULL,
    C3 INT SPARSE NULL,
    C4 INT
);
GO

C5başka bir seyrek sütun eklemek için aşağıdaki deyimi yürütür.

ALTER TABLE T1
    ADD C5 CHAR (100) SPARSE NULL;
GO

Seyrek olmayan C4 sütununu seyrek sütuna dönüştürmek için aşağıdaki deyimi yürütün.

ALTER TABLE T1
    ALTER COLUMN C4 ADD SPARSE;
GO

C4 seyrek sütununu seyrek olmayan bir sütuna dönüştürmek için aşağıdaki deyimi yürütün.

ALTER TABLE T1
    ALTER COLUMN C4 DROP SPARSE;
GO

I. Sütun kümesi ekleme

Aşağıdaki örneklerde tablo T2sütun ekleme gösterilmektedir. Zaten seyrek sütunlar içeren bir tabloya sütun kümesi eklenemez. Tablo T2 oluşturma kodu aşağıdaki gibidir.

CREATE TABLE T2
(
    C1 INT PRIMARY KEY,
    C2 VARCHAR (50) NULL,
    C3 INT NULL,
    C4 INT
);
GO

Aşağıdaki üç deyim, CSadlı bir sütun kümesi ekler ve ardından C2 ve C3 sütunları SPARSE olarak değiştirir.

ALTER TABLE T2
    ADD CS XML COLUMN_SET FOR ALL_SPARSE_COLUMNS;
GO

ALTER TABLE T2
    ALTER COLUMN C2 ADD SPARSE;
GO

ALTER TABLE T2
    ALTER COLUMN C3 ADD SPARSE;
GO

J. Şifrelenmiş sütun ekleme

Aşağıdaki deyim, PromotionCodeadlı şifrelenmiş bir sütun ekler.

ALTER TABLE Customers
    ADD PromotionCode NVARCHAR (100)
        ENCRYPTED WITH (
            COLUMN_ENCRYPTION_KEY = MyCEK,
            ENCRYPTION_TYPE = RANDOMIZED,
            ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
        );

K. Devam ettirilebilir işlemle birincil anahtar ekleme

240 dakikalık ALTER TABLE ile (a) sütununda kümelenmiş bir birincil anahtar eklemek için devam ettirilebilen MAX_DURATION işlemi.

ALTER TABLE table1
ADD CONSTRAINT PK_Constrain PRIMARY KEY CLUSTERED (a)
WITH (ONLINE = ON, MAXDOP = 2, RESUMABLE = ON, MAX_DURATION = 240);

Sütunları ve kısıtlamaları bırakma

Bu bölümdeki örneklerde sütunları ve kısıtlamaları bırakma gösterilmektedir.

A. Sütun veya sütun bırakma

İlk örnek, sütunu kaldırmak için tabloyu değiştirir. İkinci örnek birden çok sütunu kaldırır.

CREATE TABLE dbo.doc_exb
(
    column_a INT,
    column_b VARCHAR (20) NULL,
    column_c DATETIME,
    column_d INT
);
GO

-- Remove a single column.
ALTER TABLE dbo.doc_exb DROP COLUMN column_b;
GO

-- Remove multiple columns.
ALTER TABLE dbo.doc_exb DROP COLUMN column_c, column_d;

B. Kısıtlamaları ve sütunları bırakma

İlk örnek, tablodan UNIQUE kısıtlamasını kaldırır. İkinci örnek iki kısıtlamayı ve tek bir sütunu kaldırır.

CREATE TABLE dbo.doc_exc
(
    column_a INT NOT NULL
        CONSTRAINT my_constraint UNIQUE
);
GO

-- Example 1. Remove a single constraint.
ALTER TABLE dbo.doc_exc DROP my_constraint;
GO

DROP TABLE dbo.doc_exc;
GO

CREATE TABLE dbo.doc_exc
(
    column_a INT NOT NULL
        CONSTRAINT my_constraint UNIQUE,
    column_b INT NOT NULL
        CONSTRAINT my_pk_constraint PRIMARY KEY
);
GO

-- Example 2. Remove two constraints and one column
-- The keyword CONSTRAINT is optional. The keyword COLUMN is required.
ALTER TABLE dbo.doc_exc
    DROP CONSTRAINT my_constraint, my_pk_constraint, COLUMN column_b;
GO

C. BİRİnCİl ANAHTAR kısıtlamasını ÇEVRİmİÇİ modunda bırakma

Aşağıdaki örnek, seçeneği olarak ayarlanmış PRIMARY KEYbir ONLINE kısıtlamayı ON siler.

ALTER TABLE Production.TransactionHistoryArchive
    DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID
    WITH (ONLINE = ON);
GO

D. YABANCı ANAHTAR kısıtlaması ekleme ve bırakma

Aşağıdaki örnek, ContactBackuptablosunu oluşturur ve ardından önce FOREIGN KEYtabloya başvuran bir Person.Person kısıtlaması ekleyerek ve ardından FOREIGN KEY kısıtlamasını bırakarak tabloyu değiştirir.

CREATE TABLE Person.ContactBackup (ContactID INT);
GO

ALTER TABLE Person.ContactBackup
    ADD CONSTRAINT FK_ContactBackup_Contact
        FOREIGN KEY (ContactID) REFERENCES Person.Person (BusinessEntityID);
GO

ALTER TABLE Person.ContactBackup
    DROP CONSTRAINT FK_ContactBackup_Contact;
GO

DROP TABLE Person.ContactBackup;

Sütun tanımını değiştirme

A. Sütunun veri türünü değiştirme

Aşağıdaki örnek, bir tablonun sütununu INTDECIMALolarak değiştirir.

CREATE TABLE dbo.doc_exy (column_a INT);
GO

INSERT INTO dbo.doc_exy (column_a) VALUES (10);
GO

ALTER TABLE dbo.doc_exy ALTER COLUMN column_a DECIMAL (5, 2);
GO

DROP TABLE dbo.doc_exy;
GO

B. Sütunun boyutunu değiştirme

Aşağıdaki örnek, varchar sütununun boyutunu ve ondalık sütununun duyarlık ve ölçeğini artırır. Sütunlar veri içerdiğinden, sütun boyutu yalnızca artırılabilir. Ayrıca col_a benzersiz bir dizinde tanımlandığına dikkat edin. Veri türü col_a olduğundan ve dizin bir kısıtlamanın sonucu olmadığından boyutu PRIMARY KEY yine de artırılabilir.

-- Create a two-column table with a unique index on the varchar column.
CREATE TABLE dbo.doc_exy
(
    col_a VARCHAR (5) UNIQUE NOT NULL,
    col_b DECIMAL (4, 2)
);
GO

INSERT INTO dbo.doc_exy VALUES ('Test', 99.99);
GO

-- Verify the current column size.
SELECT name,
       TYPE_NAME(system_type_id),
       max_length,
       precision,
       scale
FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.doc_exy');
GO

-- Increase the size of the varchar column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_a VARCHAR (25);
GO

-- Increase the scale and precision of the decimal column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_b DECIMAL (10, 4);
GO

-- Insert a new row.
INSERT INTO dbo.doc_exy VALUES ('MyNewColumnSize', 99999.9999);
GO

-- Verify the current column size.
SELECT name,
       TYPE_NAME(system_type_id),
       max_length,
       precision,
       scale
FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.doc_exy');

C. Sütun harmanlamasını değiştirme

Aşağıdaki örnekte bir sütunun harmanlamasını değiştirme işlemi gösterilmektedir. İlk olarak, varsayılan kullanıcı harmanlaması ile bir tablo oluşturulur.

CREATE TABLE T3
(
    C1 INT PRIMARY KEY,
    C2 VARCHAR (50) NULL,
    C3 INT NULL,
    C4 INT
);
GO

Ardından sütun C2 harmanlama Latin1_General_BIN olarak değiştirilir. Veri türü değiştirilmese bile gereklidir.

ALTER TABLE T3
    ALTER COLUMN C2 VARCHAR (50) COLLATE Latin1_General_BIN;
GO

D. Sütunu şifreleme

Aşağıdaki örnekte, güvenli kuşatmalarla Always Encryptedkullanarak bir sütunun nasıl şifrelenmesi gösterilmektedir.

İlk olarak, şifrelenmiş sütunlar olmadan bir tablo oluşturulur.

CREATE TABLE T3
(
    C1 INT PRIMARY KEY,
    C2 VARCHAR (50) NULL,
    C3 INT NULL,
    C4 INT
);
GO

Ardından , 'C2' sütunu CEK1adlı bir sütun şifreleme anahtarı ve rastgele şifreleme ile şifrelenir. Aşağıdaki deyimin başarılı olması için:

  • Sütun şifreleme anahtarının kapanım etkin olması gerekir. Başka bir deyişle, kapanım hesaplamalarına izin veren bir sütun ana anahtarı (CMK) ile şifrelenmelidir.
  • Hedef SQL Server örneği güvenli kuşatmalarla Always Encrypted'ı desteklemelidir.
  • Deyiminin güvenli kuşatmalarla Always Encrypted için ayarlanmış bir bağlantı üzerinden ve desteklenen bir istemci sürücüsü kullanılarak verilmesi gerekir.
  • Çağıran uygulamanın cmk'ye erişimi olmalıdır ve bunu CEK1korumalıdır.
ALTER TABLE T3 ALTER COLUMN C2 VARCHAR (50)  ENCRYPTED WITH (
     COLUMN_ENCRYPTION_KEY = [CEK1],
     ENCRYPTION_TYPE = RANDOMIZED,
     ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
    ) NULL;
GO

Tablo tanımını değiştirme

Bu bölümdeki örneklerde bir tablonun tanımının nasıl değiştir olduğu gösterilmektedir.

A. Sıkıştırmayı değiştirmek için tabloyu değiştirme

Aşağıdaki örnek bölümlenmemiş bir tablonun sıkıştırmasını değiştirir. Yığın veya kümelenmiş dizin yeniden oluşturulur. Tablo bir yığınsa, tüm kümelenmemiş dizinler yeniden oluşturulur.

ALTER TABLE T1 REBUILD
    WITH (DATA_COMPRESSION = PAGE);

Aşağıdaki örnek bölümlenmiş tablonun sıkıştırmasını değiştirir. REBUILD PARTITION = 1 söz dizimi yalnızca bölüm numarasının yeniden oluşturulmasına 1 neden olur.

Şunlar için geçerlidir: SQL Server.

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

Aşağıdaki alternatif söz dizimini kullanan aynı işlem, tablodaki tüm bölümlerin yeniden oluşturulmasına neden olur.

Şunlar için geçerlidir: SQL Server.

ALTER TABLE PartitionTable1 REBUILD PARTITION = ALL
    WITH (DATA_COMPRESSION = PAGE ON PARTITIONS (1));

Ek veri sıkıştırma örnekleri için bkz. Veri sıkıştırma.

B. Arşiv sıkıştırmasını değiştirmek için columnstore tablosunu değiştirme

Aşağıdaki örnek, ek bir sıkıştırma algoritması uygulayarak columnstore tablo bölümünü daha da sıkıştırır. Bu sıkıştırma, tabloyu daha küçük bir boyuta indirir, ancak depolama ve alma için gereken süreyi de artırır. Bu, arşivleme veya daha az alan gerektiren ve depolama ve alma için daha fazla zaman ayırabilen durumlar için kullanışlıdır.

Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

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

Aşağıdaki örnek, seçenekle COLUMNSTORE_ARCHIVE sıkıştırılmış bir columnstore tablo bölümünün sıkıştırmasını kaldırmaktadır. Veriler geri yüklendiğinde, tüm columnstore tabloları için kullanılan columnstore sıkıştırması ile sıkıştırılmaya devam eder.

Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

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

C. Tablolar arasında bölümler arasında geçiş yapma

Aşağıdaki örnek, bölüm düzeni myRangePS1 veritabanında zaten oluşturulduğu varsayılarak bölümlenmiş bir tablo oluşturur. Ardından, bölümlenmiş tabloyla aynı yapıya sahip ve tablo PARTITION 2PartitionTable aynı dosya grubunda bölümlenmemiş bir tablo oluşturulur. Tablo PARTITION 2PartitionTable verileri NonPartitionTabletabloya geçirilir.

CREATE TABLE PartitionTable
(
    col1 INT,
    col2 CHAR (10)
) ON myRangePS1 (col1);
GO

CREATE TABLE NonPartitionTable
(
    col1 INT,
    col2 CHAR (10)
) ON test2fg;
GO

ALTER TABLE PartitionTable SWITCH PARTITION 2 TO NonPartitionTable;
GO

D. Bölümlenmiş tablolarda kilit yükseltmesine izin ver

Aşağıdaki örnek, kilit yükseltmesini bölümlenmiş bir tablodaki bölüm düzeyine etkinleştirir. Tablo bölümlenmemişse, kilit yükseltme düzeyi TABLE ayarlanır.

Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.

ALTER TABLE dbo.T1 SET (LOCK_ESCALATION = AUTO);
GO

E. Tabloda değişiklik izlemeyi yapılandırma

Aşağıdaki örnek, Person.Person tablosunda değişiklik izlemeyi etkinleştirir.

Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.

USE AdventureWorks2022;

ALTER TABLE Person.Person ENABLE CHANGE_TRACKING;

Aşağıdaki örnek, değişiklik izlemeyi etkinleştirir ve değişiklik sırasında güncelleştirilen sütunların izlenmesini etkinleştirir.

Şunlar için geçerlidir: SQL Server.

USE AdventureWorks2022;
GO

ALTER TABLE Person.Person ENABLE CHANGE_TRACKING
    WITH (TRACK_COLUMNS_UPDATED = ON);

Aşağıdaki örnek, Person.Person tablosunda değişiklik izlemeyi devre dışı bırakır.

Şunlar için geçerlidir: SQL Server ve Azure SQL Veritabanı.

USE AdventureWorks2022;
GO

ALTER TABLE Person.Person DISABLE CHANGE_TRACKING;

Kısıtlamaları ve tetikleyicileri devre dışı bırakma ve etkinleştirme

A. Kısıtlamayı devre dışı bırakma ve yeniden etkinleştirme

Aşağıdaki örnek, verilerde kabul edilen ücretleri sınırlayan bir kısıtlamayı devre dışı bırakır. NOCHECK CONSTRAINT, kısıtlamayı devre dışı bırakmak ve genellikle kısıtlamayı ihlal edecek bir eklemeye izin vermek için ALTER TABLE ile birlikte kullanılır. CHECK CONSTRAINT kısıtlamayı yeniden etkinleştirir.

CREATE TABLE dbo.cnst_example
(
    id INT NOT NULL,
    name VARCHAR (10) NOT NULL,
    salary MONEY NOT NULL
        CONSTRAINT salary_cap CHECK (salary < 100000)
);

-- Valid inserts
INSERT INTO dbo.cnst_example VALUES (1, 'Joe Brown', 65000);
INSERT INTO dbo.cnst_example VALUES (2, 'Mary Smith', 75000);

-- This insert violates the constraint.
INSERT INTO dbo.cnst_example VALUES (3, 'Pat Jones', 105000);

-- Disable the constraint and try again.
ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (3, 'Pat Jones', 105000);

-- Re-enable the constraint and try another insert; this fails.
ALTER TABLE dbo.cnst_example CHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (4, 'Eric James', 110000);

B. Tetikleyiciyi devre dışı bırakma ve yeniden etkinleştirme

Aşağıdaki örnek, tetikleyiciyi devre dışı bırakmak ve genellikle tetikleyiciyi ihlal edecek bir eklemeye izin vermek için DISABLE TRIGGERALTER TABLE seçeneğini kullanır. ENABLE TRIGGER daha sonra tetikleyiciyi yeniden etkinleştirmek için kullanılır.

CREATE TABLE dbo.trig_example
(
    id INT,
    name VARCHAR (12),
    salary MONEY
);
GO

-- Create the trigger.
CREATE TRIGGER dbo.trig1
    ON dbo.trig_example
    FOR INSERT
    AS IF (SELECT COUNT(*)
           FROM INSERTED
           WHERE salary > 100000) > 0
           BEGIN
               PRINT 'TRIG1 Error: you attempted to insert a salary > $100,000';
               ROLLBACK;
           END
GO

-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (1, 'Pat Smith', 100001);
GO

-- Disable the trigger.
ALTER TABLE dbo.trig_example DISABLE TRIGGER trig1;
GO

-- Try an insert that would typically violate the trigger.
INSERT INTO dbo.trig_example VALUES (2, 'Chuck Jones', 100001);
GO

-- Re-enable the trigger.
ALTER TABLE dbo.trig_example ENABLE TRIGGER trig1;
GO

-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (3, 'Mary Booth', 100001);
GO

Çevrimiçi işlemler

A. Düşük öncelikli bekleme seçeneklerini kullanarak çevrimiçi dizin yeniden oluşturma

Aşağıdaki örnek, düşük öncelikli bekleme seçeneklerini belirterek çevrimiçi dizin yeniden oluşturma işleminin nasıl gerçekleştirileceğini gösterir.

Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

ALTER TABLE T1 REBUILD WITH (
    PAD_INDEX = ON,
    ONLINE = ON (
        WAIT_AT_LOW_PRIORITY (MAX_DURATION = 4 MINUTES, ABORT_AFTER_WAIT = BLOCKERS)
    )
);

B. Çevrimiçi alter sütunu

Aşağıdaki örnekte, seçeneğiyle sütun değiştirme işleminin nasıl çalıştırılacakları gösterilmektedir ONLINE .

Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

CREATE TABLE dbo.doc_exy (column_a INT);
GO

INSERT INTO dbo.doc_exy (column_a) VALUES (10);
GO

ALTER TABLE dbo.doc_exy
    ALTER COLUMN column_a DECIMAL (5, 2) WITH (ONLINE = ON);
GO

EXECUTE sp_help doc_exy;
DROP TABLE dbo.doc_exy;
GO

Sistem sürümü oluşturma

Aşağıdaki dört örnek, sistem sürümü oluşturma kullanma söz dizimini tanımanıza yardımcı olur. Ek yardım için bkz. Sistem sürümüne sahip zamana bağlı tabloları kullanmaya başlama.

Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri ve Azure SQL Veritabanı.

A. Mevcut tablolara sistem sürümü oluşturma ekleme

Aşağıdaki örnekte, mevcut bir tabloya sistem sürümü oluşturmanın nasıl ekleneceği ve gelecekteki bir geçmiş tablosunun nasıl oluşturulacağı gösterilmektedir. Bu örnekte, birincil anahtar tanımlanmış InsurancePolicy adlı bir tablo olduğu varsayılır. Bu örnek, sistem sürümü oluşturma için yeni oluşturulan dönem sütunlarını başlangıç ve bitiş saatlerinin varsayılan değerlerini kullanarak doldurur çünkü bu değerler null olamaz. Bu örnekte, geçerli tabloyla etkileşim kuran mevcut uygulamalar üzerinde hiçbir etki olmadığından emin olmak için yan tümcesi kullanılır HIDDEN . Ayrıca yalnızca SQL Veritabanı'nda kullanılabilenleri kullanır HISTORY_RETENTION_PERIOD .

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

--Enable system versioning with 1 year retention for historical data
ALTER TABLE InsurancePolicy SET (
    SYSTEM_VERSIONING = ON (
        HISTORY_RETENTION_PERIOD=1 YEAR
    )
);

B. Sistem sürümü oluşturma özelliğini kullanmak için mevcut çözümü geçirme

Aşağıdaki örnekte, zamansal desteği taklit etmek için tetikleyicileri kullanan bir çözümden sistem sürümü oluşturma işlemine nasıl geçilmesi gösterilmektedir. Örnekte, mevcut çözümü için bir ProjectTask tablo ve ProjectTaskHistory tablo kullanan, dönemleri için ve Changed Date sütunlarını kullananRevised Date, bu dönem sütunlarının datetime2 veri türünü kullanmadığı ve tablonun tanımlanmış bir birincil anahtarı olduğu ProjectTask varsayılır.

-- Drop existing trigger
DROP TRIGGER ProjectTask_HistoryTrigger;

-- Adjust the schema for current and history table
-- Change data types for existing period columns
ALTER TABLE ProjectTask ALTER COLUMN [Changed Date] DATETIME2 NOT NULL;
ALTER TABLE ProjectTask ALTER COLUMN [Revised Date] DATETIME2 NOT NULL;
ALTER TABLE ProjectTaskHistory ALTER COLUMN [Changed Date] DATETIME2 NOT NULL;
ALTER TABLE ProjectTaskHistory ALTER COLUMN [Revised Date] DATETIME2 NOT NULL;

-- Add SYSTEM_TIME period and set system versioning with linking two existing tables
-- (a certain set of data checks happen in the background)
ALTER TABLE ProjectTask
    ADD PERIOD FOR SYSTEM_TIME ([Changed Date], [Revised Date]);

ALTER TABLE ProjectTask SET (
    SYSTEM_VERSIONING = ON (
        HISTORY_TABLE=dbo.ProjectTaskHistory, DATA_CONSISTENCY_CHECK=ON
    )
);

C. Tablo şemasını değiştirmek için sistem sürümü oluşturmayı devre dışı bırakma ve yeniden etkinleştirme

Bu örnekte, Department tablosunda sistem sürümü oluşturmayı devre dışı bırakma, sütun ekleme ve sistem sürümü oluşturmayı yeniden etkinleştirme gösterilmektedir. Tablo şemasını değiştirmek için sistem sürümü oluşturmayı devre dışı bırakmak gerekir. DBA'nın sistem sürümünü yeniden etkinleştirirken veri tutarlılığı denetimini atlamasını ve bir performans avantajı elde etmesini sağlayan tablo şemasını güncelleştirirken her iki tabloda da güncelleştirme yapılmasını önlemek için bu adımları bir işlem içinde gerçekleştirin. İstatistik oluşturma, bölümler arasında geçiş yapma veya tablolardan birine veya her iki tabloya sıkıştırma uygulama gibi görevler için sistem sürümü oluşturmanın devre dışı bırakılması gerekmez.

BEGIN TRAN
/* Takes schema lock on both tables */
ALTER TABLE Department
    SET (SYSTEM_VERSIONING = OFF) ;
/* expand table schema for temporal table */
ALTER TABLE Department
     ADD Col5 int NOT NULL DEFAULT 0 ;
/* Expand table schema for history table */
ALTER TABLE DepartmentHistory
    ADD Col5 int NOT NULL DEFAULT 0 ;
/* Re-establish versioning again*/
ALTER TABLE Department
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE=dbo.DepartmentHistory,
                                 DATA_CONSISTENCY_CHECK = OFF)) ;
COMMIT

D. Sistem sürümünü kaldırma

Bu örnekte, Department tablosundan sistem sürümü oluşturmanın nasıl tamamen kaldırılacağı ve DepartmentHistory tablosunun nasıl bırakılacağı gösterilmektedir. İsteğe bağlı olarak, sistem sürüm oluşturma bilgilerini kaydetmek için sistem tarafından kullanılan dönem sütunlarını da bırakmak isteyebilirsiniz. Sistem sürümü oluşturma etkinken Department veya DepartmentHistory tablolarını bırakamazsınız.

ALTER TABLE Department
    SET (SYSTEM_VERSIONING = OFF);

ALTER TABLE Department
    DROP PERIOD FOR SYSTEM_TIME;

DROP TABLE DepartmentHistory;

Örnekler: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)

Aşağıdaki A-C örnekleri, FactResellerSales veritabanındaki tablosunu kullanır.

A. Tablonun bölümlenip bölümlenmediğini belirleme

Tablo FactResellerSales bölümlenmişse aşağıdaki sorgu bir veya daha fazla satır döndürür. Tablo bölümlenmemişse, hiçbir satır döndürülemez.

SELECT *
FROM sys.partitions AS p
     INNER JOIN sys.tables AS t
         ON p.object_id = t.object_id
WHERE p.partition_id IS NOT NULL
      AND t.name = 'FactResellerSales';

B. Bölümlenmiş tablo için sınır değerlerini belirleme

Aşağıdaki sorgu, FactResellerSales tablosundaki her bölüm için sınır değerlerini döndürür.

SELECT t.name AS TableName,
       i.name AS IndexName,
       p.partition_number,
       p.partition_id,
       i.data_space_id,
       f.function_id,
       f.type_desc,
       r.boundary_id,
       r.value AS BoundaryValue
FROM sys.tables AS t
     INNER JOIN sys.indexes AS i
         ON t.object_id = i.object_id
     INNER JOIN sys.partitions AS p
         ON i.object_id = p.object_id
        AND i.index_id = p.index_id
     INNER JOIN sys.partition_schemes AS s
         ON i.data_space_id = s.data_space_id
     INNER JOIN sys.partition_functions AS f
         ON s.function_id = f.function_id
     LEFT OUTER JOIN sys.partition_range_values AS r
         ON f.function_id = r.function_id
        AND r.boundary_id = p.partition_number
WHERE t.name = 'FactResellerSales'
      AND i.type <= 1
ORDER BY p.partition_number;

C. Bölümlenmiş tablo için bölüm sütununu belirleme

Aşağıdaki sorgu, tablo için bölümleme sütununun FactResellerSales adını döndürür.

SELECT t.object_id AS Object_ID,
       t.name AS TableName,
       ic.column_id AS PartitioningColumnID,
       c.name AS PartitioningColumnName
FROM sys.tables AS t
     INNER JOIN sys.indexes AS i
         ON t.object_id = i.object_id
     INNER JOIN sys.columns AS c
         ON t.object_id = c.object_id
     INNER JOIN sys.partition_schemes AS ps
         ON ps.data_space_id = i.data_space_id
     INNER JOIN sys.index_columns AS ic
         ON ic.object_id = i.object_id
        AND ic.index_id = i.index_id
        AND ic.partition_ordinal > 0
WHERE t.name = 'FactResellerSales'
      AND i.type <= 1
      AND c.column_id = ic.column_id;

D. İki bölümü birleştirme

Aşağıdaki örnek, bir tablodaki iki bölümü birleştirir.

Customer tablosu aşağıdaki tanıma sahiptir:

CREATE TABLE Customer
(
    id INT NOT NULL,
    lastName VARCHAR (20),
    orderCount INT,
    orderDate DATE
)
WITH (
    DISTRIBUTION = HASH(id),
    PARTITION(orderCount RANGE LEFT
        FOR VALUES (1, 5, 10, 25, 50, 100)
    )
);

Aşağıdaki komut 10 ve 25 bölüm sınırlarını birleştirir.

ALTER TABLE Customer MERGE RANGE (10);

Tablo için yeni DDL şöyledir:

CREATE TABLE Customer
(
    id INT NOT NULL,
    lastName VARCHAR (20),
    orderCount INT,
    orderDate DATE
)
WITH (
    DISTRIBUTION = HASH(id),
    PARTITION(orderCount RANGE LEFT
        FOR VALUES (1, 5, 25, 50, 100)
    )
);

E. Bölümü bölme

Aşağıdaki örnek, bir tablodaki bölümü böler.

Customer tablosunda aşağıdaki DDL vardır:

DROP TABLE Customer;

CREATE TABLE Customer
(
    id INT NOT NULL,
    lastName VARCHAR (20),
    orderCount INT,
    orderDate DATE
)
WITH (
    DISTRIBUTION = HASH(id),
    PARTITION(orderCount RANGE LEFT
        FOR VALUES (1, 5, 10, 25, 50, 100)
    )
);

Aşağıdaki komut, 50 ile 100 arasında 75 değerine bağlı yeni bir bölüm oluşturur.

ALTER TABLE Customer SPLIT RANGE (75);

Tablo için yeni DDL şöyledir:

CREATE TABLE Customer (
   id INT NOT NULL,
   lastName VARCHAR(20),
   orderCount INT,
   orderDate DATE)
   WITH DISTRIBUTION = HASH(id),
   PARTITION ( orderCount (RANGE LEFT
      FOR VALUES (1, 5, 10, 25, 50, 75, 100))) ;

F. Bölümü geçmiş tablosuna taşımak için SWITCH kullanma

Aşağıdaki örnek, Orders tablosunun bir bölümündeki verileri OrdersHistory tablosundaki bir bölüme taşır.

Orders tablosunda aşağıdaki DDL vardır:

CREATE TABLE Orders
(
    id INT,
    city VARCHAR (25),
    lastUpdateDate DATE,
    orderDate DATE
)
WITH (
    DISTRIBUTION = HASH(id),
    PARTITION(orderDate RANGE RIGHT
        FOR VALUES ('2004-01-01', '2005-01-01', '2006-01-01', '2007-01-01')
    )
);

Bu örnekte, Orders tablosunda aşağıdaki bölümler bulunur. Her bölüm veri içerir.

Partition Veri var mı? Sınır aralığı
1 Yes OrderDate < '2004-01-01'
2 Yes '2004-01-01' <= OrderDate < '2005-01-01'
3 Yes '2005-01-01' <= OrderDate< '2006-01-01'
4 Yes '2006-01-01'<= OrderDate < '2007-01-01'
5 Yes '2007-01-01' <= OrderDate
  • Bölüm 1 (veri var): OrderDate < '2004-01-01'
  • Bölüm 2 (veri var): '2004-01-01' <= OrderDate < '2005-01-01'
  • Bölüm 3 (veri var): '2005-01-01' <= OrderDate< '2006-01-01'
  • Bölüm 4 (veri var): '2006-01-01'<= OrderDate < '2007-01-01'
  • Bölüm 5 (veri var): '2007-01-01' <= OrderDate

OrdersHistory tablosunda, Orders tablosuyla aynı sütunlara ve sütun adlara sahip aşağıdaki DDL bulunur. Her ikisi de id sütununda karma olarak dağıtılır.

CREATE TABLE OrdersHistory
(
    id INT,
    city VARCHAR (25),
    lastUpdateDate DATE,
    orderDate DATE
)
WITH (
    DISTRIBUTION = HASH(id),
    PARTITION(orderDate RANGE RIGHT
        FOR VALUES ('2004-01-01')
    )
);

Sütun ve sütun adlarının aynı olması gerekse de bölüm sınırlarının aynı olması gerekmez. Bu örnekte, OrdersHistory tablosunda aşağıdaki iki bölüm vardır ve her iki bölüm de boş olur:

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

Önceki iki tablo için aşağıdaki komut, OrderDate < '2004-01-01' tablosundan Orders tablosuna OrdersHistory olan tüm satırları taşır.

ALTER TABLE Orders SWITCH PARTITION 1 TO OrdersHistory PARTITION 1;

Sonuç olarak, Orders içindeki ilk bölüm boş olur ve OrdersHistory'daki ilk bölüm veri içerir. Tablolar artık aşağıdaki gibi görünür:

Orders tablosu

  • Bölüm 1 (boş): OrderDate < '2004-01-01'
  • Bölüm 2 (veri var): '2004-01-01' <= OrderDate < '2005-01-01'
  • Bölüm 3 (veri var): '2005-01-01' <= OrderDate< '2006-01-01'
  • Bölüm 4 (veri var): '2006-01-01'<= OrderDate < '2007-01-01'
  • Bölüm 5 (veri var): '2007-01-01' <= OrderDate

OrdersHistory tablosu

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

Tabloyu temizlemek Orders için, bölümleri birleştirerek ve 1 aşağıdaki gibi boş bölümü 2 kaldırabilirsiniz:

ALTER TABLE Orders MERGE RANGE ('2004-01-01');

Birleştirme işleminden sonra Orders tablosunda aşağıdaki bölümler yer alır:

Orders tablosu

  • Bölüm 1 (veri var): OrderDate < '2005-01-01'
  • Bölüm 2 (veri var): '2005-01-01' <= OrderDate< '2006-01-01'
  • Bölüm 3 (veri var): '2006-01-01'<= OrderDate < '2007-01-01'
  • Bölüm 4 (veri var): '2007-01-01' <= OrderDate

Bir yıl daha geçtiğini ve 2005 yılını arşivlemeye hazır olduğunuzu varsayalım. Boş bölümü aşağıdaki gibi bölerek OrdersHistory tablosunda 2005 yılı için boş bir bölüm ayırabilirsiniz:

ALTER TABLE OrdersHistory SPLIT RANGE ('2005-01-01');

Bölmeden sonra OrdersHistory tablosunda aşağıdaki bölümler vardır:

OrdersHistory tablosu

  • Bölüm 1 (veri var): OrderDate < '2004-01-01'
  • Bölüm 2 (boş): '2004-01-01' < '2005-01-01'
  • Bölüm 3 (boş): '2005-01-01' <= OrderDate