Frage

Nun, da wir aus int Kapazität auf einer PK-Säule laufen (was ein IDENTITY ist) Ich möchte, dies zu tun bigint, aber einfach ALTER TABLE scheint nicht in der Lage zu sein, dass groß eine Tabelle zu behandeln. Also meine Frage ist: Wie kann ich den Typ einer PK Spalte ändern mit aktuellen Werten an Ort und Stelle zu halten und muss ich ändern Tabellen referenzieren und

War es hilfreich?

Lösung

Neben KLE Vorschlag, könnten die folgenden Abfragen helfen:

Um alle Einschränkungen für die Tabellen zu deaktivieren, die die Ausgabe der folgenden Abfrage OldTable versuchen Referenz auszuführen:

SELECT 'ALTER TABLE ' + OBJECT_NAME(fk.parent_object_id) + ' NOCHECK CONSTRAINT ' + fk.name
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns AS fkc ON fk.OBJECT_ID = fkc.constraint_object_id
WHERE OBJECT_NAME (fk.referenced_object_id) = 'oldTable'

Um alle Daten in die neue Tabelle zu verschieben, mit Veränderung des Feldes versuchen Sie dies:

INSERT INTO newTable
SELECT CONVERT(BIGINT, ID) AS ID, COL1, COL2, ..., COLN
FROM oldTable

die alte Tabelle löschen:

DROP TABLE oldTable

Um die neue Tabelle auf den alten Namen umbenannt werden:

sp_rename newTable, oldTable

Um alle Einschränkungen für die Tabellen erneut zu aktivieren, die OldTable verweisen, versuchen, die Ausgabe der folgenden Abfrage auszuführen:

SELECT 'ALTER TABLE ' + OBJECT_NAME(fk.parent_object_id) + ' CHECK CONSTRAINT ' + fk.name
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns AS fkc ON fk.OBJECT_ID = fkc.constraint_object_id
WHERE OBJECT_NAME (fk.referenced_object_id) = 'oldTable'

Hoffe, es hilft ...

Andere Tipps

Was wir tun würden, ist:

  

speichern Sie Ihre Tabelle

  1. Erstellen Sie eine neue Tabelle mit der richtigen Struktur
  2. deaktivieren Sie alle Einschränkungen für diese Tabellen und diejenigen, die sie
  3. Referenz
  4. verschieben Sie alle Daten in die neue Tabelle, mit Veränderung des Feldes; es kann durch Chargen
  5. erfolgen
  6. löschen Sie die alte Tabelle, wenn es leer
  7. benennen Sie die neue Tabelle auf den alten Namen
  8. aktivieren Sie alle Einschränkungen für alle Tabellen (einige FK Spalte und Einschränkungen wahrscheinlich zu müssen Fixierung ... Aber sie sind nicht PK, so dass sie modifizierbar)

      

    6 bearbeitet (dank Alexey)

Dies ist sauber, machbar in den Reihen, gut verstanden.

Sie müssen auch die untergeordneten Tabellen ändern. Schließlich werden Sie jetzt auch versuchen, einen großen int in sie einzufügen. Ich würde zuerst die untergeordneten Tabellen wechseln

Dies ist kein leichter oder kurzer Prozess. Ich würde Ihnen vorschlagen, dass Sie die Benutzer anweisen die die Datenbank für die Wartung werden nach unten geht (man kann abschätzen, wie lange, wie lange dauert es Entwickler zu tun) auf einem festgelegten Datum und die databse den Single-User-Modus zurückgesetzt, während Sie machen diese Veränderungen. Sie wollen nicht, Daten zu verlieren, die (oder geändert) hinzugefügt wird von den Benutzern an einen Tisch, während Sie auf den anderen wechseln. wenn für somereason können Sie nicht maintence Fenster havea (und ich stark aus Gründen der Datenintegrität deuten darauf hin, dass Sie tun), dann müssen Sie die Tabellen Kind über erste ändern Einsatzfehler, wenn Ihr ein wirklich nahe an der Grenze zu vermeiden und wird die großen Zahlen sehen fast sofort.

Achten Sie darauf, die gesamte datbase Struktur einschließlich standardmäßig Skript, Trigger überprüfen Einschränkungen von Indizes usw., wie Sie alles neu erstellen wollen.

Stellen Sie sicher, all dies durch Skripte auf dev zu tun. Das macht es viel einfacher, ein prod zu tun, wenn Sie den Prozess getestet werden.

Ich bin denke, man kann nur eine neue Datenbank mit geändertenen PK-Datentyp erstellen und dann den Export / Import von Daten oder Masseneinsatz in neuen, dann neue Datenbank umbenennen. Natürlich ist dies tatsächlich, wenn Sie viele referenzierten Tabellen und Ihrem neuen PK-Datentyp nicht kompatibel mit früheren haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top