Comment changer le schéma db en dbo

115

J'ai importé un tas de tables d'un ancien serveur SQL (2000) dans ma base de données de 2008. Toutes les tables importées sont préfixées avec mon nom d' utilisateur, par exemple: jonathan.MovieData. Dans le tableau, propertiesil est répertorié jonathancomme le schéma de base de données. Lorsque j'écris des procédures stockées, je dois maintenant inclure jonathan.devant tous les noms de table, ce qui est déroutant.

Comment changer toutes mes tables pour qu'elles soient dbo au lieu de Jonathan?

Résultat actuel: jonathan.MovieData

Résultat désiré: dbo.MovieData

Jonathan Hall
la source

Réponses:

179
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

Voir ALTER SCHEMA .

Syntaxe généralisée:

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 
Remus Rusanu
la source
12
Pour gagner du temps pour les Googleurs: ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;
Co7e
1
Si l'utilisateur a une barre oblique inverse, exécutez ce qui suit: ALTER SCHEMA dbo TRANSFER "DOMAIN \ user" .tableName
PatricF
@PatricF Les identificateurs entre guillemets règles applicables aux noms de schéma comme à tout autre nom: [DOMAIN\user].[tableName]. En général, dans la communauté SQL Server, les identificateurs entre guillemets Transact-SQL sont utilisés ( [et ]), à éviter à "moins qu'il y ait une exigence spécifique pour cela.
Remus Rusanu
Comme Il a demandé toutes mes Tables , vérifiez ceci et cela pour le faire en une seule déclaration, l'espoir aide quelqu'un.
shaijut
2
@leigero utilise [et ], comme dans tout autre cas, lorsque vous voulez être précis sur un nom d'objet SQL. [domain\user123].TableName.
Remus Rusanu
40

Vous pouvez exécuter ce qui suit, 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 instructions dans l'analyseur de requêtes.

Voici un script plus ancien qui fera cela pour vous aussi, je pense en changeant le propriétaire de l'objet. Je ne l'ai pas essayé en 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 sur ce site .

Il parle également de faire de même pour les procs stockés si vous en avez besoin.

patmortech
la source
J'ai essayé le deuxième bit en vain, mais merci pour le lien, je vais l'examiner.
jonathan hall
N'avez-vous pas pu utiliser la sélection INFORMATION_SCHEMA ci-dessus pour générer automatiquement toutes vos instructions ALTER SCHEMA?
patmortech
Notez la citation suivante de la documentation de INFORMATION_SCHEMA.TABLES : " Important N'utilisez pas les vues INFORMATION_SCHEMA pour déterminer le schéma d'un objet. Le seul moyen 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.
Heinzi
21
USE MyDB;
GO
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;
GO

Réf: ALTER SCHEMA

Blé Mitch
la source
15

Déplacer la table du schéma dbo 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
Neru-J
la source
9

Je viens de poster ceci à une question similaire: dans SQL Server 2005, comment puis-je changer le "schéma" d'une table sans perdre de données?


Un léger 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 que je puisse 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

J'ai aussi dû restaurer un dbdump, et j'ai trouvé que le schéma n'était pas dbo - j'ai passé des heures à essayer d'obtenir des transferts de données de Sql Server Management Studio ou de Visual Studio pour modifier le schéma de destination ... J'ai fini par exécuter cela contre le restauré dump sur le nouveau serveur pour obtenir les choses comme je le voulais.

Lanceomagnifico
la source
Fonctionne un régal. Merci.
bgx
2

Façon de le faire pour une chose individuelle:

modifier le schéma dbo transfer jonathan.MovieData

Jon Onstott
la source
2

J'ai eu un problème similaire mais mon schéma contenait une barre oblique inverse. Dans ce cas, incluez les crochets autour du schéma.

ALTER SCHEMA dbo TRANSFER [DOMAIN\jonathan].MovieData;
Poing de Hanovre
la source
2

Ouvrez SQL Server en tant que compte SA et cliquez sur une nouvelle requête après les requêtes ci-dessous

puis cliquez sur exécuter, il restaurera tous les schémas détenus sur le compte SA

alter authorization on schema::[db_datareader] to [dbo]
alter authorization on schema::[db_datareader] to [db_datareader]
alter authorization on schema::[db_datawriter] to [dbo]
alter authorization on schema::[db_datawriter] to [db_datawriter]
alter authorization on schema::[db_securityadmin] to [dbo]
alter authorization on schema::[db_securityadmin] to [db_securityadmin]
alter authorization on schema::[db_accessadmin] to [dbo]
alter authorization on schema::[db_accessadmin] to [db_accessadmin]
alter authorization on schema::[db_backupoperator] to [dbo]
alter authorization on schema::[db_backupoperator] to [db_backupoperator]
alter authorization on schema::[db_ddladmin] to [dbo]
alter authorization on schema::[db_ddladmin] to [db_ddladmin]
alter authorization on schema::[db_owner] to [dbo]
alter authorization on schema::[db_owner] to [db_owner]
MJ X
la source
1

ms-help: //MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/0a760138-460e-410a-a3c1-d60af03bf2ed.htm

ALTER SCHEMA nom_schéma TRANSFER nom_sécurisable


la source