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 dbo
sché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 dbo
quand cela n'est pas spécifié?
la source
Réponses:
En règle générale, vous devez spécifier explicitement le
dbo
schéma si vous souhaitez créer l'objet dans ce schéma.Comme vous êtes
db_owner
, votre schéma par défaut estdbo
, 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 group
et 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)Pour résoudre le problème, attribuez simplement le
dbo
schémadefault schema
à tous vos groupes utilisateurs-Windows ou écrivez le schéma de manière explicite lors de la création d'objets. Toujours.la source