2008-10-10 9 views
5

Quiero encontrar un comando sql o algo que pueda hacer esto donde tengo una tabla llamada tblFoo y quiero ponerle el nombre tblFooBar. Sin embargo, quiero que la clave principal para ser también el cambio, por ejemplo, en la actualidad es:Renombrar tablas SQL Server, conectando en cascada ese cambio a través de PK y FK

CONSTRAINT [PK_tblFoo] PRIMARY KEY CLUSTERED 

y quiero un cambio de nombre para cambiarlo a:

CONSTRAINT [PK_tblFooBar] PRIMARY KEY CLUSTERED 

Entonces, de forma recursiva ir a través y En cascada este cambio en todas las tablas que tienen una relación de llave maestra, por ejemplo. de esta:

CHECK ADD CONSTRAINT [FK_tblContent_tblFoo] FOREIGN KEY([fooID]) 

A esto:

CHECK ADD CONSTRAINT [FK_tblContent_tblFooBar] FOREIGN KEY([fooID]) 

Naturalmente, estoy tratando de no ir a través y hacer todo esto de forma manual porque a) se trata de un proceso propenso a errores, y b) que doesn' t escala.

Respuesta

7

Esto está fuera de mi cabeza y no está completo (sería necesario agregar un código similar para los índices). Además, necesitaría agregar código para evitar el cambio de nombre de objetos de una tabla con el mismo nombre base, pero con caracteres adicionales, por ejemplo, este código también mostraría tblFoo2 y todos sus objetos asociados. Sin embargo, espero que sea un comienzo para ti.

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 + '%' 
1

SQL Server no hará esto directamente hasta donde yo sepa. Tendría que crear manualmente el script para hacer el cambio. Esto se puede lograr generando el SQL para la definición de la tabla (SSMS hará esto) y haciendo una búsqueda y reemplazo en los nombres.

3

Una gran herramienta que elimina la dificultad de cambiar el nombre de las tablas es Red Gate SQL Refactor Se encontrará automáticamente de su dependencia y funciona todo eso para usted también.

gran fan :-)

5

Buena respuesta de Tom
acabo extendió su consulta aquí para incluir índices

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 + '%' 
Cuestiones relacionadas