L'objectif principal des bases de données contenues est de faciliter le portage de votre base de données sur un nouveau serveur sans beaucoup d'échafaudage. Dans cet esprit, je traiterai quelques problèmes potentiels qui rendront cette migration plus difficile - et la plupart tournent autour du fait que les bases de données contenues ne sont que partiellement contenues dans SQL Server 2012 (le confinement n'est pas réellement appliqué).
Chaînes de connexion
Les chaînes de connexion à une base de données contenue doivent spécifier explicitement la base de données dans la chaîne de connexion. Vous ne pouvez plus compter sur la base de données par défaut du login pour établir une connexion. Si vous ne spécifiez pas de base de données, SQL Server ne va pas parcourir toutes les bases de données contenues et essayer de trouver une base de données où vos informations d'identification peuvent correspondre.
Requêtes Cross-db
Même si vous créez le même utilisateur avec le même mot de passe dans deux bases de données contenues différentes sur le même serveur, votre application ne pourra pas effectuer de requêtes sur plusieurs bases de données. Les noms d'utilisateur et mots de passe peuvent être les mêmes, mais ils ne sont pas le même utilisateur. La raison de cela? Si vous avez contenu des bases de données sur un serveur hébergé, vous ne devriez pas être empêché d'avoir le même utilisateur contenu qu'une personne qui utilise le même serveur hébergé. Lorsque le confinement complet arrive (probablement dans la version postérieure à SQL Server 2012, jamais), les requêtes entre bases de données seront de toute façon interdites. Je vous recommande vivement de ne pas créer de connexions au niveau du serveur avec le même nom que les utilisateurs de bases de données contenues et d'éviter de créer le même nom d'utilisateur contenu dans des bases de données contenues. Si vous devez exécuter des requêtes qui touchent plusieurs bases de données contenues, utilisez un login au niveau du serveur disposant des privilèges appropriés (vous pouvez penser que c'est le cas sysadmin
, mais pour les requêtes en lecture seule, il s'agit de CONNECT ANY DATABASE
et SELECT ALL USER SECURABLES
).
Synonymes
La plupart des noms en 3 et 4 parties sont faciles à identifier et apparaissent dans un fichier DMV. Toutefois, si vous créez un synonyme qui pointe vers un nom en 3 ou 4 parties, celles-ci n'apparaissent pas dans le fichier DMV. Par conséquent, si vous utilisez beaucoup de synonymes, il est possible que vous manquiez certaines dépendances externes, ce qui peut entraîner des problèmes au point de migrer la base de données sur un autre serveur. Je me suis plaint de ce problème, mais celui-ci a été fermé "de manière intentionnelle" et n'a pas survécu à la migration vers le nouveau système de retour d'informations . Notez que le DMV manquera également des noms en 3 et 4 parties construits via SQL dynamique.
Politique de mot de passe
Si vous avez créé un utilisateur de base de données contenu sur un système sans stratégie de mot de passe, il peut être difficile de créer le même utilisateur sur un système différent disposant d'une stratégie de mot de passe. En effet, la CREATE USER
syntaxe ne prend pas en charge le contournement de la stratégie de mot de passe. J'ai déposé un bogue à propos de ce problème et il reste ouvert (et il n'a pas non plus survécu au déménagement lorsque Connect a pris sa retraite). Et il me semble étrange que sur un système avec une stratégie de mot de passe en place, vous pouvez créer une connexion au niveau du serveur qui contourne facilement la stratégie, mais vous ne pouvez pas créer un utilisateur de base de données qui le fasse, même si cet utilisateur est intrinsèquement moins d'un risque de sécurité.
Collation
Comme nous ne pouvons plus compter sur le classement de tempdb, vous devrez peut-être modifier le code qui utilise actuellement le classement explicite ou l' DATABASE_DEFAULT
utiliser à la CATALOG_DEFAULT
place. Voir cet article BOL pour des problèmes potentiels .
IntelliSense
Si vous vous connectez à une base de données contenue en tant qu'utilisateur confiné, SSMS ne prendra pas totalement en charge IntelliSense. Vous obtiendrez des soulignements de base pour les erreurs de syntaxe, mais pas de listes à remplissage automatique ni d'infobulles et tout ce qui est amusant. J'ai déposé un bogue à propos de ce problème et il reste ouvert - et un autre qui n'a pas survécu au déménagement.
Outils de données SQL Server
Si vous prévoyez d'utiliser SSDT pour le développement de bases de données, la prise en charge complète des bases de données contenues n'est actuellement pas prise en charge. Ce qui signifie simplement que la construction du projet n'échouera pas si vous utilisez une fonctionnalité ou une syntaxe qui casse le confinement, car SSDT ne sait actuellement pas ce qu'est le confinement et ce qui pourrait le rompre.
ALTER DATABASE
Lorsque vous exécutez une ALTER DATABASE
commande à partir du contexte d'une base de données contenue, ALTER DATABASE foo
vous devez plutôt utiliser ALTER DATABASE CURRENT
ce qui est nécessaire . Ainsi, si la base de données est déplacée, renommée, etc., ces commandes n'ont pas besoin de connaître leur contexte externe ou leur référence. .
Quelques autres
Certaines choses que vous ne devriez probablement pas utiliser, mais qui devraient néanmoins être mentionnées dans la liste des choses qui ne sont pas prises en charge ou qui sont déconseillées et qui ne devraient pas être utilisées dans des bases de données contenues:
- procédures numérotées
- procédures temporaires
- changements de classement dans les objets liés
- changer la capture de données
- suivi des modifications
- réplication
Cela dit, l' utilisation de bases de données contenues ne présente pas nécessairement des inconvénients , il s'agit simplement de problèmes que vous devez connaître et qui ne sont pas tous explicitement divulgués dans la documentation officielle.
Vous devez également vous assurer que, si une base de données contenue doit être migrée, ou fait partie d'un groupe de disponibilité ou est mise en miroir, que l' sp_configure
option contained database authentication
sur 1 est configurée sur tous les serveurs de destination potentiels .
Vous trouverez peut-être cet article utile, ainsi que celui-ci , bien qu'ils soient antérieurs à RTM.