Der Hauptzweck der enthaltenen Datenbanken besteht darin, das Portieren Ihrer Datenbank auf einen neuen Server zu vereinfachen, ohne dass viel Gerüst um sie herum entsteht. In diesem Sinne werde ich einige potenzielle Probleme behandeln, die diese Migration erschweren. Die meisten betreffen die Tatsache, dass enthaltene Datenbanken in SQL Server 2012 nur teilweise enthalten sind (die Eindämmung wird tatsächlich nicht erzwungen).
Verbindungszeichenfolgen
Verbindungszeichenfolgen zu einer enthaltenen Datenbank müssen die Datenbank explizit in der Verbindungszeichenfolge angeben. Sie können sich nicht mehr auf die Standarddatenbank des Logins verlassen, um eine Verbindung herzustellen. Wenn Sie keine Datenbank angeben, durchsucht SQL Server nicht alle enthaltenen Datenbanken und versucht, eine Datenbank zu finden, in der Ihre Anmeldeinformationen möglicherweise übereinstimmen.
Datenbankübergreifende Abfragen
Selbst wenn Sie denselben Benutzer mit demselben Kennwort in zwei verschiedenen enthaltenen Datenbanken auf demselben Server erstellen, kann Ihre Anwendung keine datenbankübergreifenden Abfragen durchführen. Die Benutzernamen und Kennwörter sind möglicherweise identisch, sie sind jedoch nicht derselbe Benutzer. Der Grund hierfür? Wenn Sie Datenbanken auf einem gehosteten Server enthalten haben, sollte nicht verhindert werden, dass Sie denselben Benutzer wie jemand anderen haben, der zufällig denselben gehosteten Server verwendet. Wenn vollständige Eingrenzung eintrifft (wahrscheinlich in der Version nach SQL Server 2012 nie), datenbankübergreifende Abfragen sind auf jeden Fall untersagt. Ich empfehle nachdrücklich, dass Sie keine Anmeldungen auf Serverebene mit demselben Namen wie Benutzer enthaltener Datenbanken erstellen und versuchen, die Erstellung desselben enthaltenen Benutzernamens in allen enthaltenen Datenbanken zu vermeiden. Wenn Sie Abfragen ausführen müssen, die mehrere enthaltene Datenbanken betreffen, verwenden Sie dazu eine Anmeldung auf Serverebene mit entsprechenden Berechtigungen (dies ist möglicherweise der Fall sysadmin
, bei schreibgeschützten Abfragen ist dies jedoch CONNECT ANY DATABASE
und SELECT ALL USER SECURABLES
).
Synonyme
Die meisten 3- und 4-teiligen Namen sind leicht zu identifizieren und erscheinen in einer DMV. Wenn Sie jedoch ein Synonym erstellen, das auf einen 3- oder 4-teiligen Namen verweist, werden diese in der DMV nicht angezeigt. Wenn Sie also häufig Synonyme verwenden, können einige externe Abhängigkeiten übersehen werden. Dies kann zu Problemen führen, wenn Sie die Datenbank auf einen anderen Server migrieren. Ich habe mich über dieses Problem beschwert, es wurde jedoch als "beabsichtigt" geschlossen und hat die Migration auf das neue Feedback-System nicht überstanden . Beachten Sie, dass in der DMV auch 3- und 4-teilige Namen fehlen, die über dynamisches SQL erstellt wurden.
Kennwortrichtlinie
Wenn Sie einen enthaltenen Datenbankbenutzer auf einem System ohne Kennwortrichtlinie erstellt haben, kann es schwierig sein, denselben Benutzer auf einem anderen System zu erstellen, auf dem eine Kennwortrichtlinie vorhanden ist. Dies liegt daran, dass die CREATE USER
Syntax das Umgehen der Kennwortrichtlinie nicht unterstützt. Ich habe einen Fehler zu diesem Problem gemeldet, der weiterhin besteht (und den Umzug nach dem Rücktritt von Connect auch nicht überstanden hat). Mir kommt es merkwürdig vor, dass Sie auf einem System mit einer vorhandenen Kennwortrichtlinie eine Anmeldung auf Serverebene erstellen können, die die Richtlinie leicht umgeht. Sie können jedoch keinen Datenbankbenutzer erstellen, der dies tut - obwohl dieser Benutzer von Natur aus ein Benutzer ist weniger ein Sicherheitsrisiko.
Kollation
Da wir nicht mehr auf die Zusammenstellung von tempdb verlassen können, müssen Sie einen Code ändern , dass derzeit explizite Sortierung oder verwendet DATABASE_DEFAULT
zu verwenden , CATALOG_DEFAULT
statt. In diesem BOL-Artikel finden Sie einige mögliche Probleme .
IntelliSense
Wenn Sie als ein enthaltener Benutzer eine Verbindung zu einer enthaltenen Datenbank herstellen, wird IntelliSense von SSMS nicht vollständig unterstützt. Sie erhalten grundlegende Informationen zu Syntaxfehlern, aber keine automatisch vervollständigten Listen oder QuickInfos und all das, was Spaß macht. Ich habe einen Fehler zu diesem Problem gemeldet, der offen bleibt - und einer, der den Umzug nicht überstanden hat.
SQL Server-Datentools
Wenn Sie vorhaben, SSDT für die Datenbankentwicklung zu verwenden, werden enthaltene Datenbanken derzeit nicht vollständig unterstützt. Was wirklich nur bedeutet, dass das Erstellen des Projekts nicht fehlschlägt, wenn Sie eine Funktion oder Syntax verwenden, die die Eindämmung aufhebt, da SSDT derzeit nicht weiß, was Eindämmung ist und was sie möglicherweise aufhebt.
ALTER DATABASE
Wenn Sie einen ALTER DATABASE
Befehl aus dem Kontext einer enthaltenen Datenbank ausführen, müssen ALTER DATABASE foo
Sie stattdessen r verwenden. ALTER DATABASE CURRENT
Dies bedeutet, dass diese Befehle beim Verschieben , Umbenennen usw. nichts über den externen Kontext oder die Referenz wissen müssen .
Ein paar andere
Einige Dinge, die Sie wahrscheinlich noch nicht verwenden sollten, sollten jedoch in der Liste der Dinge erwähnt werden, die nicht unterstützt werden oder veraltet sind und nicht in enthaltenen Datenbanken verwendet werden sollten:
- nummerierte Prozeduren
- vorübergehende Verfahren
- Sortierungsänderungen in gebundenen Objekten
- Datenerfassung ändern
- Änderungsverfolgung
- Replikation
Dies sind jedoch nicht unbedingt Nachteile bei der Verwendung der enthaltenen Datenbanken, sondern lediglich Probleme, die Sie kennen sollten, und die nicht alle ausdrücklich in der offiziellen Dokumentation aufgeführt sind.
Sie müssen auch sicherstellen, dass für alle potenziellen Zielserver die sp_configure
Option contained database authentication
1 festgelegt ist, wenn eine enthaltene Datenbank migriert wird, Teil einer Verfügbarkeitsgruppe ist oder gespiegelt wird .
Sie können feststellen , diese Blog - Post nützlich, aber auch diese ein , auch wenn sie im Voraus Datum RTM.