J'ai importé un tas de tables d'un ancien serveur SQL (2000) dans ma base de données 2008. Toutes les tables importées sont précédées de mon nom d'utilisateur, par exemple: jonathan.MovieData
. Dans la table properties
, il répertorie jonathan
comme 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 prête à confusion.
Comment puis-je changer toutes mes tables pour être dbo au lieu de Jonathan?
Résultat actuel: jonathan.MovieData
Résultat désiré: dbo.MovieData
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;
Voir ALTER SCHEMA .
Syntaxe généralisée:
ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;
Vous pouvez exécuter ce qui suit pour générer 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 le fera pour vous aussi, je pense en changeant le propriétaire de l'objet. Je n'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 eu de ce site .
Il est également question de faire la même chose pour les processus stockés si vous en avez besoin.
USE MyDB;
GO
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;
GO
Réf.: ALTER SCHEMA
Déplacer la table du schéma dbo vers MySchema:
ALTER SCHEMA MySchema TRANSFER dbo.MyTable
Déplacez la table de MySchema vers le schéma dbo:
ALTER SCHEMA dbo TRANSFER MySchema.MyTable
Je viens de poster ceci à une question similaire: Dans SQL Server 2005, comment puis-je changer le "schéma" d'une table sans perdre aucune donnée?
Une légère amélioration à l'excellente réponse de sAeid ...
J'ai ajouté un exec pour que ce code soit auto-exécuté, et j'ai ajouté une union en haut afin de 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
J'ai moi aussi dû restaurer un dbdump et constaté que le schéma n'était pas dbo. J'avais passé des heures à essayer d'obtenir des transferts de données de studio de gestion SQL ou Visual Studio pour modifier le schéma de destination ... J'ai fini par l'exécuter contre le fichier restauré. dump sur le nouveau serveur pour obtenir les choses que je voulais.
Vous pouvez modifier par lots les schémas de plusieurs objets de base de données comme décrit dans cet article:
Comment changer le schéma de toutes les tables, vues et procédures stockées dans MSSQL
Manière de le faire pour une chose individuelle:
modifier le schéma dbo transfer jonathan.MovieData
J'ai eu un problème similaire, mais mon schéma comportait une barre oblique inverse. Dans ce cas, incluez les crochets autour du schéma.
ALTER SCHEMA dbo TRANSFER [DOMAIN\jonathan].MovieData;
Ouvrez le serveur SQL en tant que SA compte et cliquez sur la nouvelle requête après les requêtes sur les connexions
en cliquant sur Exécuter, tous les schémas possédés reviendront à SA compte
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]