web-dev-qa-db-fra.com

Dans SQL Server 2005, comment puis-je changer le "schéma" d'une table sans perdre de données?

J'ai une table qui est entrée dans le schéma "db_owner" et j'en ai besoin dans le schéma "dbo".

Existe-t-il un script ou une commande à exécuter pour le basculer?

72
DevelopingChris

Dans SQL Server Management Studio:

  1. Faites un clic droit sur le tableau et sélectionnez modifier (il s'appelle maintenant "Conception")
  2. Dans le panneau des propriétés, choisissez le schéma propriétaire approprié.
80
Jason Punyon
ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]
83
Stephen Wrighton

Montre tout TABLE_SCHEMA par ce choix:

SELECT TABLE_SCHEMA, TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 

Vous pouvez utiliser cette requête pour changer tout le schéma de toutes les tables en schéma de table dbo:

DECLARE cursore CURSOR FOR 

SELECT TABLE_SCHEMA, TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA <> 'dbo' 


DECLARE @schema sysname, 
 @tab sysname, 
 @sql varchar(500) 


OPEN cursore     
FETCH NEXT FROM cursore INTO @schema, @tab 

WHILE @@FETCH_STATUS = 0     
BEGIN 
 SET @sql = 'ALTER SCHEMA dbo TRANSFER ' + @schema + '.' + @tab     
 PRINT @sql     
 FETCH NEXT FROM cursore INTO @schema, @tab     
END 

CLOSE cursore     
DEALLOCATE cursore
12

réponse simple

sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'

vous n'avez pas besoin d'arrêter toutes les connexions à la base de données, cela peut être fait à la volée.

7
Jeremy

A légère amélioration de l'excellente réponse de sAeid ...

J'ai ajouté un exécutable pour que ce code s'exécute automatiquement, et j'ai ajouté une union en haut pour pouvoir changer le schéma des deux tables ET des procédures stockées:

DECLARE cursore CURSOR FOR 


select specific_schema as 'schema', specific_name AS 'name'
FROM INFORMATION_SCHEMA.routines
WHERE specific_schema <> 'dbo' 

UNION ALL

SELECT TABLE_SCHEMA AS 'schema', TABLE_NAME AS 'name'
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA <> 'dbo' 



DECLARE @schema sysname, 
 @tab sysname, 
 @sql varchar(500) 


OPEN cursore     
FETCH NEXT FROM cursore INTO @schema, @tab 

WHILE @@FETCH_STATUS = 0     
BEGIN 
 SET @sql = 'ALTER SCHEMA dbo TRANSFER [' + @schema + '].[' + @tab +']'    
 PRINT @sql   
 exec (@sql)  
 FETCH NEXT FROM cursore INTO @schema, @tab     
END 

CLOSE cursore     
DEALLOCATE cursore

Moi aussi, j'ai dû restaurer un dbdump, et j'ai constaté que le schéma n'était pas dbo - j'ai passé des heures à essayer d'obtenir Sql Server Management Studio ou des transferts de données Visual Studio pour modifier le schéma de destination ... vidage sur le nouveau serveur pour obtenir les choses comme je le voulais.

5
Lanceomagnifico

Lorsque j'utilise SQL Management Studio, je n'obtiens pas l'option "Modifier", uniquement "Conception" ou "Édition". Si vous avez Visual Studio (j'ai vérifié VS.NET 2003, 2005 et 2008), vous pouvez utiliser l'Explorateur de serveurs pour modifier le schéma. Faites un clic droit sur le tableau et sélectionnez "Design Table" (2008) ou "Open Table Definition" (2003, 2005). Mettez en surbrillance la colonne complète "Nom de la colonne". Vous pouvez ensuite cliquer avec le bouton droit de la souris et sélectionner "Pages de propriétés" ou Propriétés (2008). Dans la feuille de propriétés, vous devriez voir le "Propriétaire" (2003 et 2005) ou le "Schéma" (2008) avec une liste déroulante pour les schémas possibles.

4
Anthony K

J'utilise ceci pour des situations où un groupe de tables doit être dans un schéma différent, dans ce cas le schéma dbo.

declare @sql varchar(8000)
;

select
  @sql = coalesce( @sql, ';', '') + 'alter schema dbo transfer [' + s.name + '].[' + t.name + '];'
from 
  sys.tables t
  inner join
  sys.schemas s on t.[schema_id] = s.[schema_id]
where 
  s.name <> 'dbo'
;

exec( @sql )
;
2
Oliver