122 votes

Comment changer le schéma de la base de données en dbo ?

J'ai importé un certain nombre de tables d'un ancien serveur sql (2000) vers ma base de données 2008. Toutes les tables importées sont préfixées avec mon nom d'utilisateur, par exemple : jonathan.MovieData . Dans le tableau properties il énumère jonathan comme schéma de la base de données. Lorsque j'écris des procédures stockées, je dois maintenant inclure jonathan. devant tous les noms de tables, ce qui est déroutant.

Comment puis-je changer toutes mes tables en dbo au lieu de jonathan ?

Résultat actuel : jonathan.MovieData

Résultat souhaité : dbo.MovieData

188voto

Remus Rusanu Points 159382
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

Voir ALTER SCHEMA .

Syntaxe généralisée :

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;

13 votes

Pour faire gagner du temps aux Googlers : ALTER SCHEMA TargetSchema TRANSFERT SourceSchema.TableName ;

1 votes

Si l'utilisateur a un backslash, exécutez ce qui suit : ALTER SCHEMA dbo TRANSFER "DOMAIN \user ".tableName

0 votes

@PatricF Le identifiants cités Les règles s'appliquent aux noms de schémas comme à tout autre nom : [DOMAIN\user].[tableName] . En général, dans la communauté SQL Server, on utilise les identifiants cités de Transact-SQL ( [ y ] ), éviter " à moins qu'il n'y ait une exigence spécifique pour cela.

42voto

patmortech Points 7482

Vous pouvez exécuter la commande suivante, qui générera un ensemble d'instructions ALTER sCHEMA pour tous vos talbes :

SELECT 'ALTER SCHEMA dbo TRANSFER ' + TABLE_SCHEMA + '.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'jonathan'

Vous devez ensuite copier et exécuter les déclarations dans l'analyseur de requêtes.

Voici un ancien script qui le fera aussi pour vous, je pense en changeant le propriétaire de l'objet. Je ne l'ai pas essayé sur 2008, cependant.

DECLARE @old sysname, @new sysname, @sql varchar(1000)

SELECT
  @old = 'jonathan'
  , @new = 'dbo'
  , @sql = '
  IF EXISTS (SELECT NULL FROM INFORMATION_SCHEMA.TABLES
  WHERE
      QUOTENAME(TABLE_SCHEMA)+''.''+QUOTENAME(TABLE_NAME) = ''?''
      AND TABLE_SCHEMA = ''' + @old + '''
  )
  EXECUTE sp_changeobjectowner ''?'', ''' + @new + ''''

EXECUTE sp_MSforeachtable @sql

Je l'ai obtenu de ce site .

Il est également question de faire la même chose pour les procs stockés si vous en avez besoin.

0 votes

J'ai essayé la deuxième partie sans succès, mais merci pour le lien, je vais me renseigner.

0 votes

N'avez-vous pas pu utiliser la sélection INFORMATION_SCHEMA ci-dessus pour générer automatiquement toutes vos déclarations ALTER SCHEMA ?

0 votes

Notez la citation suivante tirée du documentation de INFORMATION_SCHEMA.TABLES : " Important N'utilisez pas les vues INFORMATION_SCHEMA pour déterminer le schéma d'un objet. La seule façon fiable de trouver le schéma d'un objet est d'interroger la vue catalogue sys.objects." Ainsi, l'exemple doit être réécrit pour utiliser sys.tables (un sous-ensemble de sys.objects) à la place.

21voto

Mitch Wheat Points 169614
USE MyDB;
GO
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;
GO

Réf : ALTER SCHEMA

17voto

Neru-J Points 703

Déplacer la table de dbo schema vers MySchema :

 ALTER SCHEMA MySchema TRANSFER dbo.MyTable

Déplacer la table de MySchema vers le schéma dbo :

 ALTER SCHEMA dbo TRANSFER MySchema.MyTable

9voto

Lanceomagnifico Points 659

Je viens de poster ceci à une question similaire : Dans sql server 2005, comment modifier le "schéma" d'une table sans perdre de données ?


A léger amélioration de l'excellente réponse de sAeid...

J'ai ajouté un exec pour que ce code s'exécute lui-même, et j'ai ajouté une union en haut pour pouvoir modifier le schéma des 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 découvert que le schéma n'était pas dbo - j'ai passé des heures à essayer de faire en sorte que Sql Server management studio ou visual studio data transfers modifie le schéma de destination... J'ai fini par exécuter ceci contre le dump restauré sur le nouveau serveur pour obtenir les choses comme je le voulais.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X