db_ddladmin vs db_owner
Por lo que puedo decir de lo que probé y leí, en su mayor parte su lista se ve precisa, excepto db_ddladmin
que lo permite CREATE SCHEMA
. Confirmé que los otros permisos de seguridad que enumeró fueron denegados.
Denegado solo con DDLADMIN:
[ALTER ANY USER]
[BACKUP DATABASE]
` [BACKUP LOG]
`[CHECKPOINT]
[ALTER ANY APPLICATION ROLE]
, [ALTER ANY ROLE]
[DROP DATABASE]
Tomando nota de que el. . .
db_datareader
permitirá el SELECT
acceso a todas las mesas
db_datarwriter
permitirá INSERT
, UPDATE
y DELETE
acceso a todas las tablas
db_executor
permitirá el EXECUTE
acceso a todos los objetos ejecutables
Además, tener permisos de rol db_ddladmin puede significar. . .
Nota: Dado que tiene tantas versiones diferentes de SQL Server de 2005 a 2014, puede ser mejor que un pequeño grupo de usuarios pruebe esto inicialmente para ver quién grita para solucionar cualquier problema, etc.
Los objetos que poseen con este rol no serán propiedad de DBO, por lo que es posible que tenga que lidiar con problemas de cambio de propiedad si alguna vez hay un problema con algo a este nivel. No estoy 100% seguro de que esto sea un problema, pero vale la pena mencionarlo por si acaso.
Fuente: cadenas de propiedad
Con esta función (puede variar según la versión de SQL Server) , pueden agregar los principios de seguridad de SQL definidos en la base de datos actual a los objetos que aún poseen, pero no todos los objetos (que no son de su propiedad) ni agregar un nuevo servidor -nivel principal definido al nivel de base de datos.
Además, no tener permisos de rol DBO puede significar. . .
Nota: Dado que tiene tantas versiones diferentes de SQL Server de 2005 a 2014, puede ser mejor que un pequeño grupo de usuarios pruebe esto inicialmente para ver quién grita para solucionar cualquier problema, etc.
No tener el rol DBO puede evitar que ciertas interfaces GUI del diseñador SSMS (la versión de SQL Server varíe) se llenen o abran sin error (por ejemplo, al modificar tablas o columnas a través de la GUI) aunque hacerlo a través de T-SQL funciona y los permisos están vigentes . En algunas versiones de SQL Server, esto puede resolverse permitiendo GRANT VIEW DEFINITION
que esto sea un problema y también puede ser solo una advertencia en ciertas versiones de SQL Server.
Recursos
No ha iniciado sesión como propietario de la base de datos o como usuario miembro de la función db_owner. No podrá guardar los cambios en las tablas que no le pertenecen.
El rol db_ddladmin no permite el uso de funciones de "diseño" en SSMS
"Tratamos de evitar dar dbo a los usuarios / desarrolladores en sus bases de datos de control de calidad tanto como podamos. Uno de los problemas con esto es que todavía necesitan poder crear y modificar objetos de bases de datos como tablas de usuarios. Muchos desarrolladores son nuevos en MS SQL y, por lo tanto, tienden a quedarse con la GUI (SSMS) para este tipo de trabajo. El problema surge cuando les otorgamos db_ddladmin (no dbo) y ya no pueden modificar tablas o columnas a través de la GUI del diseñador de tablas. tienen que tomarse un tiempo adicional para aprender los comandos TSQL y su sintaxis (que tal vez nunca más vuelvan a necesitar) o comprometerse con el equipo de DBA, lo que les quita tiempo a nuestras otras actividades.
No sé si esto es un error o una solicitud de función, pero lo considero un error ya que el usuario tiene permisos suficientes para alterar la tabla a través de TSQL, pero la GUI les da mensajes que indican:
" No ha iniciado sesión como propietario de la base de datos o administrador del sistema. Es posible que no pueda guardar los cambios en las tablas que no le pertenecen". Y "La tabla [schema].[table]
está configurada para solo lectura, el usuario no tiene suficientes derechos sobre esta tabla " .
Un rastro parece apuntar a que la comprobación es is_member ('db_owner'), lo que impedirá que los miembros de db_ddladmin, aunque de hecho tengan permisos para modificar el objeto. Microsoft SQL Server Management Studio "
Publicado por el Agente DBA el 25/01/2010 a las 7:06 a.m.
Tuve un problema similar y logré resolverlo realizando la siguiente subvención
GRANT view definition on schema:: <schemaname> to <username>
Otras Consideraciones
Como usted afirma que esto se está revisando caso por caso
Uno de los permisos actualmente limitados son los permisos db_owner.
Este permiso se está revisando caso por caso, pero un cambio común es reemplazar los permisos db_owner con lo siguiente:
- db_datareader
- db_datawriter
- db_ddladmin
- db_executor
¿Ha considerado crear roles personalizados adicionales para obtener más acceso a nivel de base de datos de "todos los objetos" que cada persona necesita en lugar de otorgarles el db_ddladmin
rol, ya que eso probablemente les dará más de lo que realmente necesitan para objetos de nivel de base de datos también.
Por lo general, les doy exactamente lo que se necesita y nada más para que hagan su trabajo y si hay una necesidad "habitual" o "estándar" de acceso a objetos de nivel de base de datos a todos los objetos en una base de datos, creo un rol de base de datos personalizado como el db_executor
pero mira mi ejemplo a continuación. De esta manera, puede otorgar a las personas lo que realmente necesitan para TODOS los objetos de base de datos en una base de datos particular si no obtiene un nivel de objeto explícito en sus bases de datos para su seguridad.
----Custom Database Roles
/* CREATE A NEW ROLE -- Execute to all stored procs including newly created ones*/
-- Database specific
CREATE ROLE db_All_StoredProc_Execute
GRANT EXECUTE TO db_All_StoredProc_Execute
/* CREATE A NEW ROLE -- Alter to all stored procs including newly created ones*/
-- Database specific
CREATE ROLE db_All_StoredProc_Alter
GRANT ALTER ANY SCHEMA TO db_All_StoredProc_Alter
/* CREATE A NEW ROLE -- View Definition to all stored procs including newly created ones*/
-- Database specific
CREATE ROLE db_All_StoredProc_View
GRANT VIEW DEFINITION TO db_All_StoredProc_View
/* CREATE A NEW ROLE - Any schema alter and create procedure permissions */
-- Database specific
CREATE ROLE db_All_CreateProc_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateProc_AlterSchema
GRANT CREATE PROCEDURE TO db_All_CreateProc_AlterSchema
GO
/* CREATE A NEW ROLE - Any schema alter and create table permissions */
-- Database specific
CREATE ROLE db_All_CreateTable_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateTable_AlterSchema
GRANT CREATE TABLE TO db_All_CreateTable_AlterSchema
/* CREATE A NEW ROLE - Any schema alter and create function permissions */
-- Database specific
CREATE ROLE db_All_CreateFunction_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateFunction_AlterSchema
GRANT CREATE FUNCTION TO db_All_CreateFunction_AlterSchema
/* CREATE A NEW ROLE - Any schema alter and create aggregate permissions */
-- Database specific
CREATE ROLE db_All_CreateAggregate_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateAggregate_AlterSchema
GRANT CREATE AGGREGATE TO db_All_CreateAggregate_AlterSchema
/* CREATE A NEW ROLE - Any schema alter and create view permissions */
-- Database specific
CREATE ROLE db_All_CreateView_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateView_AlterSchema
GRANT CREATE VIEW TO db_All_CreateView_AlterSchema
/* CREATE A NEW ROLE - Any schema alter and create schema permissions */
-- Database specific
CREATE ROLE db_All_CreateSchema_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateSchema_AlterSchema
GRANT CREATE SCHEMA TO db_All_CreateSchema_AlterSchema
También quería compartir una función db_DDLAdmin_Restriction que quizás desee considerar crear de otra manera con explícito DENY
para restringir a qué le db_ddladmin
da acceso, por lo que al menos podría crear esto en los DB donde les otorga esta función y establecer lo explícito DENY
para los tipos de objeto reales , etc. a los que no desea que tengan acceso.
Por ejemplo, si usted sabe que definitivamente van a ser la creación de procedimientos almacenados y funciones, puede excluir DENY CREATE FUNCTION
, DENY CREATE PROCEDURE
, DENY ALTER ANY SCHEMA
.
---Create ddladmin restriction custom DB role
DENY ALTER ANY ASSEMBLY TO db_DDLAdmin_Restriction
DENY ALTER ANY ASYMMETRIC KEY TO db_DDLAdmin_Restriction
DENY ALTER ANY CERTIFICATE TO db_DDLAdmin_Restriction
DENY ALTER ANY CONTRACT TO db_DDLAdmin_Restriction
DENY ALTER ANY DATABASE DDL TRIGGER TO db_DDLAdmin_Restriction
DENY ALTER ANY DATABASE EVENT NOTIFICATION TO db_DDLAdmin_Restriction
DENY ALTER ANY DATASPACE TO db_DDLAdmin_Restriction
DENY ALTER ANY FULLTEXT CATALOG TO db_DDLAdmin_Restriction
DENY ALTER ANY MESSAGE TYPE TO db_DDLAdmin_Restriction
DENY ALTER ANY REMOTE SERVICE BINDING TO db_DDLAdmin_Restriction
DENY ALTER ANY ROUTE TO db_DDLAdmin_Restriction
DENY ALTER ANY SCHEMA TO db_DDLAdmin_Restriction
DENY ALTER ANY SERVICE TO db_DDLAdmin_Restriction
DENY ALTER ANY SYMMETRIC KEY TO db_DDLAdmin_Restriction
DENY CHECKPOINT TO db_DDLAdmin_Restriction
DENY CREATE AGGREGATE TO db_DDLAdmin_Restriction
DENY CREATE DEFAULT TO db_DDLAdmin_Restriction
DENY CREATE FUNCTION TO db_DDLAdmin_Restriction
DENY CREATE PROCEDURE TO db_DDLAdmin_Restriction
DENY CREATE QUEUE TO db_DDLAdmin_Restriction
DENY CREATE RULE TO db_DDLAdmin_Restriction
DENY CREATE SYNONYM TO db_DDLAdmin_Restriction
DENY CREATE TABLE TO db_DDLAdmin_Restriction
DENY CREATE TYPE TO db_DDLAdmin_Restriction
DENY CREATE VIEW TO db_DDLAdmin_Restriction
DENY CREATE XML SCHEMA COLLECTION TO db_DDLAdmin_Restriction
DENY REFERENCES TO db_DDLAdmin_Restriction
GO