"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." ... 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ł?
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ć).
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 ".
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ę.
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.
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:
- nawet microsoft ostrzega, że może to spowodować utratę danych (Ten komentarz jest automatycznie generowany)! Przez pewien czas klucze obce nie są wymuszone.
- 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ę.
- 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
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