¿Cómo consiguió mi colega su propio esquema?

14

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 dboesquema explícitamente especificado antes del nombre. Esto dio como resultado una tabla llamada domain\cowork_id.table_name_heretabla 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 dbocuando no se especifica?

Steenbergh
fuente
2
sqlblog.org/2009/10/11/…
Aaron Bertrand

Respuestas:

26

Como regla general, debe especificar explícitamente eldbo esquema si desea crear el objeto en este esquema.

Tal como está db_owner, su esquema predeterminado es dbo, 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 groupque 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)

Esquema implícito y creación de usuarios

En algunos casos, un usuario puede usar una base de datos sin tener una cuenta de usuario de la base de datos (un principal de la base de datos en la base de datos). Esto puede suceder en las siguientes situaciones:

Un inicio de sesión tiene privilegios de SERVIDOR DE CONTROL.

Un usuario de Windows no tiene una cuenta de usuario de base de datos individual (un principal de base de datos en la base de datos), pero accede a una base de datos como miembro de un grupo de Windows que tiene una cuenta de usuario de base de datos (un principal de base de datos para el grupo de Windows).

Cuando un usuario sin una cuenta de usuario de base de datos crea un objeto sin especificar un esquema existente, se creará automáticamente un esquema principal y predeterminado de la base de datos en la base de datos para ese usuario. El principal y el esquema de la base de datos creada tendrán el mismo nombre que el usuario que usó al conectarse a SQL Server (el nombre de inicio de sesión de autenticación de SQL Server o el nombre de usuario de Windows).

Este comportamiento es necesario para permitir a los usuarios que se basan en grupos de Windows crear y poseer objetos. Sin embargo, puede dar lugar a la creación involuntaria de esquemas y usuarios. Para evitar la creación implícita de usuarios y esquemas, siempre que sea posible, cree explícitamente los principales de la base de datos y asigne un esquema predeterminado. O indique explícitamente un esquema existente al crear objetos en una base de datos, utilizando nombres de objetos de dos o tres partes.

Para resolver el problema, simplemente asigne un dboesquema default schemaa todos sus grupos de usuarios-Windows o escriba el esquema explícitamente al crear objetos. Siempre.

sepupic
fuente