Frage

Ich bin sicher, könnte dies durchaus üblich Abfrage, aber nicht gute Antwort wie jetzt gefunden.

Hier ist meine Frage:

Ich habe eine Tabelle mit dem Namen bekam Kontakte mit varchar Spalte Titel . Jetzt mitten in der Entwicklung mag ich Feld ersetzen Titel mit TitleID , die auf Fremdschlüssel ist ContactTitles Tabelle. Im Moment Tabelle Kontakte hat über 60 Abhängigkeiten (andere Tabellen, Views Funktionen).

Wie kann ich tun, dass der sichersten und einfachste Weg?

Wir verwenden: MSSQL 2005 hat Daten, die bereits migriert wurden, wollen einfach nur ändern Schema

.

Bearbeiten:

Danke an alle für die schnelle Wiedergabe.

Wie es erwähnt wurde Kontakte Tabelle hat mehr als 60 Angehörigen, aber wenn folgende Abfrage ausgeführt wurde, nur 5 von ihnen verwenden Titel Spalte. Migration Skript ausgeführt wurde, so dass keine Daten erforderliche Änderungen vor.

/*gets all objects which use specified column */

SELECT Name FROM syscomments sc JOIN sysobjects so ON sc.id = so.id WHERE TEXT LIKE '%Title%' AND TEXT LIKE '%TitleID%'

Dann ging ich durch diese 5 Ansichten und manuell aktualisiert werden.

War es hilfreich?

Lösung

Für Microsoft SQL Server Redgate ein (nicht kostenlos) Produkt, das kann helfen, mit diesem Refactoring http://www.red-gate.com/products/sql_refactor/index.htm

In der Vergangenheit habe ich es geschafft, dies ganz einfach zu tun (wenn primitiv), indem Sie einfach eine Liste der Dinge zu Kritik bekommen

SELECT * FROM sys.objects
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%Contacts%' 

(und möglicherweise Abhängigkeiten Informationen berücksichtigt und Filterung nach Objekttyp nehmen)

Scripting alle diejenigen von Interesse in Management Studio dann gehen Sie einfach die Liste nach unten und sie alle zu überprüfen und zu ändern die zu ALTER CREATE. Es sollte sogar für 60 mögliche Abhängigkeiten ganz eine einfache und sich wiederholende Veränderung sein. Zusätzlich, wenn Sie auf eine nicht vorhandene Spalte verweisen, sollten Sie eine Fehlermeldung erhalten, wenn Sie das Skript ALTEN laufen.

Wenn Sie * in Ihren Anfragen oder Ad-hoc-SQL in Ihren Anwendungen verwenden offensichtlich können die Dinge ein wenig schwieriger sein.

Andere Tipps

Verwenden Sie Refactoring Methoden. Beginnen Sie, indem Sie ein neues Feld namens TitleID erstellen, dann alle Titel in die ContactTitles Tabelle kopieren. Dann, eines nach dem anderen, aktualisieren jeder der Abhängigkeiten der TitleID Feld zu verwenden. So stellen Sie sicher haben Sie immer noch ein funktionierendes System nach jedem Schritt.

Wenn das Ändern von Daten werden wird, werden Sie müssen vorsichtig sein und sicherstellen, dass alle Änderungen an der Title Spalte auch die ContactTitles Tabelle ändern. Sie werden nur sie synchron zu halten, während Sie das Refactoring tun.

Edit: Es gibt sogar ein Buch darüber! Refactoring Datenbanken .

Wie andere wiesen darauf hin, es auf Ihrem RDBMS abhängig ist.

Es gibt zwei Ansätze:

  • eine Änderung an den Tisch und reparieren alle Abhängigkeiten
  • einen Blick, dass Sie anstelle von direkten Zugriff auf die Tabelle verwenden können (dies Sie gegen zukünftige Veränderungen in der zugrunde liegenden Kerntisch (e) schützen kann, aber Sie könnten einige Update-Funktion verlieren, auf dem DBMS abhängig)

Mit SP_Depend ‚Tabellenname‘, um die Abhängigkeiten der Tabelle zu überprüfen Verwenden Sie dann die sp_rename die Spaltennamen zu benennen, die sehr nützlich ist. sp_rename benennt automatisch den zugehörigen Index, wenn ein PRIMARY KEY oder UNIQUE Constraint umbenannt. Wenn eine umbenannte Index auf eine PRIMARY KEY-Einschränkung gebunden ist, wird die PRIMARY KEY-Einschränkung auch automatisch durch sp_rename umbenannt.

und starten Sie die Prozedur aktualisiert und Funktionen einer nach dem anderen gibt es keine andere gute Option für Veränderung wie diese, wenn Sie mir dann sagen gefunden.

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