Iedereen die regelmatig met databases werkt heeft het wel eens meegemaakt. Je verplaatst je database van de ene naar de andere server en vervolgens werkt het geheel niet meer. De database user is niet meer gekoppeld aan de database login. Maar er is nu een oplossing! SQL Server 2012 introduceert namelijk 'Contained databases' waarmee de database niet (of minder) afhankelijk is van Server objecten zoals de logins.

Iedereen die regelmatig met databases werkt heeft het wel eens meegemaakt. Je verplaatst je database van de ene naar de andere server en vervolgens werkt het geheel niet meer. De database user is niet meer gekoppeld aan de database login. Maar er is nu een oplossing! SQL Server 2012 introduceert namelijk 'Contained databases' waarmee de database niet (of minder) afhankelijk is van Server objecten zoals de logins.
Logins en Users
In het kort: om met een SQL server te kunnen verbinden heb je een Login nodig. Dit is een SQL-Login met een username en een password of een Windows-Login waarbij  de credentials van de gebruiker al door Windows zijn gecontroleerd.
Ben je binnen bij de Server, dan zal je voor de verschillende databases op de server nog een User moeten aanmaken. De rechten van deze user bepalen je rechten op database-niveau, ofwel; wat mag je op de betreffende database. De user is gekoppeld aan een bepaalde login. Er kunnen ook users van verschillende databases gekopeld zijn met 1 login. Voorbeeld: Pietje connect naar een SQL Server met login 'Pietje' en password '1234'. Hij ziet vervolgens alle databases in Management Studio, maar of hij ook in de database kan werken is afhankelijk van de database-users die aan de login van Pietje zijn gekoppeld. En dan uiteraard met de juiste rechten voor deze users.
Waar gaat het fout?
Zodra je een back-up van een database maakt zitten daar alle database objecten in. Dus ook de Users. Als je een restore uitvoert van de database op een andere server, dan zijn de users nog gewoon intact. Met de logins op de betreffende server is ook niets gebeurd, maar de koppeling tussen beide is nu verbroken. Dit komt omdat de Security ID (SID) van de login naar alle waarschijnlijkheid een andere is dan de SID van de login op de orginele server. Dit noemen we een 'Orphaned User'. Door middel van een Stored procedure 'sp_change_users_login' kun je dit wel weer corrigeren, maar voorkomen was handiger geweest. SQL Server 2012 heeft daar nu dus eindelijk een oplossing voor!
Contained Databases
Bij Contained databases is het de bedoeling dat de database niet langer afhankelijk is van Server-Objecten zoals logins. In SQL 2012 kunnen we 'Partialy contained' databases maken. 'Fully contained' databases worden nog niet ondersteund. Het gebruik van Contained databases kunnen we als volgt instellen.
Allereerst zal de server ingesteld moeten worden.
SQL Server 2012 Orphaned Users
Vervolgens moet de 'Containment Type' van de database gezet worden naar 'Partial'. In dit geval creëren we een nieuwe database. Bij de tab 'Options' kunnen we deze keuze aangeven.
SQL Server 2012 Orphaned Users
Uiteraard moeten we nog wel geauthenticeerd worden voordat we met een database mogen werken, maar dit wordt nu onderdeel van een 'Contained User'. De User bevat in dat geval dus de Windows- of SQL-Authenticatie gegevens.
Als we een nieuwe user aanmaken in de database kunnen we bijvoorbeeld kiezen voor een 'SQL user with password'.
SQL Server 2012 Orphaned Users
Wanneer we nu een connectie gaan leggen met de database, gaat ook dat op een iets andere manier dan dat we gewend zijn. We gebruiken immers geen Login meer, daarvoor is er een extra mogelijkheid toegevoegd in het connection venster.
SQL Server 2012 Orphaned Users
In dit scherm geven we aan dat we naar een contained database willen connecten en vervolgens werkt het zoals gebruikelijk.
SQL Server 2012 Orphaned Users
De gebruiker kan logischerwijs geen gebruik maken van de server resources, maar enkel van de database. Ook de andere databases zijn niet meer zichtbaar.
SQL Server 2012 Orphaned Users
Partial Contained databases zijn dus de eerste stap. Maar wel direct een grote stap omdat het een veelvoorkomend probleem oplost. Zie voor meer informatie over dit onderwerp de pagina's van  MSDN: http://msdn.microsoft.com/en-us/library/ff929071(v=sql.110).aspx