Cambiar el nombre de las tablas de SQL Server, en cascada que cambian a través de PK y FK

StackOverflow https://stackoverflow.com/questions/191787

  •  08-07-2019
  •  | 
  •  

Pregunta

Quiero encontrar un comando sql o algo que pueda hacer esto donde tengo una tabla llamada tblFoo y quiero nombrarla tblFooBar. Sin embargo, quiero que la clave principal también se cambie, por ejemplo, actualmente es:

CONSTRAINT [PK_tblFoo] PRIMARY KEY CLUSTERED 

Y quiero un cambio de nombre para cambiarlo a:

CONSTRAINT [PK_tblFooBar] PRIMARY KEY CLUSTERED 

Luego, revisa recursivamente y conecta en cascada este cambio en todas las tablas que tienen una relación clave principal, por ejemplo. de esto:

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 pasar y hacer todo esto manualmente porque a) es un proceso propenso a errores yb) no se escala.

¿Fue útil?

Solución

Esto está justo en la parte superior de mi cabeza y no está completo (necesitaría agregar un código similar para los índices). Además, necesitaría agregar código para evitar cambiar el nombre de los objetos de una tabla con el mismo nombre base, pero caracteres adicionales; por ejemplo, este código también incluirí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 + '%'

Otros consejos

Buena respuesta de Tom
Acabo de extender 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 + '%'

Una gran herramienta que elimina el dolor de cambiar el nombre de las tablas es Red Gate SQL Refactorizador Encontrará automáticamente su dependencia y resolverá todas esas cosas por usted también.

Gran fan :-)

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top