Saltar al contenido

script para mostrar todos los permisos de una tabla

Por fin luego de mucho trabajar pudimos dar con el resultado de este apuro que muchos usuarios de esta web han presentado. Si tienes algún detalle que aportar no dejes de dejar tu conocimiento.

Solución:

Encontré un buen script para ver los permisos en un objeto de base de datos.

SELECT
  (
    dp.state_desc + ' ' +
    dp.permission_name collate latin1_general_cs_as + 
    ' ON ' + '[' + s.name + ']' + '.' + '[' + o.name + ']' +
    ' TO ' + '[' + dpr.name + ']'
  ) AS GRANT_STMT
FROM sys.database_permissions AS dp
  INNER JOIN sys.objects AS o ON dp.major_id=o.object_id
  INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id
  INNER JOIN sys.database_principals AS dpr ON dp.grantee_principal_id=dpr.principal_id
WHERE 1=1
    AND o.name IN ('YOUR TABLE NAME')      -- Uncomment to filter to specific object(s)
--  AND dp.permission_name='EXECUTE'    -- Uncomment to filter to just the EXECUTEs
ORDER BY dpr.name

el script anterior funciona para un objeto de base de datos. sin embargo, cuando agrego permisos en el esquema donde está el objeto db, el script anterior no lo detecta, por ejemplo:

grant delete on schema::dbo to [db_webUser] 
GO

entonces, para ese caso, encontré este script aquí que también se ocupa de eso:

------------------------------------------------------------------------------------------------------------------
-- http://schottsql.blogspot.co.uk/2011/02/quickly-script-permissions-in-sql-2005.html
------------------------------------------------------------------------------------------------------------------


SELECT
state_desc + ' ' + permission_name +
' on ['+ ss.name + '].[' + so.name + ']
to [' + sdpr.name + ']'
COLLATE LATIN1_General_CI_AS as [Permissions T-SQL]
FROM SYS.DATABASE_PERMISSIONS AS sdp
JOIN sys.objects AS so
     ON sdp.major_id = so.OBJECT_ID
JOIN SYS.SCHEMAS AS ss
     ON so.SCHEMA_ID = ss.SCHEMA_ID
JOIN SYS.DATABASE_PRINCIPALS AS sdpr
     ON sdp.grantee_principal_id = sdpr.principal_id
where 1=1
  AND so.name = 'ItemStock'

UNION

SELECT
state_desc + ' ' + permission_name +
' on Schema::['+ ss.name + ']
to [' + sdpr.name + ']'
COLLATE LATIN1_General_CI_AS as [Permissions T-SQL]
FROM SYS.DATABASE_PERMISSIONS AS sdp
JOIN SYS.SCHEMAS AS ss
     ON sdp.major_id = ss.SCHEMA_ID
     AND sdp.class_desc = 'Schema'
JOIN SYS.DATABASE_PRINCIPALS AS sdpr
     ON sdp.grantee_principal_id = sdpr.principal_id
where 1=1

order by [Permissions T-SQL]
GO

cuando ejecuto el script anterior, obtengo el siguiente resultado, que incluye el permiso en el esquema que se refleja en mi tabla.

ingrese la descripción de la imagen aquí

Tengo un par de procedimientos almacenados que puede usar para mostrar todos los permisos para una base de datos determinada. Ya sea para un solo usuario/principal o para todos ellos. sp_dbpermissions y sp_srvpermissions.

El resultado de sp_dbpermissions (sp_srvpermissions es el mismo a nivel de servidor) tiene este aspecto

ingrese la descripción de la imagen aquí

Fuera de la página están los comandos revocar/conceder/denegar según corresponda.

FYI, el ejemplo que tengo aquí se ejecutó usando ‘TODOS’ para el parámetro de la base de datos, por lo que muestra el resultado de todas las bases de datos, no solo de una.

Los concebí principalmente como herramientas de investigación, por lo que encontrará parámetros que le permitan buscar permisos aplicados directamente a un objeto determinado (similar a su consulta anterior) o miembros de un rol determinado (y los permisos para ese rol), etc.

Nota: Minion también tiene una edición empresarial que recopila una gran cantidad de datos detallados sobre los permisos que podrían brindarle lo que desea. Sin embargo, es un programa pago. (Si puede hablar con su gerencia sobre el gasto, probablemente valga la pena)

Si te mola el asunto, tienes el poder dejar un ensayo acerca de qué le añadirías a esta sección.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *