Umbenennen von Tabellen SQL Server, Cascading diese Änderung durch PK und FK ist
-
08-07-2019 - |
Frage
Ich möchte einen SQL-Befehl oder etwas finden, die dies tun können, wo ich eine Tabelle mit dem Namen tblFoo haben und ich möchte es tblFooBar nennen. Allerdings habe ich den Primärschlüssel Änderung auch sein möge, zum Beispiel, zur Zeit ist es:
CONSTRAINT [PK_tblFoo] PRIMARY KEY CLUSTERED
Und ich will eine Namensänderung, es zu ändern:
CONSTRAINT [PK_tblFooBar] PRIMARY KEY CLUSTERED
Dann rekursiv durchlaufen und Kaskade diese Änderung auf alle Tabellen, die eine foreigh Schlüsselbeziehung haben, zum Beispiel. von dieser:
CHECK ADD CONSTRAINT [FK_tblContent_tblFoo] FOREIGN KEY([fooID])
Um dies zu:
CHECK ADD CONSTRAINT [FK_tblContent_tblFooBar] FOREIGN KEY([fooID])
Natürlich versuche ich, nicht durch zu gehen und diese manuell alles tun, weil es a) ein fehleranfälliger Prozess ist, und b) es nicht Maßstab.
Lösung
Dies ist nur aus der Spitze von meinem Kopf und ist nicht vollständig (Sie bräuchten einen ähnlichen Code für Indizes hinzufügen). Außerdem müssten Sie entweder Code hinzufügen zu vermeiden Objekte aus einer Tabelle mit dem gleichen Basisnamen umbenennen, aber weitere Zeichen - zum Beispiel, würde dieser Code auch tblFoo2 und alle dazugehörigen Objekte aufzulisten. Hoffentlich es ist ein Anfang für Sie aber.
DECLARE
@old_name VARCHAR(100),
@new_name VARCHAR(100)
SET @old_name = 'tblFoo'
SET @new_name = 'tblFooBar'
SELECT
'EXEC sp_rename ''' + name + ''', ''' + REPLACE(name, @old_name, @new_name) + ''''
FROM dbo.sysobjects
WHERE name LIKE '%' + @old_name + '%'
Andere Tipps
Gute Antwort von Tom
Ich habe gerade seine Abfrage hier erweiterte Indizes enthalten
declare
@old nvarchar(100),
@new nvarchar(100)
set @old = 'OldName'
set @new = 'NewName'
select 'EXEC sp_rename ''' + name + ''', ''' +
REPLACE(name, @old, @new) + ''''
from sys.objects
where name like '%' + @old + '%'
union -- index renames
select 'EXEC sp_rename ''' + (sys.objects.name + '.' + sys.indexes.name) + ''', ''' +
REPLACE(sys.indexes.name, @old, @new) + ''', ''INDEX'''
from sys.objects
left join sys.indexes on sys.objects.object_id = sys.indexes.object_id
where sys.indexes.name like '%' + @old + '%'
Ein großes Werkzeug, das den Schmerz aus Umbenennen Tabellen nimmt Red Gate SQL umgestalten Es wird automatisch Ihre Abhängigkeit finden und auch für Dich die ganze Zeug funktioniert.
Big Fan: -)
SQL Server wird dies nicht direkt, soweit ich weiß. Sie müssten manuell das Skript bauen die Änderung zu tun. Dies kann durch Erzeugen des SQL für die Tabellendefinition erreicht werden (SSMS wird dies tun) und eine Suche und ersetzen Sie auf den Namen.