Rinomina tabelle SQL Server, a cascata che cambiano tramite PK e FK
-
08-07-2019 - |
Domanda
Voglio trovare un comando sql o qualcosa che possa fare questo dove ho una tabella chiamata tblFoo e voglio chiamarla tblFooBar. Tuttavia, voglio che anche la chiave primaria sia il cambiamento, ad esempio attualmente è:
CONSTRAINT [PK_tblFoo] PRIMARY KEY CLUSTERED
E voglio un cambio di nome per cambiarlo in:
CONSTRAINT [PK_tblFooBar] PRIMARY KEY CLUSTERED
Quindi, ricorsivamente, esegui questa modifica in cascata su tutte le tabelle che hanno una relazione chiave principale, ad es. da questo:
CHECK ADD CONSTRAINT [FK_tblContent_tblFoo] FOREIGN KEY([fooID])
A questo:
CHECK ADD CONSTRAINT [FK_tblContent_tblFooBar] FOREIGN KEY([fooID])
Ovviamente, sto provando a non eseguire tutto questo manualmente perché a) è un processo soggetto a errori eb) non si ridimensiona.
Soluzione
Questo è appena fuori dalla mia testa e non è completo (dovresti aggiungere un codice simile per gli indici). Inoltre, dovrai aggiungere il codice per evitare di rinominare gli oggetti da una tabella con lo stesso nome di base, ma caratteri aggiuntivi - ad esempio, questo codice elencherebbe anche tblFoo2 e tutti i suoi oggetti associati. Spero che sia un inizio per te.
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 + '%'
Altri suggerimenti
Buona risposta di Tom
Ho appena esteso la sua query qui per includere gli indici
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 + '%'
Un ottimo strumento che elimina il problema della ridenominazione delle tabelle è Red Gate SQL refactoring Troverà automaticamente le tue dipendenze e risolverà tutte quelle cose anche per te.
Grande fan :-)
SQL Server non lo farà direttamente per quanto ne so. Dovresti creare manualmente lo script per apportare la modifica. Ciò può essere ottenuto generando l'SQL per la definizione della tabella (SSMS lo farà) e facendo una ricerca e sostituendo i nomi.