Blog > Septembre 2014
Introduction aux bases à relation contenant-contenu (Contained Database)


Les bases de données de type contenant-contenu, en anglais "Contained Database", sont des bases indépendantes en tout ou partie de l'instance SQL Server. Elles contiennent tous les paramètres et les métadonnées requises pour fonctionner et n'ont pas de dépendances de configuration sur l'instance du moteur de base de données sur lequel elles sont déployées. Il en existe de trois types :
  • Les bases sans relation contenant-contenu (Mode NONE dans SQL Server). Il s'agit des bases de données de base utilisées jusqu'à ce jour dans SQL Server.
  • Les bases avec relation partielle de type contenant-contenu (Mode PARTIAL dans SQL Server).
  • Les bases totalement de type contenant-contenu : cette base est complètement indépendante de l'instance. Ce mode n'est pas disponible dans SQL Server.
Le mode partiel disponible depuis SQL Server 2012 permet donc d'embarquer la sécurité. Ce qui peut être très utile lors du déplacement d'une base d'une instance à une autre, ou vers SQL Azure.
Les utilisateurs d'une base de type contenant-contenu peuvent se connecter avec :
  • L'authentification SQL Server (compte intégré à la base).
  • L'authentification Windows (compte intégré à un Active Directory).
Créer une base de type contenant-contenu en ligne de commande en 3 étapes :

1. Activer les bases de données à relation contenant-contenu au niveau de l'instance

sp_configure 'contained database authentication', 1;
GO
RECONFIGURE;
GO

2. Conversion d'une base de données normale vers une base de données à relation contenant-contenu

USE [master]
GO
ALTER DATABASE [MyDatabase] SET CONTAINMENT = PARTIAL;
GO

3. Migration des utilisateurs vers des utilisateurs de base de données à relation contenant-contenu

Il n'existe pas de méthode simple pour convertir l'ensemble des utilisateurs d'un seul coup. Il faut donc tous les convertir un à un :
DECLARE @username sysname;
DECLARE user_cursor CURSOR FOR
        SELECT dp.name
        FROM sys.database_principals AS dp
        JOIN sys.server_principals AS sp
        ON dp.sid = sp.sid
        WHERE dp.authentication_type = 1 AND sp.is_disabled = 0;
OPEN user_cursor
FETCH NEXT FROM user_cursor INTO @username
    WHILE @@FETCH_STATUS = 0
    BEGIN
        EXECUTE sp_migrate_user_to_contained
        @username = @username,
        @rename = N'keep_name',
        @disablelogin = N'disable_login';
        FETCH NEXT FROM user_cursor INTO @username
    END
CLOSE user_cursor;
DEALLOCATE user_cursor;