2010-04-28 48 views
15

Estoy tratando de comprender mejor por qué uno de nuestros scripts de actualización de base de datos no funcionó correctamente en un sitio de cliente en particular, y lo reduje (creo) a la propiedad de la base de datos y los roles.¿Cuál es la diferencia entre "db_owner" y "el usuario que posee la base de datos" en SQL Server 2000?

responsabilidad: realidad estoy esperando volver a escuchar de DBA del cliente por lo que nos pueden decir si mejoraran su base de datos SQL recientemente y por lo que podemos ver en su base de datos. Estoy pensando que una conversión de SQL 2000 a SQL 2005 podría haber rociado nuestras secuencias de comandos si el inicio de sesión de la base de datos de nuestras aplicaciones se hubiera convertido en un esquema, porque nos referíamos a dbo en algunos lugares del script de actualización.

De todos modos, he estado tratando de encontrar una mejor explicación de la propiedad de la base de datos y las funciones y cómo afecta lo que el propietario de un objeto de base de datos se asigna realmente cuando no se especifica explícitamente el propietario en un comunicado de T-SQL . Por ejemplo, nuestras secuencias de comandos de actualización normalmente solo hacen CREATE TABLE foo en lugar de CREATE TABLE dbo.foo o alguna otra cosa, pero encontré algunas que estaban explícitamente usando dbo, y esas son las que causan problemas en este momento (solo para este cliente).

Encontré this article (específico para SQL Server 2000), pero la tabla en esa página es confusa. Menciona db_owner y "posee la base de datos" como dos posibilidades distintas para el rol que puede tener un usuario.

Por ejemplo, la tabla indica que si un usuario sam, que está en el papel db_owner, ejecuta la consulta CREATE TABLE [test3](abc int), que será propiedad de sam.

A continuación, menciona que si un otro usuario sue, que "posee la base de datos" (sic), se ejecuta la misma consulta, que será propiedad de dbo.

¿No sería db_owner y "posee la base de datos" lo mismo? La tabla implica que existe una diferencia entre "estar en el rol db_owner" y "ser el propietario de la base de datos". Pero, si eso es cierto, ¿qué significa "poseer la base de datos" si se trata de algo más que ser miembro de la función db_owner?

Respuesta

26

No, db_owner y el propietario de la base de datos no son lo mismo. dbo es un usuario y db_owner es un rol de base de datos. Las bases de datos son propiedad de inicios de sesión. Cualquier inicio de sesión que posea la base de datos tiene un alias como dbo dentro de la base de datos. Puede cambiar el propietario de la base de datos utilizando el procedimiento almacenado del sistema sp_changedbowner.

Todos los objetos en una base de datos son propiedad de un usuario. Los usuarios que son miembros de la función db_owner, entre otros permisos, pueden crear objetos propiedad de dbo. Si un usuario no es miembro de db_owner, pero tiene algunos permisos de creación (por ejemplo, Crear tabla), todos los objetos que creen serán propiedad del usuario que los creó. Puede cambiar la propiedad de un objeto usando el procedimiento almacenado del sistema sp_changeobjectowner.

+0

Claro y al grano. ¡Respuesta impresionante! Para cualquiera que lea esto, me gustaría agregar una cosa más que encontré a través de más investigación y algunas pruebas. Si el inicio de sesión de la base de datos es un miembro de la función de servidor 'sysadmin', los objetos de base de datos creados por ese inicio de sesión serán propiedad de' dbo', y (para SQL Server 2005), también se agregarán al esquema 'dbo' de forma predeterminada. a menos que especifique un propietario/esquema diferente. –

+1

Por cierto, creo que sé cuál era el problema ahora. Normalmente le damos a los clientes una base de datos vacía que adjuntan a su SQL Server cuando instalan la aplicación. Todos los objetos son propiedad de 'dbo'.También tenemos un script que crea el inicio de sesión de la base de datos utilizado por nuestra aplicación. Resultó que este script estaba agregando el inicio de sesión de la aplicación al rol del servidor 'sysadmin' (no tenía idea de por qué estaba escrito de esa manera). Supongo que un DBA diligente vio esto y eliminó nuestro inicio de sesión del rol 'sysadmin', ya que tienen más de una base de datos en su servidor y nuestra aplicación claramente no debería ser' sysadmin' –

+1

Nuestro script tampoco mapeó el iniciar sesión en un usuario de la base de datos. La aplicación funciona bien a pesar de esto, ya que el inicio de sesión se crea como un 'sysadmin'. Sin embargo, si un DBA elimina el inicio de sesión del rol 'sysadmin', tendrían que asignar el inicio de sesión a un usuario de base de datos específico en nuestra base de datos para que nuestra aplicación se pueda conectar. Cuando lo hicieron, configuraron el esquema predeterminado del usuario para que sea el mismo que el nombre de usuario. Nuestro script de actualización cayó y recreó algunas vistas de la base de datos, pero no estábamos prefijando los nombres de vista con un propietario/esquema, por lo que se estaban agregando al esquema del usuario de la base de datos en lugar del esquema 'dbo'. –

Cuestiones relacionadas