2010-06-21 11 views
5

Ich bin mir sicher, dass dies eine ziemlich häufige Abfrage sein könnte, aber bisher keine gute Antwort finden konnte.SQL, Wie ändert man die Spalte in der SQL-Tabelle, ohne andere Abhängigkeiten zu brechen?

Hier ist meine Frage:

ich einen Tisch Kontakte mit varchar Spalte Titel benannt haben. Jetzt in der Mitte der Entwicklung möchte ich Feld ersetzen Titel mit TitleID die Fremdschlüssel zu ContactTitles Tabelle ist. Im Moment Tabelle Kontakte hat über 60 Abhängigkeiten (andere Tabellen, Ansichten Funktionen).

Wie kann ich das am sichersten und einfachsten machen?

Wir verwenden: MSSQL 2005, Daten wurden bereits migriert, wollen nur Schema ändern.

Edit:

Dank an alle für die schnelle Wiedergabe.

Wie es Kontakte Tisch verfügt über mehr als 60 Familienangehörige erwähnt, aber wenn folgende Abfrage ausgeführt wurde, so dass sie nur 5 von Titel Spalte. Das Migrationsskript wurde ausgeführt, daher sind keine Datenänderungen erforderlich.

/*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.

+0

Sie müssen ein wenig vorsichtig in SQL2005 damit sein. Wenn irgendwelche Definitionen> 4000 Zeichen lang sind, können sie auf zwei Zeilen verteilt werden, die Abfrage in meinem Post ist sicherer (oder es wäre eigentlich besser, sys.sql_modules zu verwenden). Ich nehme an, Sie benutzen nie '*', das könnte Dinge auch vermasseln? –

+0

@Martin Smith du hast Recht, aber ich war mehr nach den Orten, wo diese Spalten verwendet wurden. – cinek

+0

was ich meine, ist es eine winzige Chance, dass die Definition so aufgeteilt ist, dass eine Zeile endet "... Tit" und die nächste entsprechende Zeile beginnt "le ..." so die LIKE-Abfrage wird es verpassen. –

Antwort

1

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

In der Vergangenheit habe ich es geschafft habe helfen kann dies ganz einfach zu tun (wenn primitiv), indem Sie einfach eine Liste der Dinge immer zu Bewertung

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

(und möglicherweise Abhängigkeiten Informationen zu berücksichtigen und Filterung nach Objekttyp unter)

Scripting all diejenigen von Interesse in Management Studio dann einfach gehen Sie durch die Liste und Wieder alle anzeigen und das CREATE in ALTER ändern. Es sollte eine ziemlich einfache und sich wiederholende Änderung sogar für 60 mögliche Abhängigkeiten sein. Wenn Sie auf eine nicht vorhandene Spalte verweisen, sollten Sie eine Fehlermeldung erhalten, wenn Sie das Skript auf ALTER ausführen.

Wenn Sie * in Ihren Abfragen oder Adhoc SQL in Ihren Anwendungen verwenden, können die Dinge natürlich ein bisschen schwieriger sein.

+0

Diese Antwort war am genauesten für mich. – cinek

3

Verwenden Sie refactoring Methoden. Beginnen Sie damit, indem Sie ein neues Feld namens TitleID anlegen und kopieren Sie dann alle Titel in die Tabelle ContactTitles. Aktualisieren Sie dann nacheinander alle Abhängigkeiten, um das TitleID-Feld zu verwenden. Stellen Sie nur sicher, dass Sie nach jedem Schritt noch ein funktionierendes System haben. Wenn sich die Daten ändern, müssen Sie vorsichtig sein und sicherstellen, dass alle Änderungen an der Title Spalte auch die ContactTitles Tabelle ändern. Sie müssen sie nur synchron halten, während Sie das Refactoring durchführen.

Bearbeiten: Es gibt sogar ein Buch darüber! Refactoring Databases.

2

Wie andere darauf hingewiesen haben hängt es von Ihrem RDBMS ab.

Es gibt zwei Ansätze:

  • eine Änderung an der Tabelle machen und beheben alle Abhängigkeiten
  • eine Ansicht, die Sie anstelle von direkten Zugriff auf die Tabelle verwenden können (dies können Sie gegen künftige Veränderungen schützen in der zugrunde liegenden Kerntisch (e), aber Sie könnten einige Update-Funktion, je nach DBMS)
0

Verwenden SP_Depend ‚Tabellenname‘ lösen Sie die Abhängigkeiten der Tabelle und verwenden Sie dann die sp_rename überprüfen die umbenennen Colum n Name, der sehr nützlich ist. sp_rename benennt automatisch den zugeordneten Index um, wenn eine PRIMARY KEY- oder UNIQUE-Bedingung umbenannt wird. Wenn ein umbenannter Index an eine PRIMARY KEY-Einschränkung gebunden ist, wird die PRIMARY KEY-Einschränkung automatisch auch durch sp_rename umbenannt.

und dann starten Sie die Prozedur und Funktionen nacheinander zu aktualisieren gibt es keine andere gute Option für solche Änderungen, wenn Sie gefunden haben, dann sagen Sie mir auch.

+0

Ich würde die Abhängigkeiten Informationen nicht vertrauen, wenn Sie sp_refreshsqlmodule für alle Objekte ausgeführt haben. Dies kann falsch sein, wenn Abhängigkeiten außerhalb der Reihenfolge erstellt werden. –

+0

Wenn Sie die Sql starten, werden alle automatisch aktualisiert. hab ich recht oder nicht? also kein Problem die Abhängigkeiten zu überprüfen. – KuldipMCA

+0

Ziemlich sicher, dass das nicht stimmt, aber fühlen Sie sich frei, mich falsch zu beweisen! –

Verwandte Themen