En Microsoft SQL Server, ¿cuál es la diferencia entre los permisos CREATE DATABASE
y CREATE ANY DATABASE
?
No puedo encontrar una respuesta autorizada. Lo mejor que puedo inferir es que (a) CREATE ANY
implica que puedo crear la base de datos para que sea propiedad de otro usuario, mientras que con CREATE
no puedo, o (b) el permiso original en los primeros días de Sybase / SQL Server era CREATE ANY
y CREATE
tiene un alias para Conformidad ANSI.
sql-server
permissions
Tohuw
fuente
fuente
Respuestas:
Creo que he encontrado la respuesta autorizada, ayudada en gran medida por la tabla proporcionada en este artículo: http://msdn.microsoft.com/en-us/library/ms178569.aspx . Parece que CREATE DATABASE es de hecho el permiso ANSI SQL, mientras que CREATE CUALQUIER BASE DE DATOS es un permiso de servidor propietario de MSSQL. Sin embargo, los dos no son lo mismo. De hecho, hay una distinción bastante importante entre los dos, y lo descubrí al intentarlo.
Ambos son permisos, pero CREATE DATABASE solo consulta el contexto de seguridad de la base de datos utilizada actualmente, mientras que CREATE CUALQUIER BASE DE DATOS puede buscar la lista de inicios de sesión en SQL Server. Esto parece implementarse porque la expectativa general para un servidor ANSI SQL es que los permisos se otorgan en alguna base de datos del sistema principal, y los usuarios de esa base de datos reciben permisos. Entonces, el comportamiento predeterminado de las nuevas bases de datos es consultar al maestro para ver qué permisos debe heredar. (SQL 101, lo sé, pero realmente se ejemplifica aquí).
Por lo tanto, cuando otorga CREATE DATABASE, debe tener un usuario maestro para otorgar este permiso. Si intenta esto, funciona (cree un usuario en maestro, concédale crear una base de datos, luego puede crear bases de datos). Sin embargo, al otorgar la creación de cualquier base de datos (o al otorgar el rol dbcreator), no necesita ser un usuario literal en master.
Para ilustrar aún más la diferencia entre los dos permisos, observe los diferentes mensajes devueltos al otorgar a un usuario CREAR BASE DE DATOS en el maestro frente a otra base de datos, luego enjuague y repita para obtener el permiso CREAR CUALQUIER BASE DE DATOS.
Este error ocurre porque el usuario TestUser aún no está en la base de datos maestra. Este es un permiso de nivel de base de datos: no tiene contexto para salir de la base de datos seleccionada y buscar inicios de sesión o usuarios. Tenga en cuenta que si primero crea el usuario en maestro, este comando tiene éxito y puede crear bases de datos como si se le hubiera otorgado CREAR CUALQUIER BASE DE DATOS.
Esto tiene éxito porque, como un permiso propietario de Microsoft SQL Server, CREATE CUALQUIER BASE DE DATOS puede consultar la lista de inicios de sesión para la instancia de SQL, no solo los usuarios de la base de datos utilizada actualmente.
Esto demuestra la coherencia de mi explicación para el primer ejemplo. Tenga en cuenta la consulta a continuación y su mensaje de error resultante. No recibirá este mensaje de error si primero crea el usuario en esta base de datos (consulte la última consulta).
Como se muestra en la segunda consulta, CREATE ANY DATABASE consulta la lista de inicios de sesión, donde ya había creado este nombre de usuario. Entonces, si bien SQL Server reconoció la existencia del usuario, todavía se produce un error porque estoy tratando de otorgar un permiso de nivel de servidor en otro lugar que no sea maestro, que no está permitido en MSSQL.
Ahora que hay un usuario para que CREATE DATABASE se aplique, recibo el mensaje de error genérico de que no puede otorgar permisos a nivel de servidor en ningún lugar que no sea maestro, porque allí es donde SQL Server almacena estos permisos.
Bueno, esto fue divertido.
fuente