"Zapobiegaj zapisywaniu zmian, które wymagają ponownego utworzenia tabeli" negatywne skutki

Preambuła

Modyfikowałem dziś kolumnę w SQL Server 2008, zmieniając typ danych z czegoś takiego jak currency(18,0) na (19,2).

Otrzymałem błąd "zmiany, które wprowadziłeś, wymagają upuszczenia i ponownego utworzenia następujących tabel" z SQL Server.

Zanim odpowiesz, przeczytaj:

Wiem już, że jest opcja w Narzędzia ► Opcje ► projektant ► Tabela i Baza Danych Projektanci ► odznacz pole " Zapobiegaj zapisywaniu zmian wymagających ponownego utworzenia tabeli." Zapobiegaj zapisywaniu zmian wymagających ponownego utworzenia tabeli za pomocą pięciu kliknięć ... więc NIE ODPOWIADAJ tym!

Aktualne pytanie

Moje prawdziwe pytanie dotyczy czegoś innego, jak następuje:

Czy są jakieś negatywne skutki / możliwe wady robienia tego?

Czy tabela jest automatycznie usuwana i odtwarzana, gdy to pole nie jest zaznaczone?

Jeśli tak, to czy kopia tabeli jest w 100% dokładna replika tabeli źródeł?

Author: Brian Tompsett - 汤莱恩, 2012-08-03

5 answers

Tabela jest upuszczana i ponownie tworzona tylko w przypadkach, gdy jest to jedyny sposób, w jaki Studio zarządzania SQL Server zostało zaprogramowane, aby wiedzieć, jak to zrobić.

Z pewnością są przypadki, w których to zrobi, gdy nie będzie to konieczne, ale będą też przypadki, w których zmiany wprowadzone w Management Studio nie będąspadać i odtwarzać, ponieważ nie muszą.

Problem polega na tym, że wyliczenie wszystkich przypadków i określenie, po której stronie linii spadną, będzie dość nudne.

Dlatego lubię używać ALTER TABLE w oknie zapytań, zamiast projektantów wizualnych, którzy ukrywają to ,co robią (i szczerze mówiąc mają błędy) - wiem dokładnie, co się stanie, i mogę przygotować się na przypadki, w których jedyną możliwością jest upuszczenie i odtworzenie tabeli(co jest pewną liczbą mniejszą niż to, jak często SSMS będzie to robić).

 92
Author: Aaron Bertrand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-22 23:33:45

Narzędzia -- > Opcje -- > węzeł projektantów -- > odznacz " Zapobiegaj zapisywaniu zmian, które wymagają odtworzenia tabeli ".

 253
Author: Antoine Meltzheim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-19 16:21:30

Bibliografia - wyłączenie tej opcji może pomóc uniknąć ponownego tworzenia tabeli, może również prowadzić do utraty zmian. Załóżmy na przykład, że włączasz funkcję śledzenia zmian w SQL Server 2008, aby śledzić zmiany w tabeli. Podczas wykonywania operacji, która powoduje ponowne utworzenie tabeli, pojawia się komunikat o błędzie, o którym mowa w sekcji "objawy". Jeśli jednak wyłączysz tę opcję, istniejące informacje o śledzeniu zmian zostaną usunięte, gdy tabela została ponownie utworzona. Dlatego Microsoft zaleca, aby nie obejść tego problemu, wyłączając tę opcję.

 12
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-04 11:27:10

SQL Server upuszcza i odtwarza tabele tylko wtedy, gdy:

  • Dodaj nową kolumnę
  • Zmiana ustawienia Zezwól na NULL dla kolumny
  • Zmiana kolejności kolumn w tabeli
  • Zmień typ danych kolumny

Użycie ALTER jest bezpieczniejsze, ponieważ w przypadku utraty metadanych podczas ponownego tworzenia tabeli, Twoje dane zostaną utracone.

 11
Author: Carol Baker West,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-04 20:47:50

Tak, są z tego negatywne skutki:

Jeśli wykreślisz zmianę zablokowaną przez tę flagę, otrzymasz coś takiego jak skrypt poniżej (zamieniam kolumnę ID w Contact w kolumnę z autonumerowaną tożsamością, ale tabela ma zależności). Zwróć uwagę na potencjalne błędy, które mogą wystąpić podczas wykonywania następujących czynności:

  1. nawet microsoft ostrzega, że może to spowodować utratę danych (Ten komentarz jest automatycznie generowany)!
  2. Przez pewien czas klucze obce nie są wymuszone.
  3. jeśli ręcznie uruchomisz to w ssms i'EXEC ('INSERT INTO' nie powiedzie się, i pozwolisz następującym poleceniom uruchomić (co robią domyślnie, ponieważ są podzielone przez 'go'), to wstawisz 0 wierszy, a następnie upuść starą tabelę.
  4. jeśli jest to duża tabela, czas wykonania wstawki może być duży, a transakcja posiada blokadę modyfikacji schematu, więc blokuje wiele rzeczy.

--

/* 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
 2
Author: Andrew Hill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-15 23:31:51