Question

Je veux trouver une commande SQL ou quelque chose qui puisse le faire. J'ai une table nommée tblFoo et je veux la nommer tblFooBar. Cependant, je souhaite que la clé primaire soit également modifiée, par exemple, elle est actuellement:

CONSTRAINT [PK_tblFoo] PRIMARY KEY CLUSTERED 

Et je veux un changement de nom pour le changer en:

CONSTRAINT [PK_tblFooBar] PRIMARY KEY CLUSTERED 

Ensuite, parcourez de manière récursive et modifiez en cascade cette modification sur toutes les tables ayant une relation de clé antérieure, par exemple. à partir de ceci:

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

À ceci:

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

Naturellement, j'essaie de ne pas passer à l'action et de faire tout cela manuellement, car a) il s'agit d'un processus sujet aux erreurs et b) il ne s'adapte pas.

Était-ce utile?

La solution

Ceci est juste une idée en tête et n’est pas complet (vous auriez besoin d’ajouter du code similaire pour les index). En outre, vous devrez soit ajouter du code pour éviter de renommer les objets d'une table portant le même nom de base, mais des caractères supplémentaires - par exemple, ce code répertoriera également tblFoo2 et tous ses objets associés. J'espère que c'est un début pour vous cependant.

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

Autres conseils

Bonne réponse de Tom
Je viens de prolonger sa requête ici pour inclure des index

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 Red Gate SQL est un excellent outil pour renommer les tables. Refactor Il trouvera automatiquement votre dépendance et réglera tout cela pour vous aussi.

Grand fan: -)

SQL Server ne le fera pas directement pour autant que je sache. Vous devrez créer manuellement le script pour effectuer le changement. Cela peut être réalisé en générant le code SQL pour la définition de la table (ce que fera SSMS) et en effectuant une recherche et un remplacement sur les noms.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top