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

14

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 dboschéma explicitement spécifié avant le nom. Cela a abouti domain\cowork_id.table_name_hereà la création d' une table appelée table. 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 dboquand cela n'est pas spécifié?

steenbergh
la source
2
sqlblog.org/2009/10/11/…
Aaron Bertrand

Réponses:

26

En règle générale, vous devez spécifier explicitement ledbo schéma 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 le schéma dbo lors de la création d'objets. Mais pour les autres utilisateurs (Windows), ce n'est pas pareil.

Vos utilisateurs en sont membres Windows groupet n'ont 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'objets en deux ou trois parties.

Pour résoudre le problème, attribuez simplement le dboschéma default schemaà tous vos groupes utilisateurs-Windows ou écrivez le schéma de manière explicite lors de la création d'objets. Toujours.

sepupic
la source