vista - ¿Cómo puedo ver todas las concesiones para una base de datos SQL?
permisos para crear vistas en sql (5)
Para enumerar todos los permisos que se pueden controlar, puede usar la función fn_my_permission
. Esta consulta enumera todos los permisos en el servidor :
select * from fn_my_permissions(NULL, NULL)
Debes iniciar sesión usando una cuenta que tenga el rol de administrador del sistema.
Puede refinar las llamadas de función usando los siguientes parámetros.
Para todos los permisos en la base de datos :
select * from fn_my_permissions(NULL, ''database'')
Para todos los permisos en el esquema dbo:
select * from fn_my_permissions(''dbo'', ''schema'')
Para todos los permisos en una tabla :
select * from fn_my_permissions(''dbo.test'', ''object'')
Estoy usando SQL Server 2005, quiero averiguar qué son todas las concesiones en una base de datos específica para todas las tablas. También ayudaría a encontrar todas las tablas donde se ha otorgado la concesión de eliminación para un usuario específico.
Nota: esto puede ser similar a esta pregunta , pero no pude obtener la solución de la respuesta seleccionada funcionando (si alguien pudiera proporcionar un mejor ejemplo de cómo usar eso, también me ayudaría)
Para ver las concesiones en un DB completo, seleccione el DB en cuestión, abra una nueva ventana de consulta, ingrese - sp_helprotect
, ejecute la consulta
La solución dada no cubre dónde se otorga el permiso contra el esquema o la base de datos en sí, que otorgan permisos también contra las tablas. Esto te dará esas situaciones, también. Puede usar una cláusula WHERE contra permission_name para restringir a simplemente DELETE.
SELECT
class_desc
, CASE WHEN class = 0 THEN DB_NAME()
WHEN class = 1 THEN OBJECT_NAME(major_id)
WHEN class = 3 THEN SCHEMA_NAME(major_id) END [Securable]
, USER_NAME(grantee_principal_id) [User]
, permission_name
, state_desc
FROM sys.database_permissions
Además, db_datawriter debería verificarse para la membresía porque brinda derechos INSERT, UPDATE y DELETE implícitos, lo que significa que no se verá en los DMV autorizados o sus derivadas.
Para ver todas las concesiones en una base de datos específica, use esto:
Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES
Para ver las concesiones de eliminación en una base de datos específica, use esto:
Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES WHERE PRIVILEGE_TYPE = ''DELETE''
Me gustó la respuesta de K. Brian Kelly, pero quería un poco más de información (como el esquema) y generar las declaraciones GRANT y REVOKE correspondientes para poder aplicarlas en diferentes entornos (por ejemplo, dev / test / prod).
tenga en cuenta que puede excluir fácilmente los objetos del sistema, vea la cláusula comentada donde
select
class_desc
,USER_NAME(grantee_principal_id) as user_or_role
,CASE WHEN class = 0 THEN DB_NAME()
WHEN class = 1 THEN ISNULL(SCHEMA_NAME(o.uid)+''.'','''')+OBJECT_NAME(major_id)
WHEN class = 3 THEN SCHEMA_NAME(major_id) END [Securable]
,permission_name
,state_desc
,''revoke '' + permission_name + '' on '' +
isnull(schema_name(o.uid)+''.'','''')+OBJECT_NAME(major_id)+ '' from ['' +
USER_NAME(grantee_principal_id) + '']'' as ''revokeStatement''
,''grant '' + permission_name + '' on '' +
isnull(schema_name(o.uid)+''.'','''')+OBJECT_NAME(major_id)+ '' to '' +
USER_NAME(grantee_principal_id) + '']'' as ''grantStatement''
FROM sys.database_permissions dp
LEFT OUTER JOIN sysobjects o
ON o.id = dp.major_id
-- where major_id >= 1 -- ignore sysobjects
order by
class_desc desc
,USER_NAME(grantee_principal_id)
,CASE WHEN class = 0 THEN DB_NAME()
WHEN class = 1 THEN isnull(schema_name(o.uid)+''.'','''')+OBJECT_NAME(major_id)
WHEN class = 3 THEN SCHEMA_NAME(major_id) end
,permission_name