2009-01-30 16 views
10

Estoy usando SQL Server 2005, quiero saber 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.¿Cómo puedo ver todas las concesiones para una base de datos SQL?

Nota: esto puede ser similar a this question, pero no pude conseguir la solución de la respuesta seleccionada de trabajo (si alguien podría proporcionar un mejor ejemplo de cómo utilizar ese, sería útil también)

Respuesta

15

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, necesitaría db_datawriter que comprobar la adhesión, ya que da INSERT implícita, UPDATE, DELETE y derechos, lo que significa que no va a ver que se muestre en los DMV permiso o sus derivados.

4

Para ver todos subvenciones en una base de datos específica utilizan este:

Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES 

simplemente para ver los eliminar las subvenciones en una base de datos específica uso esto:

Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES WHERE PRIVILEGE_TYPE = 'DELETE' 
2

Para ver las subvenciones en una toda DB, seleccione la base de datos en cuestión, abrir una nueva ventana de consulta, escriba - sp_helprotect, ejecutar la consulta

+2

sp_helprotect está en desuso en SQL 2005 y más adelante. Ver http://msdn.microsoft.com/en-us/library/ms190310.aspx –

3

Para una lista de todos los permisos que se pueden controlar se puede utilizar la función fn_my_permission. Esta consulta lista todos los permisos en el servidor :

select * from fn_my_permissions(NULL, NULL) 

Tienes que iniciar sesión con una cuenta que tiene función sysadmin.

Puede refinar las llamadas a funciones usando los siguientes parámetros.

Para todos los permisos en base de datos:

select * from fn_my_permissions(NULL, 'database') 

Para todos los permisos de la DBO esquema:

select * from fn_my_permissions('dbo', 'schema') 

Para todos los permisos en una mesa :

select * from fn_my_permissions('dbo.test', 'object') 
4

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)

nota que puede excluir fácilmente objetos del sistema, consulte comentado cláusula where

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 
Cuestiones relacionadas