Aracılığıyla paylaş


ALTER TABLE (Transact-SQL)

Applies to:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnalytics Platform Sistemi (PDW)Warehouse in Microsoft FabricSQL veritabanı Microsoft Fabric

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

Tavsiye

ALTER TABLE söz dizimi, Microsoft SQL Database Engine farklı sürümlerinde farklılık gösterir. Uygun ürün sürümünü seçmek için sürüm seçici açılan listesini kullanın.

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 Data Warehouse 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'daki sunucusuz SQL havuzu yalnızca external ve temporary tablolarını destekler.

Fabric'da 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> ::= type_name [ ( precision [ , scale ] ) ]

<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

veritabanı_adı

Tabloyu oluşturduğunuz veritabanının adı.

schema_name

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

tablo_adı

Değiştirecek tablonun adı. Tablo geçerli veritabanında değilse veya tablo şeması geçerli kullanıcıya ait değilse, veritabanını ve şemayı açıkça belirtmeniz gerekir.

ALTER SÜTUNU

Değiştirecek adlandırılmış sütunu 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. Bu istatistikleri bırakmak için, önce ALTER COLUMN komutunu çalıştırarak DROP STATISTICS başarılı olun. Bir tablonun kullanıcı tarafından oluşturulan 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>');
    
  • Veya PRIMARY KEY[FOREIGN KEY] REFERENCES kısıtlamasında kullanılır.

  • Veya CHECKUNIQUE kısıtlamasında kullanılır. Ancak, veya UNIQUE kısıtlamasında kullanılan CHECK değişken uzunluklu sütunun uzunluğunu değiştirebilirsiniz.

  • Varsayılan bir tanım ile ilişkilendirildi. Ancak, veri türünü değiştirmezseniz sütunun uzunluğunu, duyarlığı veya ölçeğini değiştirebilirsiniz.

ALTER COLUMN sorgu iyileştiricisinin otomatik olarak oluşturduğu istatistikleri bırakır.

Metin, ntext ve görüntü sütunlarının veri türünü yalnızca aşağıdaki yollarla değiştirebilirsiniz:

  • 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 varchar olarak değiştirmek, genişletilmiş karakterlerin dönüştürülmesine neden olabilir. Daha fazla bilgi için bkz. CAST ve CONVERT (Transact-SQL).

  • Bir sütunun duyarlığını veya ölçeğini azaltmak verilerin kesilmesine neden olabilir.
  • Bölümlenmiş tablodaki bir sütunun veri türünü değiştiremezsiniz.
  • Sütun bir varchar, nvarchar veya 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ünü değiştiremezsiniz.
  • Birincil anahtar kısıtlamasına dahil olan bir sütunu olarak NOT NULL değiştiremezsiniz NULL.

Always Encrypted kullandığınızda (güvenli kuşatmalar olmadan), ile ENCRYPTED WITHşifrelenmiş bir sütunu değiştirirseniz, veri türünü uyumlu bir veri türüyle (int-bigint gibi) değiştirebilirsiniz, ancak herhangi bir şifreleme ayarlarını değiştiremezsiniz.

Always Encrypted'ı güvenli kuşatmalarla kullandığınızda, 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 master 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, Database Engine 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, Database Engine kayıt boyutu sınırına ulaşabilir. Böyle bir durumda MSSQLSERVER_511 veya 1708 hatası alırsınız. Bu hataları önlemek için, tablodaki kümelenmiş dizini düzenli aralıklarla yeniden oluşturun veya sütun değişikliği sayısını azaltın.

sütun_adı

Değiştirilip eklenecek veya bırakıla 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.

Aşağıdaki ölçütler, değiştirilen bir sütunun type_name için geçerlidir:

  • Ö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ılan değerler 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ümcesini COLLATE belirtmezseniz, bir sütunun veri türünü değiştirmek, veritabanının varsayılan harmanlaması için harmanlama değişikliğine neden olur.

hassasiyet

Belirtilen veri türü için duyarlık. Geçerli duyarlık değerleri hakkında daha fazla bilgi için bkz. Precision, scale ve length (Transact-SQL).

scale

Belirtilen veri türü için ölçek. Geçerli ölçek değerleri hakkında daha fazla bilgi için bkz. Öndirim, ölçek ve uzunluk (Transact-SQL).

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

Applies to: 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. Şema koleksiyonuna xml sütunu yazmadan önce, önce CREATE XML SCHEMA COLLECTION (Transact-SQL) kullanarak veritabanında şema koleksiyonunu oluşturursunuz.

HARMANLAMA <collation_name>

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

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ı ALTER TABLE deyimlerini kullanarak sütunu 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 (Transact-SQL).

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 kullanarak ALTER TABLE ekleyebilirsiniz. Hesaplanan sütunlar için yalnızca öğesini de belirtirseniz 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. 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. örneğin, izin verilmeden önce null değerleri bir değerle ALTER COLUMNNOT NULL güncelleştirmeniz gerekir:

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

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

veya ALTER TABLE deyimlerini kullanarak CREATE TABLE tablo oluşturduğunuzda veya değiştirdiğinizde, veritabanı ve oturum ayarları sütun tanımında belirttiğiniz veri türünün null atanabilirliğini etkileyebilir ve geçersiz kılabilir. Bir sütunu NULLNOT NULL her zaman veya uyumsuz sütunlar için açıkça tanımlayın.

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 (Transact-SQL).

Note

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

[ {ADD | DÜŞER} ROWGUIDCOL ]

Applies to: 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. Özelliğini yalnızca bir benzersizleştirici sütununa atayabilirsinizROWGUIDCOL. 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. PERSISTED olarak belirtilen sütunlar için, Database Engine hesaplanan değerleri tabloda fiziksel olarak depolar ve hesaplanan sütunun bağlı 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 (Transact-SQL).

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 onelake Fabric yansıtılamaz.

ÇOĞALTMA IÇIN BıRAKMA

Applies to: 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')

Applies to: 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

Applies to: 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 COLUMN , kullanıcı tarafından oluşturulan ve otomatik durumbilimlerin işlem süresi boyunca değiştirilen sütuna başvurmasına olanak tanır ve bu da sorguların ALTER COLUMN her zamanki gibi çalışmasına olanak tanır. İşlemin sonunda sütuna başvuran otomatik istatistikler bırakılır ve kullanıcı tarafından oluşturulan istatistikler geçersiz kılınmış olur. Kullanıcı, işlem tamamlandıktan sonra kullanıcı tarafından oluşturulan istatistikleri el ile güncelleştirmelidir. Sütun, herhangi bir istatistik veya dizin için bir filtre ifadesinin parçasıysa, işlem ALTER COLUMN gerçekleştiremezsiniz.

  • Çevrimiçi ALTER COLUMN işlem çalışırken, bu sütuna bağlı olabilecek tüm DDL işlemleri (dizinleri veya görünümleri oluşturma veya değiştirme gibi) engellenir veya uygun bir hatayla başarısız olur. Bu davranış, işlem çalışırken sunulan bağımlılıklar nedeniyle çevrimiçinin ALTER COLUMN 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.

  • seçeneği WAIT_AT_LOW_PRIORITY çevrimiçi ALTER COLUMNile kullanılamaz.

  • ALTER COLUMN ... ADD/DROP PERSISTED çevrimiçi ALTER COLUMNiçin desteklenmez.

  • ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION çevrimiçi ALTER COLUMNdurumdan etkilenmez.

  • Çevrimiçi ALTER COLUMN , 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 COLUMN , clr veri türlerinden veya clr veri türlerine değiştirmeyi desteklemez.

  • Çevrimiçi ALTER COLUMN , geçerli şema koleksiyonundan farklı bir şema koleksiyonuna sahip bir XML veri türünde değiştirmeyi desteklemez.

  • Çevrimiçi ALTER COLUMN , bir sütunun ne zaman değiştirilebileceğiyle ilgili kısıtlamaları azaltmaz. Dizine, istatistiklere vb. göre başvurular, değişikliğin başarısız olmasına neden olabilir.

  • Çevrimiçi ALTER COLUMN , birden fazla sütunun eşzamanlı olarak değiştirilmesini desteklemez.

  • Çevrimiçi ALTER COLUMN sürümlü bir zamana bağlı tabloda hiçbir etkisi yoktur. 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 COLUMN , 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 COLUMNiç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. Bu genellikle önerilmez, ancak bazı durumlarda gerekli olabilir. 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

ALTER TABLE deyimi kullanmadan deyimleri CREATE INDEX (Transact-SQL), DROP INDEX (Transact-SQL), ALTER INDEX (Transact-SQL) ve ALTER TABLE index_option (Transact-SQL) dizinler için desteklenmez bellek için iyileştirilmiş tablolar.

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

ALTER TABLE deyimi kullanmadan deyimleri CREATE INDEX (Transact-SQL), DROP INDEX (Transact-SQL), ALTER INDEX (Transact-SQL) ve ALTER TABLE index_option (Transact-SQL) dizinler için desteklenmez bellek için iyileştirilmiş tablolar.

SYSTEM_TIME DÖNEMİ ( system_start_time_column_name, system_end_time_column_name )

Applies to: 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, SELECT * FROM <table_name> sütunların değerini döndürmemesi için bu sütunları örtük olarak gizlemek için HIDDEN bayrağıyla bir veya iki nokta sütununu 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

ALTER TABLE deyimi kullanmadan deyimleri CREATE INDEX (Transact-SQL), DROP INDEX (Transact-SQL), ALTER INDEX (Transact-SQL) ve ALTER TABLE index_option (Transact-SQL) dizinler için desteklenmez bellek için iyileştirilmiş tablolar.

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 INDEX (Transact-SQL) kullanarak 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İ

Applies to: 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

Applies to: 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 işlemlerini yapılandırma.

Note

Paralel dizin işlemleri SQL Server her sürümünde kullanılamaz. Daha fazla bilgi için bkz. Editions ve desteklenen SQL Server 2022 ö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 her sürümünde kullanılamaz. Daha fazla bilgi için bkz. Editions ve desteklenen SQL Server 2022 özellikleri.

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

Applies to: 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 (Transact-SQL).

{ 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

Applies to: 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 seçenekleri (Transact-SQL).

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

ILE ( TRACK_COLUMNS_UPDATED = { ÜZERINDE | KAPALI } )

Applies to: SQL Server ve Azure SQL Veritabanı.

İzlenen sütunların güncelleştirildiği Database Engine izlenip güncelleştirilmediğ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 ]

Applies to: 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 bir 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" })

Applies to: SQL Server. Azure SQL Veritabanı FILESTREAM desteklemez.

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_name belirtirseniz, CREATE TABLE (Transact-SQL) 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 (Transact-SQL) deyimi kullanılarak dosya grubu için tanımlanmış bir dosyaya sahip olmalıdır; aksi durumda 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 } ] ) ] } )

Applies to: 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 } }

Applies to: 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

Applies to: Uç Cihazlar için Azure SQL only

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

Applies to: SQL Server ve Azure SQL Veritabanı.

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

  • AUTO

    Bu seçenek, SQL Server Database Engine 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, Database Engine veri bütünlüğünü korumak için bir tablo kilidi almanız 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Ü

Applies to: 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 (Transact-SQL).

DATA_COMPRESSION

Applies to: 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

    Applies to: 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

    Applies to: 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.

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

XML_COMPRESSION

Applies to: SQL Server 2022 (16.x) ve sonraki sürümleri, 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

Applies to: 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

Applies to: 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 )

Applies to: 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

Applies to: SQL Server 2017 (14.x) ve sonraki sürümleri.

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ı'da kullanım dışıdır. Bu özellik, Database Engine 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 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 SQL Server 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 SQL Server geri kopyalandıktan sonra, tablo için Esnetme 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 } ]

Applies to: SQL Server 2017 (14.x) ve sonraki sürümleri.

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

Applies to: SQL Server 2017 (14.x) ve sonraki sürümleri.

WAIT_AT_LOW_PRIORITY

Applies to: 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 ]

Applies to: 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 }

Applies to: 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

Applies to: 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}

Applies to: 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_constraint (Transact-SQL)ALTER TABLE index_option (Transact-SQL) 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 INSERT (Transact-SQL) kullanın. Veri satırlarını kaldırmak için DELETE (Transact-SQL) veya TRUNCATE TABLE (Transact-SQL) kullanın. Var olan satırlardaki değerleri değiştirmek için UPDATE (Transact-SQL) kullanı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.

Şu anda bellek içi, kayıt defteri, kayıt defteri geçmişi ve Always Encrypted tabloları Microsoft Fabric'daki SQL veritabanında oluşturulamaz. Daha fazla bilgi için bkz. Microsoft Fabric'da SQL veritabanında Limitations.

Microsoft Fabric'daki SQL veritabanında bazı tablo özellikleri oluşturulabilir ancak Fabric OneLake içine aktarılamaz. Daha fazla bilgi için bkz. Fabric SQL veritabanı yansıtma için Limitations.

Fabric Data Warehouse'da desteklenen ALTER TABLE Transact-SQL işlemleri açık bir kullanıcı tanımlı işlem içinde yürütülebilir. Daha fazla bilgi için bkz. Fabric Data Warehouse Transactions.

Fabric Data Warehouse'da dağıtılmış #temp tablolarını ALTER TABLE ile değiştirebilirsiniz ancak MDF destekli geçici tablolarla değiştiremezsiniz. Daha fazla bilgi için bkz. Fabric Data Warehouse #temp tabloları.

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 geçerli olur. Değişiklikler tablodaki satırlarda değişiklik yapılmasını gerektiriyorsa, ALTER TABLE satırları güncelleştirir. ALTER TABLE , sonunda kısa bir Sch-M kilidi gerektiren çevrimiçi dizin işlemleri dışında, değişiklik sırasında tablonun meta verilerine başka hiçbir bağlantının başvurmadığından emin olmak için tabloda ş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 bazı sürümlerinde varsayılan değere sahip bir NOT NULL sütunu ekleme gibi büyük tablolardaki tüm satırları etkileyen değişikliklerin tamamlanması ve çok sayıda günlük kaydı oluşturulması uzun sürebilir. Bu ALTER TABLE deyimleri, birçok satırı etkileyen herhangi bir INSERT, UPDATEveya DELETE deyimiyle aynı özenle çalıştırın.

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ğerle NOT NULL sütunu eklemek, varsayılan değer runtime sabiti olduğunda çevrimiçi bir işlemdir. Bu varsayılan davranış, tablodaki satır sayısına rağmen işlemin neredeyse anında tamamlandığını gösterir çü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.

Çevrimiçi bir işlemde varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography veya CLR kullanıcı tanımlı türler türünde sütunlar ekleyemezsiniz. Bunun yapılması, olası en büyük satır boyutunun 8.060 bayt sınırını aşmasına neden oluyorsa, çevrimiçi sütun ekleyemezsiniz. 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 max degree of parallelism yapılandırma seçeneği ve geçerli iş yükü, tek bir ALTER TABLE ADD (dizin tabanlı) CONSTRAINT veya DROP (kümelenmiş dizin) CONSTRAINT deyimi çalıştıran işlemci sayısını belirler. Database Engine sistemin meşgul olduğunu algılarsa, deyimi yürütme başlamadan önce işlemin paralellik derecesini otomatik olarak azaltır. seçeneğini belirterek MAXDOP deyimini çalıştıran 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 işlemler gerçekleştirmeye SWITCH ek olarak, ALTER TABLE bölümlenmiş bir tablonun sütunlarının, kısıtlamalarının ve tetikleyicilerinin durumunu değiştirmek için kullanın; aynı bölümlenmemiş tablolarda kullandığınız gibi. Ancak, tablonun bölümlenme biçimini değiştirmek için bu deyimi kullanamazsınız. Bölümlenmiş tabloyu yeniden bölümlendirmek için ALTER PARTITION SCHEME (Transact-SQL) ve ALTER PARTITION FUNCTION (Transact-SQL) kullanın. 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 ekleyebilirsiniz. Ancak, şemaya bağlı hiçbir görünüme katılan bir sütunu kaldıramaz veya değiştiremezsiniz. ALTER TABLE deyimi şemaya bağlı görünümde kullanılan bir sütunu değiştirmeyi gerektiriyorsa, ALTER TABLE başarısız olur ve Database Engine bir hata iletisi oluşturur. Şema bağlaması ve dizine alınan görünümler hakkında daha fazla bilgi için bkz. CREATE VIEW (Transact-SQL).

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. kullanarak CREATE INDEXoluşturduğunuz dizinleri bırakmak için kullanın DROP INDEX. Kısıtlama tanımının ALTER INDEX parçası olan bir dizini yeniden oluşturmak için deyimini kullanın. kullanarak ALTER TABLEkısıtlamayı yeniden bırakmanız ve eklemeniz gerekmez.

Bu sütunu kaldırabilmeniz için önce bir sütunu temel alan tüm dizinleri ve kısıtlamaları kaldırmanız 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.

  • belirtmezseniz 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ılmış dizinleri kullanarak ONLINE = OFFbırakmanız gerekir.
  • Bir kerede yalnızca bir dizin bırakabilirsiniz.
  • 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ı gerekir. Bu işlem tamamlandığında ek alanı serbest bırakır.

Note

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

Şema değişikliklerini çoğaltma

SQL Server Publisher yayımlanan bir tabloda ALTER TABLE çalıştırdığınızda, 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ı için sıkıştırmayı etkinleştiremezsiniz. 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ılmış ntext veri türünü kullanan sütunları bıraktığınızda, 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 sayıda satır içeren bir tabloya ntext sütunu bıraktığınızda, ntext sütununu önce değere NULL güncelleştirin ve 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 kilit beklemesi, 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ışı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 olur.

  • 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 olacak sütunlar tanımlarsanız, REFERENCES tür üzerinde izin gerekir.

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, Microsoft SQL Server Örnekler ve Topluluk Projeleri giriş sayfasından indirebileceğiniz AdventureWorks2025 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 tanım içermeyen 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, örnek kısıtlamanın mevcut satırlarda doğrulanmasını önlemek ve kısıtlamanın eklenmesine izin vermek için kullanır WITH NOCHECK .

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 diğer sütun kalırken NULLilk sütuna bir değer ekler. Örnek daha sonra ikinci sütuna bir DEFAULT kısıtlama ekler. Varsayılanın uygulandığını doğrulamak için örnek, ilk sütuna başka bir değer ekler ve tabloyu sorgular.

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. kullanmıyorsanız WITH VALUES, her satır yeni sütundaki değere NULL sahiptir.

CREATE TABLE dbo.doc_exf (column_a INT);
GO

INSERT INTO dbo.doc_exf VALUES (1);
GO

ALTER TABLE dbo.doc_exf
    ADD AddDate SMALLDATETIME
        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.

Applies to: 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 tabloya T2sütun ekleme gösterilmektedir. Zaten seyrek sütunlar içeren bir tabloya sütun kümesi ekleyemezsiniz. Aşağıdaki kod, tablosunu T2oluşturur.

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ın ve kısıtlamaların nasıl bırakılıp bırakılamları 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, tablosunu ContactBackupoluşturur ve tabloyu değiştirir. İlk olarak, tablosuna Person.Personbaşvuran bir FOREIGN KEY kısıtlama ekler. Ardından kısıtlamayı FOREIGN KEY düşürür.

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 yalnızca sütun boyutunu artırabilirsiniz. Ayrıca col_a benzersiz bir dizinde tanımlandığına dikkat edin. Veri türü bir varchar olduğundan ve dizin bir PRIMARY KEY kısıtlamanın sonucu olmadığından boyutunu col_a yine de artırabilirsiniz.

-- 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şturursunuz.

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

Ardından sütunun harmanlamasını C2 olarak Latin1_General_BINdeğiştirin. Değiştirilmese bile veri türünü belirtmeniz gerekir.

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 Encrypted kullanarak bir sütunun nasıl şifrelenmesi gösterilmektedir.

İlk olarak, şifrelenmiş sütun içermeyen bir tablo oluşturursunuz.

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

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

  • Sütun şifreleme anahtarının kapanım etkin olması gerekir. Bu gereksinim, kapanım hesaplamalarına izin veren bir sütun master anahtarı (CMK) kullanılarak şifrelenmesinin gerektiği anlamına gelir.
  • 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.

Applies to: 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.

Applies to: 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 sıkıştırma, 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.

Applies to: 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.

Applies to: 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.

Applies to: 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.

Applies to: 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.

Applies to: 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.

Applies to: 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. Kısıtlamayı devre dışı bırakmak ve genellikle kısıtlamayı ihlal edecek bir eklemeye izin vermek için ile ALTER TABLE kullanınNOCHECK CONSTRAINT. Kısıtlamayı yeniden etkinleştirmek için kullanın CHECK CONSTRAINT .

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 DISABLE TRIGGER devre dışı bırakmak ve genellikle tetikleyiciyi ihlal edecek bir eklemeye izin vermek için seçeneğini ALTER TABLE kullanır. Tetikleyiciyi yeniden etkinleştirmek için kullanın ENABLE TRIGGER .

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.

Applies to: 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 .

Applies to: 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.

Applies to: 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 Analiz Platformu 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, sorgu satır döndürmez.

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