ALTER TABLE (Transact-SQL)

Sütun ve kısıtlamaları değiştirerek, ekleyerek veya bırakarak, bölümlemeleri yeniden atayarak veya kısıtlamaları ve tetikleyicileri devre dışı bırakarak veya etkinleştirerek bir tablonun tanımını değiştirir.

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

Sözdizimi

ALTER TABLE [ database_name . [ schema_name ] . | schema_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 }
    } 
        | [ WITH { CHECK | NOCHECK } ]

    | ADD 
    { 
        <column_definition>
      | <computed_column_definition>
      | <table_constraint> 
      | <column_set_definition> 
    } [ ,...n ]

    | DROP 
    { 
        [ CONSTRAINT ] constraint_name 
        [ WITH ( <drop_clustered_constraint_option> [ ,...n ] ) ]
        | COLUMN column_name 
    } [ ,...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 ]

    | SET ( FILESTREAM_ON = { partition_scheme_name | filegroup | 
                "default" | "NULL" } )

    | REBUILD 
      [ [PARTITION = ALL]
        [ WITH ( <rebuild_option> [ ,...n ] ) ] 
      | [ PARTITION = partition_number 
           [ WITH ( <single_partition_rebuild_option> [ ,...n ] ) ]
        ]
      ]

    | (<table_option>)

    | (<filetable_option>)

}
[ ; ]

-- 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 ) ]
    }
<single_partition_rebuild__option> ::=
{
      SORT_IN_TEMPDB = { ON | OFF }
    | MAXDOP = max_degree_of_parallelism
    | DATA_COMPRESSION = { NONE | ROW | PAGE} }
}

Bağımsız değişkenler

  • database_name
    Tablonun oluşturulduğu veritabanının adıdır.

  • schema_name
    Tablonun ait olduğu şemanın adıdır.

  • table_name
    Değiştirilecek tablonun adıdır. Tablo geçerli veritabanında değilse veya geçerli kullanıcıya ait şemada içerilmiyorsa, veritabanının ve şemanın açıkça belirtilmesi gerekir.

  • ALTER COLUMN
    Adlandırılan sütunun değiştirileceğini belirtir.

    Değiştirilen sütun aşağıdakilerden biri olamaz:

    • timestamp veri türünde olan bir sütun.

    • Tablonun ROWGUIDCOL sütunu.

    • Hesaplanan bir sütun veya hesaplanan bir sütunda kullanılan bir sütun.

    • Sütun bir varchar, nvarchar veya varbinary veri türünde değilse, veri türü değiştirilmiyorsa, yeni boyut eski boyuta eşit veya ondan büyükse ve dizin bir PRIMARY KEY kısıtlamasının sonucu değilse, bir dizinde kullanılan bir sütun.

    • Sütun bir varchar, nvarchar veya varbinary veri türünde değilse, veri türü değiştirilmiyorsa ve yeni boyuıt eski boyuta eşit veya ondan büyük değilse veya sütun null olmayan değerden null olan değere çevriliyorsa, CREATE STATISTICS deyiminin ürettiği istatistiklerde kullanılan bir sütun. Önce DROP STATISTICS deyimini kullanarak istatistikleri kaldırın. Sorgu iyileştirici tarafından otomatik olarak üretilen istatistikler ALTER COLUMN ile otomatik olarak bırakılır.

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

    • Bir CHECK veya UNIQUE kısıtlamasında kullanılır. Ancak, bir CHECK veya UNIQUE kısıtlamasında, değişken uzunlukta bir sütunun uzunluğu değiştirilebilir.

    • Varsayılan bir tanımla ilişkilidir. Ancak, veri türü değiştirilmezse bir sütunun uzunluğu, kesinliği veya ölçeği değiştirilebilir.

      text, ntext ve image sütunlarının veri türü yalnızca aşağıdaki yöntemlerle değiştirilebilir:

      • text türünden varchar(max), nvarchar(max) veya xml türüne

      • ntext türünden varchar(max), nvarchar(max) veya xml türüne

      • image - varbinary(max)

      Bazı veri türü değişiklikleri veride değişikliklere neden olabilir. Örneğin, nchar veya nvarchar sütununu char veya varchar türü ile 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 kesinliğini veya ölçeğini düşürmek verilerin kırpılmasına neden olabilir.

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

  • column_name
    Değiştirilecek, eklenecek veya bırakılacak sütunun adıdır. column_name en çok 128 karakter olabilir. Yeni sütunlarda, timestamp veri türü ile oluşturulmuş sütunlarda column_name çıkarılabilir. Bir timestamp veri türü sütunu için bir column_name belirtilirmezse, timestamp adı kullanılır.

  • [ type_schema_name**.** ] type_name
    Değiştirilen sütunun veya eklenen sütunun yeni veri türüdür. Bölümlenmiş tabloların var olan sütunları için type_name belirtilemez. type_name aşağıdakilerden biri olabilir:

    • Bir SQL Server sistem veri türü.

    • Bir SQL Server sistem veri türüne dayanan diğer adlı bir veri türü. Bir tablo tanımında kullanılabilmeleri için diğer adlı veri türlerinin önce CREATE TYPE deyimi ile oluşturulmaları gerekir.

    • Kullanıcı tanımlı bir .NET Framework türü ve ait olduğu şema. Bir tablo tanımında kullanılabilmeleri için, kullanıcı tanımlı .NET Framework veri türlerinin önce CREATE TYPE deyimi ile oluşturulmaları gerekir.

    Aşağıda değiştirilmiş bir sütununun type_name ölçütleri verilmiştir:

    • Önceki veri türünün yeni veri türüne örtük olarak dönüştürülebilmesi gerekir.

    • type_name timestamp olamaz.

    • ANSI_NULL varsayılanları ALTER COLUMN için her zaman açıktır; belirtilmezse, sütun null değer alabilir.

    • ANSI_PADDING dolgusu ayarı ALTER COLUMN için her zaman ON'dur.

    • Değiştirilen sütun bir kimlik sütunuysa, new_data_type türünün kimlik özelliğini destekleyen bir veri türü olması gerekir.

    • Geçerli SET ARITHABORT ayarı yoksayılır. ALTER TABLE, ARITHABORT ayarı ON'muş gibi çalışır.

    [!NOT]

    COLLATE yan tümcesi belirtilmezse, bir sütunun veri türünü değiştirmek bir harmanlamanın veritabanının varsayılan harmanlamasına dönmesine neden olur.

  • precision
    Belirtilen veri türünü kesinliğidir. Geçerli kesinlik değerleri hakkında daha fazla bilgi için, bkz. Duyarlık, ölçek ve uzunluk (Transact-sql).

  • scale
    Belirtilen veri türünü ölçeğidir. Geçerli ölçek değerleri hakkında daha fazla bilgi için, bkz. Duyarlık, ölçek ve uzunluk (Transact-sql).

  • max
    Yalnızca 2^31-1 bayt karakter verisi, ikili veri ve Unicode verisi depolamak için olan varchar, nvarchar ve varbinary veri türlerine uygulanır.

  • xml_schema_collection
    Yalnızca tür ile bir XML şeması ilişkilendirmek için olan xml veri türüne uygulanır. Bir şema koleksiyonuna bir xml sütunu yazmadan önce, CREATE XML SCHEMA COLLECTION kullanılarak şema koleksiyonunun veritabanında oluşturulması gerekir.

  • COLLATE < collation_name >
    Değiştirilen sütunun yeni harmanlamasını belirtir. Belirtilmezse, sütuna veritabanının varsayılan harmanlaması atanır. Harmanlama adı bir Windows harmanlama adı veya bir SQL harmanlama adı olabilir. Bir liste ve daha fazla bilgi için, bkz. Windows harmanlaması adı (Transact-sql) ve SQL Server harmanlama adı (Transact-sql).

    COLLATE yan tümcesi yalnızca char, varchar, nchar ve nvarchar veri türündeki sütunların harmanlamalarını değiştirmek için kullanılabilir. Kullanıcı tanımlı diğer adlı bir veri sütununu değiştirmek için, sütunu bir SQL Server sistem veri türüne döndürmek ve sütunun harmanlamasını değiştirmek üzere ayrı ALTER TABLE deyimleri yürütmeli ve sonra sütunu yeniden diğer adlı bir veri türüne döndürmelisiniz.

    Aşağıdaki koşullardan biri veya birkaçı varsa, ALTER COLUMN harmanlamayı değiştiremez:

    • Bir CHECK kısıtlaması, FOREIGN KEY kısıtlaması veya değiştirilen sütunlara başvuran hesaplanan sütunlar varsa.

    • Sütunda bir dizin, istatistikler veya tam metin dizini oluşturuluyorsa. Değiştirilen sütunda otomatik olarak oluşturulan istatistikler, sütun harmanlaması değiştirilirse bırakılır.

    • Şemaya bağlı bir görünüm veya işlev sütuna başvuruyorsa.

    Daha fazla bilgi için, bkz. HARMANLAMA (Transact-sql).

  • NULL | NOT NULL
    Sütunun null değerleri kabul edip etmediğini belirtir. Null değerlere izin vermeyen sütunlar, yalnızca belirtilmiş bir varsayılan değerleri varsa veya tablo boşsa ALTER TABLE ile eklenebilir. NOT NULL deyimi, hesaplanan sütunlar için yalnızca PERSISTED deyimi de belirtilirse belirtilebilir. Yeni sütun null değerlere izin veriyorsa ve hiçbir varsayılan değer belirtilmiyorsa, yeni sütun tablodaki her satırda bir null değer içerir. Yeni sütun null değerlere izin verir ve yeni sütunla varsayılan bir tanım eklenirse, tablodaki var olan tüm satırlar için yeni sütuna varsayılan değeri depolamak için WITH VALUES kullanılabilir.

    Yeni sütun null değerlere izin vermiyorsa ve tablo boş değilse, yeni sütunla birlikte bir DEFAULT değer tanımı eklendiğinde yeni sütun var olan her satıra yeni sütunun varsayılan değerini otomatik olarak yükler.

    PRIMARY KEY kısıtlamalarındaki sütunlar hariç NOT NULL olan sütunları null değerlere izin vermeye zorlamak için ALTER COLUMN deyiminde NULL belirtilebilir. NOT NULL seçeneği, ALTER COLUMN deyiminde yalnızca sütun hiçbir null değer içermiyorsa belirtilebilir. ALTER COLUMN NOT NULL deyimine izin verilebilmesi için önce null değerlerin bir değerle güncelleştirilmesi gerekir; örneğin:

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

    CREATE TABLE veya ALTER TABLE deyimleriyle bir tablo oluşturduğunuz veya bir tabloyu değiştirdiğiniz zaman, veritabanı ve oturum ayarları, bir sütun tanımında kullanılan veri türünün null değer alabilirliğini etkiler ve geçersiz kılabilir. Hesaplanmayan sütunları her zaman açıkça NULL veya NOT NULL olarak tanımlamanızı öneririz.

    Kullanıcı tanımlı bir veri türü olan bir sütun eklerseni, sütunu kullanıcı tanımlı veri türü ile aynı null atanabilirlikle tanımlamanızı ve sütun için varsayılan bir değer belirtmenizi öneririz. Daha fazla bilgi için, bkz. Tablo (Transact-sql) oluştur.

    [!NOT]

    ALTER COLUMN ile NULL veya NOT NULL belirtilmezse, new_data_type [(precision [, scale ])] parametreleri de ayrıca belirtilmelidir. Veri türü, kesinlik ve ölçek değiştirilmezse, geçerli sütunun değerlerini belirtin.

  • [ {ADD | DROP} ROWGUIDCOL ]
    Belirtilen sütuna ROWGUIDCOL özelliğinin eklendiğini veya bu özelliğin sütundan bırakıldığını belirtir. ROWGUIDCOL, sütunun bir satır GUID sütunu olduğunu belirtir. Tablo başına yalnızca bir uniqueidentifier sütunu ROWGUIDCOL sütunu olarak atanabilir ve ROWGUIDCOL özelliği yalnızca bir uniqueidentifier sütununa atanabilir. ROWGUIDCOL, kullanıcı tanımlı bir veri türündeki bir sütuna atanamaz.

    ROWGUIDCOL sütunda depolanan değerleri benzersiz olmaya zorlamaz ve tabloya eklenen yeni satırlar için otomatik olarak değer üretmez. Her sütuna benzersiz değerler üretmek için, INSERT deyimlerinde NEWID işlevini kullanın veya sütun için varsayılan değer olarak NEWID işlevini belirtin.

  • [ {ADD | DROP} PERSISTED ]
    Belirtilen sütuna PERSISTED özelliğinin eklendiğini veya bu özelliğin sütundan bırakıldığını belirtir. Sütunun, sonucu önceden bilinebilen bir ifade ile tanımlanmış hesaplanan bir sütun olması gerekir. PERSISTED olarak belirtilen sütunlarda, Veritabanı Altyapısı, hesaplanan değerleri tabloda fiziksel olarak depolar ve hesaplanan sütunun bağımlı olduğu diğer sütunlardaki değerler güncelleştirildiğinde değerleri güncelleştirir. Hesaplanan bir sütunu PERSISTED olarak işaretleyerek sonucu önceden bilinebilen ancak kesinlikli olmayan ifadelerle tanımlanan hesaplanan sütunların dizinlerini oluşturabilirsiniz. Daha fazla bilgi için, bkz. Hesaplanan sütun dizinlerde.

    Bölümlenmiş bir tablonun bölümleme sütunu olarak kullanılan herhangi bir sütunun açıkça PERSISTED olarak işaretlenmesi gerekir.

  • DROP NOT FOR REPLICATION
    Çoğaltma aracıları ekleme işlemleri gerçekleştirdiğinde kimlik sütunlarındaki değerlerin artırıldığını belirtir. Bu yan tümce yalnızca column_name sütunu bir kimlik sütunuysa belirtilebilir.

  • SPARSE
    Sütunun seyrek bir sütun olduğunu gösterir. Seyrek sütunların depolanması null değerler için iyileştirilir. Seyrek sütunlar NOT NULL olarak atanamaz. Bir sütunu seyrekten seyrek olmayana veya seyrek olmayandan seyrek olana dönüştürmek, komutun yürütülmesi süresince tabloyu kilitler. Yerden sağlayacağınız herhangi bir tasarrufu geri kazanmak için REBUILD yan tümcesini kullanmanız gerekebilir. Ek sınırlamalar ve seyrek sütunlar hakkında daha fazla bilgi için bkz. Seyrek sütunlar kullanma.

  • WITH CHECK | WITH NOCHECK
    Tablodaki verilerin yeni eklenen veya yeniden etkinleştirilen bir FOREIGN KEY veya CHECK kısıtlaması ile doğrulanıp doğrulanmadığını belirtir. Belirtilmezse, yeni kısıtlamalarda WITH CHECK seçeneği ve yeniden etkinleştirilen kısıtlamalarda WITH NOCHECK seçeneği varsayılır.

    Yeni CHECK veya FOREIGN KEY kısıtlamalarını var olan veriler üzerinde doğrulamak istemiyorsanız, WITH NOCHECK kullanın. Ender durumlar dışında bunu yapmamanızı öneririz. Yeni kısıtlama, daha sonraki tüm veri güncelleştirmelerinde değerlendirilir. Kısıtlama eklendiğinde WITH NOCHECK ile baskılanan kısıtlama ihlalleri, gelecekte satırlar kısıtlamaları karşılamayan verilerle güncelleştirdiğinde, bu güncelleştirmelerin başarısız olmasına neden olabilir.

    Sorgu iyileştirici WITH NOCHECK ile tanımlanmış kısıtlamaları göz önüne almaz. Bu tür kısıtlamalar, ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL ile yeniden etkinleştirilinceye kadar yoksayılır.

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

  • DROP { [ CONSTRAINT ] constraint_name | COLUMN column_name }
    constraint_name veya column_name parametresinin tablodan kaldırıldığını belirtir. Birden çok sütun veya kısıtlama listelenebilir.

    Kısıtlamanın kullanıcı tarafından tanımlanan veya sistem tarafından sağlanan adı sys.check_constraint, sys.default_constraints, sys.key_constraints ve sys.foreign_keys katalog görünümleri sorgulanarak belirlenebilir.

    Bir PRIMARY KEY kısıtlaması, tabloda bir XML dizini varsa bırakılamaz.

    Bir sütun, şu özelliklere sahip olduğunda bırakılamaz:

    • Bir dizinde kullanılıyorsa.

    • Bir CHECK, FOREIGN KEY, UNIQUE veya PRIMARY KEY kısıtlamasında kullanılıyorsa.

    • DEFAULT anahtar sözcüğü ile tanımlanmış bir varsayılan değerse veya varsayılan bir nesneye bağlıysa.

    • Bir kurala bağlıysa.

    [!NOT]

    Bir sütunu bırakmak, sütunun kullandığı disk alanını geri kazanmaz. Bir tablonun satır boyutu sınırına yakınsa veya sınırını aşmışsa, bırakılan bir sütunun disk alanını geri kazanmanız gerekebilir. Alanı, tabloda kümelenmiş bir dizin oluşturarak veya var olan bir kümelenmiş dizini ALTER INDEX kullanarak yeniden oluşturarak kazanın.

  • WITH <kümelenmiş_kısıtlama_bırakma_seçeneği>
    Bir veya birkaç kümelenmiş kısıtlama bırakma seçeneğinin ayarlandığını belirtir.

  • MAXDOP = max_degree_of_parallelism
    En yüksek paralel işlem derecesi yapılandırma seçeneğini yalnızca işlem süresi boyunca geçersiz kılar. Daha fazla bilgi için, bkz. Maksimum ölçüde parallelism sunucu yapılandırma seçeneği yapılandırmak.

    MAXDROP seçeneğini paralel yürütmede kullanılan işlemci sayısını sınırlamak için kullanın. En fazla değer 64 işlemcidir.

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

    • 1
      Paralel plan üretimini baskılar.

    • >1
      Paralel bir dizin işleminde kullanılan en yüksek işlemci sayısını belirtilen sayı ile sınırlar.

    • 0 (varsayılan)
      Geçerli sistem iş yüküne bağlı olarak gerçek işlemci sayısını veya daha azını kullanır.

    Daha fazla bilgi için, bkz. Parallel ındex işlemi yapılandırma.

    [!NOT]

    Paralel dizin işlemleri, her SQL Server sürümünde bulunmaz. Daha fazla bilgi için, bkz. SQL Server 2012 Sürümleri Tarafından Desteklenen Özellikler.

  • ONLINE = { ON | OFF }
    Alttaki tabloların ve ilişkili dizinlerin dizin işlemi sırasında sorgularda ve veri değiştirmede kullanılıp kullanılamayacağını belirtir. Varsayılan değer OFF'tur. REBUILD bir ONLINE işlem olarak gerçekleştirilebilir.

    • ON
      Uzun dönemli tablo kilitleri, dizin işlemi süresince tutulmaz. Dizin işlemini ana aşaması sırasında kaynak tabloda yalnızca bir Amaç Paylaşımı (IS) kilidi tutulur. Bu, alttaki tabloda ve dizinlerde sorgu ve güncelleştirmelerin sürmesini olanaklı kılar. İşlemin başlangıcında, kaynak nesne üzerinde çok kısa bir süre Paylaşılan (S) bir kilit tutulur. İşlemin sonunda, kümelenmemiş bir dizin oluşturuluyorsa kaynak üzerinde çok kısa bir süre bir S (Paylaşılan) kilidi alınır veya kümelenmiş bir dizin çevrimiçi olarak oluşturduğu veya bırakıldığında ve kümelenmiş veya kümelenmemiş bir dizin yeniden oluşturulduğunda bir SCH-M (Şema Değiştirme) kilidi alınır. Yerel geçici bir tabloda bir dizin oluşturulurken ONLINE ayarı ON yapılamaz. Yalnızca tek iş parçacıklı yığın yeniden oluşturma işlemine izin verilir.

    • OFF
      Dizin işlemi süresinde tablo kilitleri uygulanır. Kümelenmiş bir dizin oluşturan, yeniden oluşturan veya bırakan ya da kümelenmemiş bir dizini bırakan çevrimdışı bir dizin işlemi, tabloda bir Şema değiştirme (Sch-M) kilidir alır. Bu, işlem süresi boyunca alttaki tabloya tüm kullanıcı erişimini engeller. Kümelenmemiş bir dizin oluşturan çevrimdışı bir dizi işlemi tabloda Paylaşılan (S) bir kilit alır. Bu, alttaki tabloda güncelleştirme yapılmasını engeller ancak SELECT deyimleri gibi okuma işlemlerine izin verir. Çok iş parçacıklı yığın yeniden oluşturma işlemlerine izin verilir.

    Daha fazla bilgi için, bkz. Nasıl çevrimiçi dizin işlemleri çalışma.

    [!NOT]

    Çevrimiçi dizin işlemleri her SQL Server sürümünde bulunmaz. Daha fazla bilgi için, bkz. SQL Server 2012 Sürümleri Tarafından Desteklenen Özellikler.

  • MOVE TO { partition_scheme_name**(column_name [ 1,** ... n] ) | filegroup | "varsayılan" }
    Halen kümelenmiş dizinin yaprak düzeyinde olan veri satırlarını taşımak için bir konum belirtir. Tablo, yeni konuma taşınır. Bu seçenek, yalnızca kümelenmiş bir dizin oluşturan kısıtlamalara uygulanır.

    [!NOT]

    Bu bağlamda default bir anahtar sözcük değildir. Dosya grubu için bir tanımlayıcıdır ve MOVE TO "default" veya MOVE TO [default] şeklinde sınırlayıcı içine alınması gerekir. "default" belirtilirse, QUOTED_IDENTIFIER seçeneği ayarının geçerli oturum için ON olması gerekir. Bu, varsayılan ayardır. Daha fazla bilgi için, bkz. set QUOTED_IDENTIFIER (Transact-sql).

  • { CHECK | NOCHECK } CONSTRAINT
    constraint_name parametresinin etkinleştirildiğini veya devre dışı bırakıldığını belirtir. Bu seçenek, yalnızca FOREIGN KEY ve CHECK kısıtlamalarıyla kullanılabilir. NOCHECK belirtilmediğinde, kısıtlamanın devre dışı bırakılır ve gelecekte sütunda yapılan ekleme ve güncelleştirmeler kısıtlama koşullarıyla doğrulanmaz. DEFAULT, PRIMARY KEY ve UNIQUE kısıtlamaları devre dışı bırakılamaz.

  • ALL
    NOCHECK seçeneği ile kısıtlamaların devre dışı olduğunu, CHECK seçeneği ile kısıtlamaların etkin olduğunu belirtir.

  • { ENABLE | DISABLE } TRIGGER
    trigger_name parametresinin etkinleştirildiğini veya devre dışı bırakıldığını belirtir. Bir tetikleyici devre dışı bırakıldığında, tabloda hala tanımlıdır; ancak tabloda INSERT, UPDATE veya DELETE deyimleri yürütüldüğünde, tetikleyicideki eylemler tetikleyici yeniden etkinleştirilinceye kadar gerçekleştirilmez.

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

  • trigger_name
    Etkinleştirilecek veya devre dışı bırakılacak tetikleyici adını belirtir.

  • { ENABLE | DISABLE } CHANGE_TRACKING
    Tabloda değişiklik izlemenin etkin mi, devre dışı mı olduğunu belirtir. Varsayılan olarak değişiklik izleme devre dışıdır.

    Bu seçenek yalnızca değişiklik izleme veritabanında etkin olduğunda 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 bir anahtarı olması gerekir.

  • WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )
    Veritabanı Altyapısı uygulamasının, değişiklikleri izlenen hangi sütunların güncelleştirildiğini izleyip izlemediğini belirtir. Varsayılan değer OFF'tur.

  • SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name**.** ] target_table [ PARTITION target_ partition_number_expression ]
    Bir veri bloğunun aşağıdaki yöntemlerle yerini değiştirir:

    • Bir tablodaki tüm verileri bir bölümleme olarak zaten varolan bölümlenmiş bir tabloya atar.

    • Bir bölümü, bir bölümlenmiş tablodan diğerine geçirir.

    • Bölümlenmiş bir tablonun bir bölümündeki tüm verileri var olan bölümlenmemiş bir tabloya yeniden atar.

    table bölünlenmiş bir tabloysa, source_partition_number_expression belirtilmelidir. target_table bölümlenmişse, target_partition_number_expression belirtilmelidir. Bir tablonun verileri bölüm olarak daha önceden var olan bölünlenmiş bir tabloya yeniden atanıyorsa veya bölüm bir bölümlenmiş tablodan başka bir bölünlenmiş tabloya geçiriliyorsa, hedef bölümün var olması ve boş olması gerekir.

    Bir bölümün verileri tek bir tablo oluşturacak şekilde yeniden atanıyorsa, hedef tablonun daha önceden oluşturulmuş ve boş olması gerekir. Hem kaynak tablo veya bölüm, hem hedef tablo veya bölüm aynı dosya grubunda duruyor olmalıdır. Karşılık gelen dizinler veya dizin bölümlemeleri de ayrıca aynı dosya grubunda duruyor olmalıdır. Bölüm değiştirmede pek çok ek kısıtlama geçerlidir. table ve target_table aynı olamaz. target_table çok parçalı bir tanımlayıcı olamaz.

    source_partition_number_expression ve target_partition_number_expression, değişkenlere ve işlevlere başvurabilecek sabit ifadelerdir. Bunlar, kullanıcı tanımlı tür değişkenleri ve kullanıcı tanımlı işlevleri içerir. Transact-SQL ifadelerine başvuramazlar.

    Çoğaltma kullanırken SWITCH sınırlaması için bkz. Bölümlenmiş tablolar ve dizinler.

  • SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | "default" | "NULL" })
    FILESTREAM verilerinin nerede depolandığını belirtir.

    SET FILESTREAM_ON yan tümcesi ile ALTER TABLE, yalnızca tablonun hiçbir FILESTREAM sütunu yoksa başarılı olur. FILESTREAM sütunları, ikinci bir ALTER TABLE deyimi kullanılarak eklenebilir.

    partition_scheme_name belirtilirse, CREATE TABLE kuralları geçerli olur. Tablo satır verileri için önceden bölümlenmiş olmalı ve bölümleme şeması FILESTREAM bölümleme şeması ile aynı bölümleme işlevini ve sütunları kullanmalıdır.

    filestream_filegroup_name bir FILESTREAM dosya grubunun adını belirtir. Dosya grubunun dosya grubu için CREATE DATABASE veya ALTER DATABASE deyimi kullanılarak tanımlanmış bir dosyası olmalıdır; yoksa bir hata oluşur.

    "default", DEFAULT özelliği ayarlanmış FILESTREAM dosya grubunu belirtir. Hiçbir FILESTREAM dosya grubu yoksa, bir hata oluşur.

    "NULL", tablonun FILESTREAM dosya gruplarına olan tüm başvuruların kaldırılacağını belirtir. Önce tüm FILESTREAM sütunları bırakılmalıdır. Bir tablo ile ilişkili tüm FILESTREAM verilerini silmek için SET FILESTREAM_ON**="NULL"** kullanmalısınız.

  • SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
    Tablo için izin verilen kilit yükseltme yöntemlerini belirtir.

    • AUTO
      Bu seçenek SQL Server Veritabanı Altyapısı uygulamasının tablo şemasına uyan kilit yükseltme ölçeğini seçmesine izin verir.

      • Tablo bölümlenmişse, bölüme kilit yükseltme izni verilir. Kilit, bölüm düzeyine yükseltildikten sonra, daha sonra TABLO ölçeğine yükseltilmez.

      • Tablo bölümlenmemişse, kilit yükseltme TABLO ölçeğinde yapılır.

    • TABLE
      Kilit yükseltme, tablonun bölümlenmiş veya bölümlenmemiş olduğuna bakılmaksızın tablo düzeyi ölçekte yapılır. Bu davranış SQL Server 2005 sürümündeki ile aynıdır. TABLE varsayılan değerdir.

    • DISABLE
      Çoğu durumda kilit yükseltmeyi engeller. Tablo düzeyi kilitlerin hiçbirine izin verilmez. Örneğin, serileştirilebilir yalıtım düzeyi kapsamında kümelenmiş bir dizini olmayan bir tablo taranırken, Veritabanı Altyapısı, veri bütünlüğünü korumak için bir tablo kilidi almalıdır.

  • REBUILD
    Bölümlenmiş bir tablonun, tablodaki tüm bölümler dahil tamamını yeniden oluşturmak için REBUILD WITH sözdizimini kullanın. Tablonun kümelenmiş bir dizini varsa, REBUILD seçeneği kümelenmiş dizini yeniden oluşturur. REBUILD bir ONLINE işlem olarak gerçekleştirilebilir.

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

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

  • REBUILD WITH ( <yeniden_oluşturma_seçeneği> )
    Tüm seçenekler kümelenmiş bir dizini olan bir tabloya uygulanır. Tablonun kümelenmiş bir dizini yoksa, yığın yapısı yalnızca bazı seçeneklerden etkilenir.

    REBUILD işlemi ile belirli bir sıkıştırma ayarı belirtilmezse, bölümün geçerli sıkıştırma ayarı kullanılır. Geçerli ayarı döndürmek için, sys.partitions katalog görünümündeki data_compression sütununu sorgulayın.

    Yeniden oluşturma seçeneklerinin tam bir açıklaması için bkz. index_option (Transact-sql).

  • DATA_COMPRESSION
    Belirtilen tablo, bölümleme numarası veya bölümleme aralığı için veri sıkıştırma seçeneğini belirtir. Seçenekler aşağıdaki gibidir:

    • NONE
      Tablo veya belirtilen bölümler sıkıştırılmaz.

    • ROW
      Tablo veya belirtilen bölümler satır sıkıştırma kullanılarak sıkıştırılır.

    • PAGE
      Tablo veya belirtilen bölümler sayfa sıkıştırma kullanılarak sıkıştırılır.

    Birden çok bölümlemeyi aynı anda yeniden oluşturmak için, bkz. index_option (Transact-sql). Tablonun kümelenmiş bir dizini yoksa, veri sıkıştırmasını değiştirmek 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.

  • column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
    Sütun kümesinin adıdır. Bir sütun kümesi, bir tablonun tüm seyrek sütunlarını yapılandırılmış bir çıktı olarak birleştiren türü olmayan bir XML gösterimidir. Bir sütun kümesi, seyrek sütunlar içeren bir tabloya eklenemez. Sütun kümeleri hakkında daha fazla bilgi için, bkz. Sütun kümelerini kullanma.

  • { ENABLE | DISABLE } FILETABLE_NAMESPACE
    Bir FileTable'daki sistem tarafından tanımlanmış kısıtlamaları etkinleştirir veya devre dışı bırakır. Yalnızca bir FileTable ile kullanılabilir.

  • SET ( FILETABLE_DIRECTORY = directory_name )
    Windows ile uyumlu FileTable dizin adını belirtir. Bu ad, veritabanındaki tüm FileTable dizin adları arasında benzersiz olmalıdır. Benzersizlik karşılaştırması, SQL harmanlama ayarından bağımsız olarak büyük/küçük harfe duyarlıdır. Yalnızca bir FileTable ile kullanılabilir.

Açıklamalar

Yeni veri satırları eklemek için, INSERT kullanın. Veri satırları çıkarmak için, DELETE veya TRUNCATE TABLE. Var olan satırların değerlerini değiştirmek için, UPDATE kullanın.

Yordam önbelleğinde herhangi bir yürütme planı varsa, ALTER TABLE bunları bir sonraki yürütülmelerinde derlenmek üzere işaretler.

Sütunun Boyutunu Değiştirme

ALTER COLUMN yan tümcesinde sütun veri türü için yeni bir boyut belirterek bir sütunun uzunluğunu, kesinliğini veya ölçeğini değiştirebilirsiniz. Sütunda veri varsa, yeni boyut verilerin en büyük boyutundan daha küçük olamaz. Ayrıca, sütun bir varchar, nvarchar veya varbinary veri türünde değilse ve dizin bir PRIMARY KEY kısıtlamasının sonucu değilse, sütun bir dizinde tanımlanamaz. Bkz. örnek P.

Kilitler ve ALTER TABLE

ALTER TABLE'da belirtilen değişiklikler hemen gerçekleştirilir. Değişiklikler tablodaki satırların değiştirilmesini gerektirmiyorsa, ALTER TABLE satırları güncelleştirir. Değişiklik sırasında, en sonda çok kısa bir SCH-M kilidi gerektiren çevrimiçi dizin işlemleri hariç başka hiçbir bağlantının değişiklik sırasında tablonun meta verilerine bile başvurmamasını sağlamak için, ALTER TABLE, tablo üzerinde bir şema değiştirme (SCH-M) kilidi alır. Bir ALTER TABLE…SWITCH işleminde, kilit hem kaynak hem hedef tablolarda alınır. Tabloda yapılan değişiklikler günlüğe yazılır ve değişikliklerin tamamı kurtarılabilir. Çok büyük tablolardaki tüm satırları etkileyen, bir sütunun bırakılması veya bazı SQL Server sürümlerinde varsayılan bir değeri olan bir NOT NULL sütunu eklenmesi gibi değişikliklerin tamamlanması çok uzun zaman alabilir ve pek çok günlük kaydı üretir. Bu ALTER TABLE deyimleri, çok sayıda satırı etkileyen tüm INSERT, UPDATE veya DELETE deyimleri gibi dikkatle yürütülmelidir.

NOT NULL Sütunlarını Çevrimiçi Bir İşlem olarak Ekleme

SQL Server 2012 Enterprise Edition'da varsayılan bir değeri olan bir NOT NULL sütun eklemek, varsayılan değer bir çalışma zamanı sabiti olduğunda çevrimiçi bir işlemdir. Bu, işlemin, tablodaki satır sayısına bakılmaksızın, neredeyse anında tamamlandığı anlamına gelir. Bunun nedeni, tablodaki var olan satırların işlem sırasında güncelleştirilmemesi; bunun yerine varsayılan değerin yalnızca tablonun meta verilerinde depolanması ve değerin gerektiğinde bu satırlara erişen sorgularla aranmasıdır. Bu davranış otomatiktir; çevrimiçi işlemi gerçekleştirmek için ADD COLUMN dışında hiçbir ek sözdizimi gerekmez. Bir çalışma zamanı sabiti, sonucunun önceden bilinebilirliğinden bağımsız olarak çalışma zamanında tablodaki her satır için aynı değeri üreten bir ifadedir. Örneğin, "Geçici verilerim" sabit ifadesi veya GETUTCDATETIME() sistem işlemi çalışma zamanı sabitleridir. Buna karşılık NEWID() veya NEWSEQUENTIALID() işlevleri, tablodaki her satır için benzersiz bir değer ürettiklerinden çalışma zamanı sabitleri değildir. Varsayılan değeri bir çalışma zamanı sabiti olmayan bir NOT NULL sütun eklemek, her zaman çevrimdışı olarak gerçekleştirilir ve işlem süresince bir özel kullanım (SCH-M) kilidi alınır.

Var olan satırlar meta verilerde depolanan değere başvurursa da varsayılan değer, sütun için başka bir değer belirtmeyen eklenen yeni satırlarda satırda depolanır. Meta verilerde saklanan varsayılan değer, satır güncelleştirildiğinde veya tablo veya kümelenmiş dizin yeniden oluşturuluyorsa (gerçek sütun UPDATE deyiminde belirtilmese de) var olan bir satıra taşınır.

varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography veya CLR UDTS türündeki sütunlar çevrimiçi bir işlemle eklenemez. Sütunun çevrimiçi olarak eklenmesi, en büyük satır boyutunun 8.060 baytlık sınırı aşabilmesine neden oluyorsa, sütun çevrimiçi olarak eklenmez. Sütun bu durumda çevrimiçi bir işlemle eklenir.

Paralel Plan Yürütme

Microsoft SQL Server 2012 Enterprise sürümünde, tek bir ALTER TABLE ADD (dizin tabanlı) CONSTRAINT veya DROP (kümelenmiş dizin) CONSTRAINT deyimini çalıştırmak için kullanılan işlemci sayısı paralellik derecesi üst sınır yapılandırma seçeneğine ve geçerli iş yüküne bağlıdır. Veritabanı Altyapısı sistemin meşgul olduğunu algılarsa, işlemin paralellik derecesi, deyimin yürütülmesi başlamadan otomatik olarak düşürülür. MAXDOP seçeneğini belirterek deyimi çalıştırmak için kullanılan işlemci sayısını el ile yapılandırabilirsiniz. Daha fazla bilgi için, bkz. Maksimum ölçüde parallelism sunucu yapılandırma seçeneği yapılandırmak.

Bölümlenmiş Tablolar

ALTER TABLE, bölümlenmiş tabloları kullanan SWITCH işlemleri gerçekleştirmeye ek olarak, aynen bölümlenmemiş tablolarda kullanıldığı gibi bölümlenmiş bir tablonun sütunlarının, kısıtlamalarının ve tetikleyicilerinin durumunu değiştirmek için de kullanılabilir. Ancak bu deyim, tablonun kendisinin bölümlenme biçimini değiştirmek için kullanılamaz. Bölümlenmiş bir tabloyu yeniden bölümlemek için, ALTER PARTITION SCHEME ve ALTER PARTITION FUNCTION kullanın. Ek olarak, bölümlenmiş bir tablonun bir sütununun veri türünü değiştiremezsiniz.

Şemaya Bağlı Görünümleri Olan Tablolarla İlgili Sınırlamalar

Şemaya bağlı görünümleri olan tablolarda yürütülen ALTER TABLE deyimleri için geçerli olan sınırlamalar, halen basit bir dizini olan tabloları değiştirmek için geçerli olan sınırlamalarla aynıdır. Sütun eklemeye izin verilir. Ancak, herhangi bir şemaya bağlı görünümde yer alan bir sütunu kaldırmaya veya değiştirmeye izin verilmez. ALTER TABLE deyimi şemaya bağlı bir görünümde kullanılan bir sütunu değiştirmeyi gerektiriyorsa, ALTER TABLE başarısız olur ve Veritabanı Altyapısı bir hata iletisi oluşturur. Şema bağlama ve dizinli görünümler hakkında daha fazla bilgi için, bkz. CREATE VIEW (Transact-SQL).

Taban tablolara tetikleyiciler eklemek veya bunları kaldırmak, tablolara başvuran şemaya bağlı bir görünüm oluşturmadan etkilenmez.

Dizinler ve ALTER TABLE

Bir kısıtlamanın parçası olarak oluşturulan dizinler kısıtlama bırakıldığında bırakılır. CREATE INDEX ile oluşturulan dizinler DROP INDEX ile bırakılmalıdır. ALTER INDEX deyimi, bir kısıtlama tanımının bir dizin kısmını yeniden oluşturmak için kullanılabilir; kısıtlamanın bırakılıp ALTER TABLE ile yeniden eklenmesi gerekmez.

Bir sütuna dayanan tüm dizinler ve kısıtlamalar, sütun kaldırılmadan önce kaldırılmalıdır.

Kümelenmiş bir dizini oluşturan bir kısıtlama silindiğinde, kümelenmiş dizinin yaprak düzeyinde depolanan veri satırları kümelenmemiş bir tabloda depolanır. Kümelenmiş dizini bırakabilir ve sonuçta ortaya çıkan tabloyu MOVE TO seçeneğini belirterek tek bir işlemle başka bir dosya grubuna veya bölümleme şemasına taşıyabilirsiniz. MOVE TO seçeneğinde aşağıdaki kısıtlamalar bulunur:

  • MOVE TO dizinli görünümler veya kümelenmemiş dizinler için gereçli değildir.

  • Bölümleme şeması veya dosya grubu daha önceden var olmalıdır.

  • MOVE TO belirtilmezse, tablo, kümelenmiş dizin için tanımlanmış olan bölümleme şemasında veya dosya grubunda bulunur.

Kümelenmiş bir dizini bıraktığınızda, DROP INDEX işleminin alttaki verilerde ve ilişkili kümelenmemiş dizinlerde yapılan sorgulama ve değişiklikleri engellememesi için ONLINE = ON seçeneğini belirtebilirsiniz.

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

  • ONLINE = ON, ayrıca devre dışı bırakılmış kümelenmiş dizinler için geçerli değildir. Devre dışı bırakılmış dizinlerin ONLINE = OFF kullanılarak bırakılması gerekir.

  • Bir kerede yalnızca bir dizin bırakılabilir.

  • ONLINE = ON, dizinlenmiş görünümler, kümelenmemiş dizinler veya yerel geçici tablolardaki dizinler için geçerli değildir.

Kümelenmiş bir dizini bırakmak için var olan kümelenmiş dizinin boyutuna eşit geçici disk alanı gerekir. Bu ek alan, işlem tamamlanır tamamlanmaz bırakılır.

[!NOT]

<drop_clustered_constraint_option> altında listelenen seçenekler tabloların kümelenmiş dizinlerine uygulanır; görünümlerin kümelenmiş dizinlerine veya kümelenmemiş dizinlere uygulanamaz.

Şema Değişikliklerini Çoğaltma

Varsayılan olarak, SQL Server Yayıncı'da yayınlanmış bir tabloda ALTER TABLE deyimini çalıştırdığınızda, bu değişiklik tüm SQL Server Aboneleri'ne yayılır. Bu işlevselliğin bazı sınırlamaları vardır ve devre dışı bırakılabilir. Daha fazla bilgi için, bkz. Yayını veritabanları üzerinde şeması değişiklikler yapmak.

Veri Sıkıştırma

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

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

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

  • Tablonun hizalanmamış dizinleri varsa, tek bir bölümün sıkıştırma ayarını değiştiremezsiniz.

  • ALTER TABLE <tablo> REBUILD PARTITION ... sözdizimi, belirtilen bölümü yeniden oluşturur.

  • ALTER TABLE <tablo> REBUILD WITH ... sözdizimi, tüm bölümleri yeniden oluşturur.

Uyumluluk Desteği

ALTER TABLE deyimi yalnızca iki parçalı (şema.nesne) tablo adlarına izin verir. SQL Server 2012 uygulamasında aşağıdaki biçimleri kullanarak bir tablo adı belirtme, derleme zamanında hata 117 ile başarısız olur.

  • sunucu.veritabanı.şema.tablo

  • .veritabanı.şema.tablo

  • ..şema.tablo

Önceki sürümlerde, sunucu.veritabanı.şema.tablo biçimini belirtmek 4902 hatasını döndürüyordu. .veritabanı.şema.tablo veya ..şema.tablo biçimini belirtmek başarılı oluyordu.

Sorunu çözmek için, 4 parçalı öneki kaldırın.

İzinler

Tabloda ALTER izni gerektirir.

ALTER TABLE izinleri, bir ALTER TABLE SWITCH deyimindeki her iki tablo için geçerlidir. Yeri değiştirilen her veri hedef tablonun güvenliğini miras alır.

ALTER TABLE deyimindeki herhangi bir sütun ortak dil çalışma zamanı (CLR) kullanıcı tanımlı türünde veya diğer adlı bir veri türünde tanımlanmışsa, tür için REFERENCES izni gerekir.

Örnekler

A.Yeni bir sütun ekleme

Aşağıdaki örnek null değerlere izin veren ve bir DEFAULT tanımı ile sağlanmış varsayılan bir değeri olmayan bir sütun eklemektedir. Yeni sütunda her satırda NULL olacaktır.

CREATE TABLE dbo.doc_exa (column_a INT) ;
GO
ALTER TABLE dbo.doc_exa ADD column_b VARCHAR(20) NULL ;
GO
EXEC sp_help doc_exa ;
GO
DROP TABLE dbo.doc_exa ;
GO

B.Sütun bırakma

Aşağıdaki örnek, bir sütunu kaldırmak için bir tabloyu değiştirmektedir.

CREATE TABLE dbo.doc_exb (column_a INT, column_b VARCHAR(20) NULL) ;
GO
ALTER TABLE dbo.doc_exb DROP COLUMN column_b ;
GO
EXEC sp_help doc_exb ;
GO
DROP TABLE dbo.doc_exb ;
GO

C.Bir sütunun veri türünü ayarlama

Aşağıdaki örnek bir tablonun bir sütununu INT türünden DECIMAL türüne çevirmektedir.

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

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

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

CREATE TABLE dbo.doc_exc (column_a INT) ;
GO
ALTER TABLE dbo.doc_exc ADD column_b VARCHAR(20) NULL 
    CONSTRAINT exb_unique UNIQUE ;
GO
EXEC sp_help doc_exc ;
GO
DROP TABLE dbo.doc_exc ;
GO

E.Var olan bir sütuna doğrulanmamış bir CHECK kısıtlaması ekleme

Aşağıdaki örnek, tablodaki var olan bir sütuna bir kısıtlama eklemektedir. Sütunda kısıtlamayı ihlal eden bir değer bulunmaktadır. Bu yüzden, kısıtlamanın var olan satırları doğrulamasını engellemek ve kısıtlamanın eklenmesine izin vermek için WITH NOCHECK kullanılmaktadır.

CREATE TABLE dbo.doc_exd ( column_a INT) ;
GO
INSERT INTO dbo.doc_exd VALUES (-1) ;
GO
ALTER TABLE dbo.doc_exd WITH NOCHECK 
ADD CONSTRAINT exd_check CHECK (column_a > 1) ;
GO
EXEC sp_help doc_exd ;
GO
DROP TABLE dbo.doc_exd ;
GO

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

Aşağıdaki örnek, iki sütunlu bir tablo oluşturmakta ve ilk sütuna bir değer eklemekte, diğer sütun ise NULL kalmaktadır. Daha sonra ikinci sütuna bir DEFAULT kısıtlaması eklenmektedir. Varsayılanın uygulandığını doğrulamak için, ilk sütuna bir değer eklenmekte ve tablo sorgulanmaktadır.

CREATE TABLE dbo.doc_exz ( column_a INT, column_b INT) ;
GO
INSERT INTO dbo.doc_exz (column_a)VALUES ( 7 ) ;
GO
ALTER TABLE dbo.doc_exz
ADD CONSTRAINT col_b_def
DEFAULT 50 FOR column_b ;
GO
INSERT INTO dbo.doc_exz (column_a) VALUES ( 10 ) ;
GO
SELECT * FROM dbo.doc_exz ;
GO
DROP TABLE dbo.doc_exz ;
GO

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

Aşağıdaki örnek, yeni sütun ile tanımlanan kısıtlamaları olan birkaç sütun eklemektedir. İlk yeni sütunun bir IDENTITY özelliği vardır. Tablodaki her satırın kimlik sütununda artımlı yeni değerleri vardır.

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

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

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

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

-- Add a nonnull column with a default.
column_e DECIMAL(3,3)
CONSTRAINT column_e_default
DEFAULT .081 ;
GO
EXEC sp_help doc_exe ;
GO
DROP TABLE dbo.doc_exe ;
GO

H.Varsayılan değerleri olan null değer alabilen bir sütun ekleme

Aşağıdaki örnek, bir DEFAULT tanımı ile null değer alabilen bir sütun eklemekte ve tablodaki var olan her satıra değer sağlamak için WITH VALUES kullanmaktadır. WITH VALUES kullanılmazsa, her satırın yeni sütununda NULL değeri olur.

USE AdventureWorks2012 ; 
GO
CREATE TABLE dbo.doc_exf ( column_a INT) ;
GO
INSERT INTO dbo.doc_exf VALUES (1) ;
GO
ALTER TABLE dbo.doc_exf 
ADD AddDate smalldatetime NULL
CONSTRAINT AddDateDflt
DEFAULT GETDATE() WITH VALUES ;
GO
DROP TABLE dbo.doc_exf ;
GO

I.Bir kısıtlamayı devre dışı bırakma ve yeniden etkinleştirme

Aşağıdaki örnek, verilerde kabul edilen maaşları sınırlayan bir kısıtlamayı devre dışı bırakmaktadır. NOCHECK CONSTRAINT, kısıtlamayı devre dışı bırakmak ve normalde kısıtlamayı ihlal edecek bir eklemeye için vermek için ALTER TABLE ile kullanılmaktadır. CHECK CONSTRAINT kısıtlamayı yeniden etkinleştirmektedir.

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

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

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

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

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

J.Kısıtlama bırakma

Aşağıdaki örnek, bir tablodan bir UNIQUE kısıtlamasını kaldırmaktadır.

CREATE TABLE dbo.doc_exc ( column_a INT
CONSTRAINT my_constraint UNIQUE) ;
GO
ALTER TABLE dbo.doc_exc DROP CONSTRAINT my_constraint ;
GO
DROP TABLE dbo.doc_exc ;
GO

K.Tablolar arasında bölümleme değiştirme

Aşağıdaki örnek, myRangePS1 bölümleme şemasının veritabanında zaten oluşturulduğunu varsayarak bölümlenmiş bir tablo oluşturmaktadır. Daha sonra, bölümlenmiş tablo ile aynı yapıda ve PartitionTable tablosunun PARTITION 2 bölümü ile aynı dosya grubunda bölümlenmemiş bir tablo oluşturulmaktadır. PartitionTable tablosunun PARTITION 2 verileri daha sonra NonPartitionTable tablosuna geçirilmektedir.

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

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

L.Bir tetikleyiciyi devre dışı bırakma ve yeniden etkinleştirme

Aşağıdaki örnek, tetikleyiciyi devre dışı bırakmak ve normalde tetikleyiciyi ihlal edecek bir eklemeye izin vermek için ALTER TABLE deyiminin DISABLE TRIGGER seçeneğini kullanmaktadır. Daha sonra tetiği yeniden etkinleştirmek için ENABLE TRIGGER kullanılmaktadır.

CREATE TABLE dbo.trig_example 
(id INT, 
name VARCHAR(12),
salary MONEY) ;
GO
-- Create the trigger.
CREATE TRIGGER dbo.trig1 ON dbo.trig_example FOR INSERT
AS
IF (SELECT COUNT(*) FROM INSERTED
WHERE salary > 100000) > 0
BEGIN
    print 'TRIG1 Error: you attempted to insert a salary > $100,000'
    ROLLBACK TRANSACTION
END ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (1,'Pat Smith',100001) ;
GO
-- Disable the trigger.
ALTER TABLE dbo.trig_example DISABLE TRIGGER trig1 ;
GO
-- Try an insert that would typically violate the trigger.
INSERT INTO dbo.trig_example VALUES (2,'Chuck Jones',100001) ;
GO
-- Re-enable the trigger.
ALTER TABLE dbo.trig_example ENABLE TRIGGER trig1 ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (3,'Mary Booth',100001) ;
GO

M.Dizin seçenekleri olan bir PRIMARY KEY kısıtlaması oluşturma

Aşağıdaki örnek, PK_TransactionHistoryArchive_TransactionID PRIMARY KEY kısıtlamasını oluşturmakta ve FILLFACTOR, ONLINE ve PAD_INDEX seçeneklerini ayarlamaktadır. Sonuçta ortaya çıkan dizin, kısıtlama ile aynı ada sahip olacaktır.

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

N.ONLINE modunda bir PRIMARY KEY kısıtlamasını bırakma

Aşağıdaki örnek, ONLINE seçeneği ON olan bir PRIMARY KEY kısıtlamasını silmektedir.

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

O.FOREIGN KEY kısıtlaması ekleme veya bırakma

Aşağıdaki örnek ContactBackup tablosunu oluşturmakta ve sonra ilk önce Contact tablosuna başvuran bir FOREIGN KEY kısıtlaması ekleyerek, sonra da FOREIGN KEY kısıtlamasını bırakarak tabloyu değiştirmektedir.

USE AdventureWorks2012 ;
GO
CREATE TABLE Person.ContactBackup
(ContactID int) ;
GO
ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBacup_Contact FOREIGN KEY (ContactID)
    REFERENCES Person.Person (BusinessEntityID) ;
ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBacup_Contact ;
GO
DROP TABLE Person.ContactBackup ;

P.Sütunun boyutunu değiştirme

Aşağıdaki örnek bir varchar sütununun boyutunu ve bir decimal sütununun kesinliğini ve ölçeğini artırmaktadır. Sütun veri içerdiğinden, sütun boyutu yalnızca artırılabilir. Ayrıca, col_a sütununun benzersiz bir dizinle tanımlandığına dikkat edin. col_a sütununun boyutu, veri türü varchar olduğundan ve dizin bir PRIMARY KEY kısıtlamasının sonucu olmadığından daha da artırılabilir.

IF OBJECT_ID ( 'dbo.doc_exy', 'U' ) IS NOT NULL 
    DROP TABLE dbo.doc_exy;
GO
-- 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');
IF OBJECT_ID ( 'dbo.doc_exy', 'U' ) IS NOT NULL 
    DROP TABLE dbo.doc_exy;
GO
-- 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');

Q.Bölümlenmiş tablolarda kilit yükseltmeye izin verme

Aşağıdaki örnek, bölümlenmiş bir tablodaki bölümleme düzeyine kilit yükseltmeyi etkinleştirmektedir. Tablo bölümlenmemişse, kilit TABLE düzeyine yükseltilir.

ALTER TABLE T1 SET (LOCK_ESCALATION = AUTO)
GO

ALTER TABLE T1 SET (LOCK_ESCALATION = AUTO)
GO

R.Bir tabloda değişiklik izlemeyi yapılandırma

Aşağıdaki örnek, AdventureWorks veritabanındaki Person.Contact tablosunda değişiklik izlemeyi etkinleştirmektedir.

USE AdventureWorks2012;
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING;

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

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

Aşağıdaki örnek, AdventureWorks veritabanındaki Person.Contact tablosunda değişiklik izlemeyi devre dışı bırakmaktadır:

USE AdventureWorks2012;
ALTER TABLE Person.Person
DISABLE CHANGE_TRACKING;

S.Sıkıştırmayı değiştirmek üzere tabloyu değiştirme

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

ALTER TABLE T1 
REBUILD WITH (DATA_COMPRESSION = PAGE);

ALTER TABLE T1 
REBUILD WITH (DATA_COMPRESSION = PAGE);

Aşağıdaki örnek, bölümlenmiş bir tablonun sıkıştırmasını değiştirmektedir. REBUILD PARTITION = 1 sözdizimi yalnızca 1 numaralı bölümün yeniden oluşturulmasına neden olmaktadır.

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

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

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

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

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

Başka veri sıkıştırma örnekleri için, bkz. Veri Sıkıştırma.

T.Seyrek bir sütun ekleme

Aşağıdaki örnekler, T1 tablosuna seyrek sütunlar eklemeyi ve bunları değiştirmeyi göstermektedir. T1 tablosunu 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

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

C5 seyrek sütununu eklemek için, aşağıdaki deyimi yürütün.

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

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

Seyrek olmayan C4 sütununu seyrek bir 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

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

ALTER TABLE T1
ALTER COLUMN C4 DROP SPARSE;
GO

U.Sütun kümesi ekleme

Aşağıdaki örnekler, T2 tablosuna bir sütun eklemeyi göstermektedir. Bir sütun kümesi, daha önceden seyrek sütunlar içeren bir tabloya eklenemez. T2 tablosunu oluşturma kodu aşağıdaki gibidir.

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

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

Aşağıdaki üç deyim CS adlı bir sütun kümesi eklemekte, sonra C2 ve C3 sütunlarını SPARSE olarak değiştirmektedir.

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

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

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

Aşağıdaki örnek, bir sütunun harmanlamasının nasıl değiştirileceğini göstermektedir. Önce varsayılan harmanlamalarla T3 tablosu oluşturuluyor:

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

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

Sonra, C2 sütununun harmanlaması Latin1_General_BIN olarak değiştiriliyor. Veri türünün, değiştirilmese bile gerekli olduğuna dikkat edin.

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

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

Ayrıca bkz.

Başvuru

sys.Tables (Transact-sql)

sp_rename (Transact-sql)

Tablo (Transact-sql) oluştur

drop table (Transact-sql)

sp_help (Transact-sql)

alter PARTITION düzeni (Transact-sql)

alter PARTITION FUNCTION (Transact-sql)

eventdata (Transact-sql)