Nous avons actuellement plusieurs bases de données, mais nous aimerions les combiner et, au lieu de cela, séparer nos contextes de domaine à l'aide de schémas.
Dans MS SQL Server 2008 R2, comment déplacer en bloc tout le contenu d'un schéma dans un autre?
Par exemple, toutes les tables, vues, procédures, index, etc. que nous avons créées dans le dbo
schéma vivront désormais dans le foo
schéma.
EDIT: Je voulais clarifier sur la base des excellents commentaires d'AaronBertrand. Ce n'est pas une situation de location multiple. Notre situation est celle où les plugins d'outils internes ont été développés de manière isolée par des développeurs qui n'ont pas fusionné leurs tables dans la base de données de l'outil.
sql-server-2008-r2
schema
Matthieu
la source
la source
Réponses:
Le concept de base est en fait assez simple: vous générez un script à partir de
sys.objects
etsys.schemas
qui construit desALTER SCHEMA TRANSFER
instructions. Ainsi, par exemple, vous avez trois objets dans ledbo
schéma et vous souhaitez tous les déplacer vers leblat
schéma:Le code suivant:
Donnera ce script (mais peut-être pas dans cet ordre):
(Vous souhaiterez peut-être ajouter des filtres supplémentaires pour exclure les objets du
dbo
schéma que vous ne souhaitez pas déplacer, exclure certains types d'objet (par exemple, toutes vos fonctions sont des fonctions utilitaires et n'ont pas besoin de se déplacer), générez le script ordonné par type d'objet, etc.)Mais il y a quelques problèmes avec le déplacement de tous vos objets vers un nouveau schéma:
Probablement, votre code fera toujours référence à ces objets
dbo.object
- il n'y a pas de moyen facile de résoudre ce problème, sauf la force brute. Vous pouvez probablement trouver toutes les occurrences dedbo.
assez facilement, mais celles-ci peuvent également renvoyer des faux positifs, tels queEXEC dbo.sp_executesql
,dbo.
dans les commentaires, de vraies références à des objets qui restent dans ledbo.
schéma, etc.Vos dépendances seront probablement complètement hors de contrôle, mais je n'ai pas testé cela à fond. Je sais que dans ce scénario:
Les clés étrangères migrent en fait plus facilement que prévu (avec la mise en garde que je teste sur une version beaucoup plus récente que vous). Mais parce que le code fait
blat.pX
toujours référencedbo.bar
, exécutant évidemment la procédure:Va produire cette erreur:
Et les requêtes de dépendance, telles que:
Donnera cette erreur:
Et interroger la vue:
Donne ces erreurs:
Donc, cela pourrait impliquer beaucoup de nettoyage. Et après avoir corrigé toutes les références d'objet, vous souhaiterez probablement recompiler tous les modules et actualiser toutes les vues dans le nouveau schéma. Vous pouvez générer un script pour cela assez similaire à l'exemple ci-dessus.
la source