SQL Server Denali : Groupes Windows et schémas

On continue dans les nouveautés de la prochaine version de SQL Server … Il est maintenant possible d’affecter à un groupe Windows un schéma par défaut. De plus, la création d’un objet sans précision de schéma par un utilisateur Windows qui fait parti d’un groupe Windows ne donne plus lieu à la création d’un schéma. L’objet concerné est créé dans le schéma par du groupe Windows concerné.


Pour bien comprendre l’avantage que peut apporter cette nouveauté, je prendrais une situation que j’ai rencontré (et très certainement d’autres DBA). Plantons le décor : un serveur de développement sur lequel nous devons pouvoir octroyer certains privilèges sur une base de données pour une équipe de développeurs. La gestion de ces utilisateurs dans l’active directory est basé sur les groupes Windows. Cette équipe de développeur appartient donc à un groupe active directory précis. Sur notre serveur de bases de données nous allons donc donner les privilèges nécessaires au groupe Windows concerné (et non pas individuellement à chaque membre de notre équipe de développement). Jusqu’ici une gestion plutôt intelligente. Avant SQL Server Denali nous étions confronté à un souci majeur : lorsqu’un membre d’un groupe Windows créait un objet et que celui-ci ne précisait pas le schéma dans lequel devait se trouver cet objet alors un schéma portant le nom de l’utilisateur était automatiquement créé. L’objet était ensuite affecté à ce nouveau schéma.

On pouvait donc se retrouver avec la situation suivante :

image

image

L’utilisateur WKSDBN01\dev fait parti du groupe Windows WKSDBN01\Group Dev. Ce dernier fait parti des rôles de bases de données db_datareader, db_datawriter et db_ddladmin.

Le script utilisé pour créé la table DEV_1 est le suivant :

CREATE TABLE dbo.DEV_1
(
id INT
);

CREATE TABLE DEV_1
(
id INT
);

La première instruction créé explicitement la table DEV_1 dans le schéma dbo alors que la deuxième ne précise pas le schéma. Cette deuxième instruction donne donc lieu à un nouveau schéma WKSDBN01\dev dans lequel se trouve la table DEV_1. En prime on peut noter la création d’un utilisateur désactivé WKSDBN01\dev. Autant dire que dans ce cas on peut vite se retrouver avec des schémas supplémentaires et inutiles venant polluer notre base de données … un oubli de schéma devant un objet est si vite oublié :-)

Avec SQL Server Code Denali les choses deviennent différentes. On peut commencer par affecter au groupe Windows TESTLLAB2\Group Dev un schéma par défaut. Dans notre cas nous pourrons mettre le schéma dbo (ici j’ai pris un groupe de domaine différent mais cela n’a pas d’importance ici).

USE master;
GO

CREATE LOGIN [TESTLLAB2\Group Dev]
FROM WINDOWS;

USE DEV;
GO

CREATE USER  [TESTLLAB2\Group Dev]
FROM LOGIN  [TESTLLAB2\Group Dev]
WITH DEFAULT_SCHEMA = dbo;

On donne les privilèges adéquates à notre utilisateur de bases de données :

ALTER ROLE db_datareader
ADD MEMBER [TESTLLAB2\Group Dev];

ALTER ROLE db_datawriter
ADD MEMBER [TESTLLAB2\Group Dev];

ALTER ROLE db_ddladmin
ADD MEMBER [TESTLLAB2\Group Dev];

Si nous relançons le script de création de la table DEV_1 avec l’utilisateur TESTLLAB2\dev qui fait parti du groupe TESTLLAB2\Group Dev nous obtenons le message d’erreur suivant pour la 2ème partie du script :

Msg 2714, Level 16, State 6, Line 1
There is already an object named ‘DEV_1′ in the database.

Le schéma par défaut utilisé est celui du groupe Windows auquel appartient l’utilisateur TESTLLAB2\dev. C’est la raison pour laquelle nous obtenons le message d’erreur. On peut pas créer un objet de même nom dans le même schéma !!!

David BARBARIN (Mikedavem)
MVP SQL Server

Laisser un commentaire