Tengo un procedimiento almacenado que:
- comprueba si existe una tabla y, de ser así, la descarta.
- crea esa tabla de nuevo
- luego llena esa tabla con aproximadamente 30 consultas.
Cuando yo (propietario del DB) ejecuto este proceso, todo funciona según lo previsto. Cuando mi compañero de trabajo lo hace, que tiene derechos DROP / CREATE en esta base de datos a través de un rol en Active Directory, varias cosas salen mal. Lo que me sorprende es esto:
La creación de la tabla no tenía el dbo
esquema explícitamente especificado antes del nombre. Esto dio como resultado una tabla llamada domain\cowork_id.table_name_here
tabla a crear. Además de crear esa tabla en su esquema personal, ahora también tiene ese esquema en la base de datos (no existía antes de ejecutar el proceso).
¿Que pasó? ¿Por qué SQL Server crea tablas en los esquemas del usuario en lugar de dbo
cuando no se especifica?
sql-server
sql-server-2016
Steenbergh
fuente
fuente
Respuestas:
Como regla general, debe especificar explícitamente el
dbo
esquema si desea crear el objeto en este esquema.Tal como está
db_owner
, su esquema predeterminado esdbo
, por lo que no hay ningún problema cuando no especifica el esquema dbo al crear objetos. Pero para otros usuarios (Windows) no es lo mismo.Sus usuarios son miembros
Windows group
que no tienen un esquema predeterminado. En este caso, el usuario correspondiente y el esquema se crean cuando el usuario crea cualquier objeto, se documenta aquí: CREATE SCHEMA (Transact-SQL)Para resolver el problema, simplemente asigne un
dbo
esquemadefault schema
a todos sus grupos de usuarios-Windows o escriba el esquema explícitamente al crear objetos. Siempre.fuente