it-swarm.com.de

"Verhindern Sie das Speichern von Änderungen, bei denen die Tabelle neu erstellt werden muss", was negative Auswirkungen hat

Präambel

Ich habe heute in SQL Server 2008 eine Spalte geändert und den Datentyp von "currency" (18,0) in "(19,2)" geändert.

Ich habe den Fehler "Die Änderungen, die Sie vorgenommen haben, erfordern, dass die folgenden Tabellen gelöscht und neu erstellt werden" von SQL Server.

Bevor Sie antworten, lesen Sie bitte Folgendes:

Ich weiß bereits, dass es die Option in Extras ► Optionen ► Designer ► Tabellen- und Datenbankdesigner ► Deaktivieren Sie das Kontrollkästchen "Speichern von Änderungen verhindern, die eine Neuerstellung der Tabelle erfordern . " Prevent saving changes that require table re-creation in five clicks ... also antworte nicht damit!

Aktuelle Frage

Meine eigentliche Frage ist für etwas anderes wie folgt:

Gibt es negative Auswirkungen/mögliche Nachteile?

Wird die Tabelle tatsächlich gelöscht und automatisch neu erstellt, wenn dieses Kontrollkästchen deaktiviert ist?

Wenn ja, handelt es sich bei der Tabellenkopie um eine 100% genaue Kopie der Quelltabelle?

242
CF_HoneyBadger

Die Tabelle wird nur in Fällen gelöscht und neu erstellt, in denen SQL Server Management Studio nur so programmiert wurde, dass es weiß, wie es geht.

Es gibt sicherlich Fälle, in denen dies nicht erforderlich ist, aber es wird auch Fälle geben, in denen Änderungen, die Sie in Management Studio vornehmen, nicht erforderlich sind löschen und neu erstellen, weil es nicht muss.

Das Problem ist, dass das Auflisten aller Fälle und das Bestimmen, auf welche Seite der Linie sie fallen, ziemlich mühsam sein wird.

Aus diesem Grund verwende ich gerne ALTER TABLE in einem Abfragefenster statt visueller Designer, die verbergen, was sie tun (und ehrlich gesagt Fehler haben) - Ich weiß genau, was passieren wird, und kann mich auf Fälle vorbereiten, in denen die einzige Möglichkeit darin besteht, Löschen Sie die Tabelle und erstellen Sie sie neu (dies ist eine Nummer weniger als die Häufigkeit, mit der SSMS Ihnen das antut).

86
Aaron Bertrand

Extras -> Optionen -> Designer-Knoten -> Deaktivieren Sie " Verhindert das Speichern von Änderungen, die eine Neuerstellung der Tabelle erfordern ".

246

Referenz - Wenn Sie diese Option deaktivieren, können Sie vermeiden, dass eine Tabelle neu erstellt wird. Außerdem können Änderungen verloren gehen. Angenommen, Sie aktivieren die Änderungsverfolgung in SQL Server 2008, um Änderungen an der Tabelle zu verfolgen. Wenn Sie einen Vorgang ausführen, durch den die Tabelle neu erstellt wird, wird die im Abschnitt "Problembeschreibung" genannte Fehlermeldung angezeigt. Wenn Sie diese Option deaktivieren, werden die vorhandenen Änderungsverfolgungsinformationen jedoch gelöscht, wenn die Tabelle neu erstellt wird. Microsoft empfiehlt daher, dass Sie dieses Problem nicht umgehen, indem Sie die Option deaktivieren.

11
user1499112

SQL Server löscht und erstellt die Tabellen nur dann neu, wenn Sie:

  • Fügen Sie eine neue Spalte hinzu
  • Ändern Sie die Einstellung "Nullen zulassen" für eine Spalte
  • Ändern Sie die Spaltenreihenfolge in der Tabelle
  • Ändern Sie den Spaltendatentyp

Die Verwendung von ALTER ist sicherer, da Ihre Daten verloren gehen, wenn die Metadaten verloren gehen, während Sie die Tabelle neu erstellen.

11

Ja, das hat negative Auswirkungen:

Wenn Sie eine Änderung ausschreiben, die durch dieses Flag blockiert ist, erhalten Sie so etwas wie das folgende Skript (alles, was ich aus der ID-Spalte in Contact eine automatisch nummerierte IDENTITY-Spalte mache, aber die Tabelle hat Abhängigkeiten). Beachten Sie mögliche Fehler, die auftreten können, während Folgendes ausgeführt wird:

  1. Sogar Microsoft warnt davor, dass dies zu Datenverlust führen kann (dieser Kommentar wird automatisch generiert)!
  2. für einen bestimmten Zeitraum werden Fremdschlüssel nicht erzwungen.
  3. wenn Sie dies manuell in ssms ausführen und die Anweisung 'EXEC' ('INSERT INTO' schlägt fehl und Sie lassen die folgenden Anweisungen laufen (was sie standardmäßig tun, da sie durch 'go' getrennt sind), fügen Sie 0 Zeilen ein und löschen sie dann der alte Tisch.
  4. wenn dies eine große Tabelle ist, kann die Laufzeit der Einfügung groß sein, und die Transaktion enthält eine Schemamodifikationssperre. Blockiert also viele Dinge.

-

/* 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
Andrew Hill