“Tablonun yeniden oluşturulmasını gerektiren değişiklikleri kaydetmeyi önle” olumsuz etkileri


255

önsöz

Bugün SQL Server 2008'de bir sütun değiştiriyordum, veri türünü para birimi (18,0) gibi bir değerden (19,2) değiştiriyordum.

SQL Server'dan "Yaptığınız değişiklikler aşağıdaki tabloların bırakılmasını ve yeniden oluşturulmasını gerektirir" hatasını aldım.

Cevaplamak için uğraşmadan önce lütfen aşağıdakileri okuyun:

Araçlar ► Seçenekler ► Tasarımcı ► Tablo ve Veritabanı Tasarımcıları ► içinde bir seçenek olduğunu zaten biliyorum . Beş tıklamayla tablonun yeniden oluşturulmasını gerektiren değişiklikleri kaydetmeyi önleyin ... yani yok bununla cevap!

Gerçek soru

Asıl sorum şu başka bir şey için:

Bunu yapmanın herhangi bir olumsuz etkisi / olası dezavantajı var mı?

Bu kutu işaretli olmadığında tablo gerçekten otomatik olarak bırakılıyor ve yeniden oluşturuluyor mu?

Öyleyse, tablo, kaynak tablonun% 100 tam bir kopyasını kopyalıyor mu?


65
Araçlar> Seçenekler> Tasarımcı ... aradığım şey buydu! Teşekkürler!
Nrod


2
Ve MS SQL Server 2014 ile iseniz -> Ekstra> Seçenekler> Tasarımcı Üst menüden.
Vityata

Yanıtlar:


89

Tablo yalnızca bırakılır ve SQL Server'ın Management Studio'nun nasıl yapılacağını bilmek üzere programlanmasının tek yolu olduğu durumlarda yeniden oluşturulur.

Buna gerek olmadığında yapacak durumlar kesinlikle vardır, ama aynı zamanda Yönetim Studio'da yaptığınız düzenlemeler olacak durumlar olacak değil damla ve onu zorunda değildir, çünkü yeniden oluşturun.

Sorun, tüm vakaları numaralandırmak ve hattın hangi tarafına düştüklerini belirlemek oldukça sıkıcı olacaktır.

Bu yüzden ALTER TABLEne yaptıklarını gizleyen (ve açıkçası hatalara sahip olan) görsel tasarımcılar yerine bir sorgu penceresinde kullanmaktan hoşlanıyorum - Ne olacağını tam olarak biliyorum ve tek olasılığın olduğu durumlarda hazırlanabiliyorum tabloyu bırakmak ve yeniden oluşturmaktır (SSMS'nin bunu ne sıklıkta yapacağından daha azdır).


5
Gerçekten iyi bir cevap olsa da, OP tarafından sorulan tüm sorulara cevap vermediğini hissediyorum ve bu sorular aslında ilgilendiğim sorular. Özellikle bunu yapmanın herhangi bir olumsuz etkisi / olası dezavantajı var mı? ve Öyleyse, tablo kopyalanırken kaynak tablonun% 100 tam bir kopyası mı? . Bu sorularla ilgili bilginiz var mı?
tfrascaroli

252

Araçlar -> Seçenekler -> Tasarımcı düğümü -> " Tablo yeniden oluşturma gerektiren değişiklikleri kaydetmeyi engelle " seçeneğinin işaretini kaldırın .


12

Referans - Bu seçeneğin kapatılması bir tablo oluşturmaktan kaçınmanıza yardımcı olabilir, ayrıca değişikliklerin kaybolmasına da neden olabilir. Örneğin, SQL Server 2008'deki İzleme Değişikliği özelliğini tablodaki değişiklikleri izlemek için etkinleştirdiğinizi varsayalım. Tablonun yeniden oluşturulmasına neden olan bir işlem gerçekleştirdiğinizde, "Belirtiler" bölümünde açıklanan hata iletisini alırsınız. Ancak, bu seçeneği kapatırsanız, tablo yeniden oluşturulduğunda mevcut değişiklik izleme bilgileri silinir. Bu nedenle, Microsoft seçeneği kapatarak bu soruna geçici bir çözüm bulmamanızı önerir.


11

SQL Server bırakır ve yalnızca aşağıdaki durumlarda tabloları yeniden oluşturur:

  • Yeni bir sütun ekle
  • Bir sütun için Boş Değerlere İzin Ver ayarını değiştirme
  • Tablodaki sütun sırasını değiştirme
  • Sütun veri türünü değiştirme

ALTER'i kullanmak daha güvenlidir, çünkü tabloyu yeniden oluştururken meta verilerin kaybolması durumunda verileriniz kaybolacaktır.


8
Listeniz ayrıntılı değildir. IDENTITYÖrneğin, bir sütuna özellik ekleyin / kaldırın .
Aaron Bertrand

2
NULLABLE olan alanların sonuna yeni bir sütun eklemek tablo yeniden oluşturma gerektirmez.
PseudoToad

2

Evet, bundan olumsuz etkiler var:

Bu bayrak tarafından engellenen bir değişiklik komut dosyası yaparsanız, aşağıdaki komut dosyası gibi bir şey elde edersiniz (tümü, Kişi'deki kimlik sütununu otomatik numaralandırılmış bir KİMLİK sütununa dönüştürüyorum, ancak tablonun bağımlılıkları var). Aşağıdakiler çalışırken oluşabilecek olası hatalara dikkat edin:

  1. Microsoft bile bunun veri kaybına neden olabileceği konusunda uyarıyor (bu yorum otomatik olarak üretiliyor)!
  2. belirli bir süre için yabancı anahtarlar uygulanmaz.
  3. bunu ssms içinde el ile çalıştırırsanız ve 'EXEC (' INSERT INTO 'başarısız olursa ve aşağıdaki ifadelerin çalışmasına izin verirseniz (varsayılan olarak yaptıkları' go 'ile bölünür), 0 satır eklersiniz eski tablo.
  4. bu büyük bir tablo ise, ekin çalışma zamanı büyük olabilir ve işlem bir şema değişiklik kilidi tutuyor, bu yüzden birçok şeyi engelliyor .

-

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/

BEGIN TRANSACTION
GO
ALTER TABLE raw.Contact
    DROP CONSTRAINT fk_Contact_AddressType
GO
ALTER TABLE ref.ContactpointType SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE raw.Contact
    DROP CONSTRAINT fk_contact_profile
GO
ALTER TABLE raw.Profile SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE raw.Tmp_Contact
    (
    ContactID int NOT NULL IDENTITY (1, 1),
    ProfileID int NOT NULL,
    AddressType char(2) NOT NULL,
    ContactText varchar(250) NULL
    )  ON [PRIMARY]
GO
ALTER TABLE raw.Tmp_Contact SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT raw.Tmp_Contact ON
GO
IF EXISTS(SELECT * FROM raw.Contact)
     EXEC('INSERT INTO raw.Tmp_Contact (ContactID, ProfileID, AddressType, ContactText)
        SELECT ContactID, ProfileID, AddressType, ContactText FROM raw.Contact WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT raw.Tmp_Contact OFF
GO
ALTER TABLE raw.PostalAddress
    DROP CONSTRAINT fk_AddressProfile
GO
ALTER TABLE raw.MarketingFlag
    DROP CONSTRAINT fk_marketingflag_contact
GO
ALTER TABLE raw.Phones
    DROP CONSTRAINT fk_phones_contact
GO
DROP TABLE raw.Contact
GO
EXECUTE sp_rename N'raw.Tmp_Contact', N'Contact', 'OBJECT' 
GO
ALTER TABLE raw.Contact ADD CONSTRAINT
    Idx_Contact_1 PRIMARY KEY CLUSTERED 
    (
    ProfileID,
    ContactID
    ) 

GO
ALTER TABLE raw.Contact ADD CONSTRAINT
    Idx_Contact UNIQUE NONCLUSTERED 
    (
    ProfileID,
    ContactID
    ) 

GO
CREATE NONCLUSTERED INDEX idx_Contact_0 ON raw.Contact
    (
    AddressType
    ) 
GO
ALTER TABLE raw.Contact ADD CONSTRAINT
    fk_contact_profile FOREIGN KEY
    (
    ProfileID
    ) REFERENCES raw.Profile
    (
    ProfileID
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

GO
ALTER TABLE raw.Contact ADD CONSTRAINT
    fk_Contact_AddressType FOREIGN KEY
    (
    AddressType
    ) REFERENCES ref.ContactpointType
    (
    ContactPointTypeCode
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE raw.Phones ADD CONSTRAINT
    fk_phones_contact FOREIGN KEY
    (
    ProfileID,
    PhoneID
    ) REFERENCES raw.Contact
    (
    ProfileID,
    ContactID
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

GO
ALTER TABLE raw.Phones SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE raw.MarketingFlag ADD CONSTRAINT
    fk_marketingflag_contact FOREIGN KEY
    (
    ProfileID,
    ContactID
    ) REFERENCES raw.Contact
    (
    ProfileID,
    ContactID
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

GO
ALTER TABLE raw.MarketingFlag SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE raw.PostalAddress ADD CONSTRAINT
    fk_AddressProfile FOREIGN KEY
    (
    ProfileID,
    AddressID
    ) REFERENCES raw.Contact
    (
    ProfileID,
    ContactID
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

GO
ALTER TABLE raw.PostalAddress SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.