web-dev-qa-db-fra.com

Comment mon collègue a-t-il obtenu son propre schéma?

J'ai une procédure stockée qui:

  • vérifie si une table existe et si oui, la supprime.
  • crée à nouveau cette table
  • remplit ensuite ce tableau avec environ 30 requêtes.

Lorsque je (propriétaire de la base de données) exécute ce processus, tout fonctionne comme prévu. Lorsque mon collègue le fait, qui dispose des droits DROP/CREATE sur cette base de données via un rôle dans Active Directory, plusieurs choses tournent mal. Ce qui me dérange, c'est ceci:

La création de la table n'avait pas le schéma dbo explicitement spécifié avant le nom. Cela a abouti à une table appelée domain\cowork_id.table_name_here table à créer. En plus de cette table créée dans son schéma personnel, il a également ce schéma dans la base de données (il n'existait pas avant d'exécuter le proc).

Qu'est-il arrivé? Pourquoi SQL Server crée-t-il des tables dans les schémas de l'utilisateur plutôt que dans dbo alors que cela n'est pas spécifié?

14
steenbergh

En règle générale, vous devez explicitement spécifier le schéma dbo si vous souhaitez créer l'objet dans ce schéma.

Comme vous êtes db_owner, votre schéma par défaut est dbo, donc il n'y a aucun problème lorsque vous ne spécifiez pas de schéma dbo lors de la création d'objets. Mais pour les autres utilisateurs (Windows), ce n'est pas la même chose.

Vos utilisateurs sont membres de Windows group qui n'a pas de schéma par défaut. Dans ce cas, l'utilisateur correspondant et le schéma sont créés lorsque l'utilisateur crée un objet, c'est documenté ici: CREATE SCHEMA (Transact-SQL)

Schéma implicite et création d'utilisateurs

Dans certains cas, un utilisateur peut utiliser une base de données sans avoir de compte d'utilisateur de base de données (un principal de base de données dans la base de données). Cela peut se produire dans les situations suivantes:

Une connexion dispose des privilèges CONTROL SERVER.

Un utilisateur Windows n'a pas de compte d'utilisateur de base de données individuel (un principal de base de données dans la base de données), mais accède à une base de données en tant que membre d'un groupe Windows qui possède un compte d'utilisateur de base de données (un principal de base de données pour le groupe Windows).

Lorsqu'un utilisateur sans compte d'utilisateur de base de données crée un objet sans spécifier de schéma existant, un principal de base de données et un schéma par défaut sont automatiquement créés dans la base de données pour cet utilisateur. Le principal et le schéma de base de données créés auront le même nom que le nom utilisé par l'utilisateur lors de la connexion à SQL Server (le nom de connexion d'authentification SQL Server ou le nom d'utilisateur Windows).

Ce comportement est nécessaire pour permettre aux utilisateurs basés sur des groupes Windows de créer et de posséder des objets. Cependant, cela peut entraîner la création involontaire de schémas et d'utilisateurs. Pour éviter de créer implicitement des utilisateurs et des schémas, dans la mesure du possible, créez explicitement des principaux de base de données et attribuez un schéma par défaut. Ou indiquez explicitement un schéma existant lors de la création d'objets dans une base de données, en utilisant des noms d'objet en deux ou trois parties.

Pour résoudre le problème, affectez simplement le schéma dbo en tant que default schema à tous vos utilisateurs-groupes Windows ou écrivez le schéma explicitement lors de la création d'objets. Toujours.

26
sepupic