web-dev-qa-db-fra.com

script pour afficher toutes les autorisations pour une table

dans ma base de données, j'ai une procédure appelée spGen2_tblIE_SchedProcess_Update.

quand j'exécute ce script

select * from sys.objects
where name = 'spGen2_tblIE_SchedProcess_Update'

enter image description here

Dans la même base de données, j'ai une table appelée tblIE_Step

quand j'exécute le script suivant

select * from sys.objects
where name = 'tblIE_Step'

enter image description here

alors je veux voir toutes les permissions des objets .

lorsque je vérifie ma procédure stockée, j'exécute ce script:

select 'Proc' = SCHEMA_NAME(p.schema_id)+'.'+p.name
    , 'Type' = per.state_desc, 'Permission' = per.permission_name
    , 'Login' = pri.name, 'Type' = pri.type_desc 
    , *
From sys.objects as p
left join sys.database_permissions as per on p.object_id = per.major_id
left join sys.database_principals as pri on per.grantee_principal_id = pri.principal_id
where p.object_id = 87671360

et j'obtiens les autorisations:

enter image description here

Mais quand je lance la même chose pour ma table, je ne reçois rien:

select 'Proc' = SCHEMA_NAME(p.schema_id)+'.'+p.name
    , 'Type' = per.state_desc
    , 'Permission' = per.permission_name
    , 'Login' = pri.name, 'Type' = pri.type_desc 
    , *
From sys.objects as p
left join sys.database_permissions as per on p.object_id = per.major_id
left join sys.database_principals as pri on per.grantee_principal_id = pri.principal_id
where p.object_id = 389576426

enter image description here

Je sais qu'il existe des connexions et des groupes qui appartiennent à des rôles disposant des autorisations db_reader et db_writer. Cependant, ils ne s'affichent pas ici.

Comment puis-je changer mon script afin qu'il me montre toutes les autorisations pour cette table?

4
Marcello Miorelli

J'ai quelques procédures stockées que vous pouvez utiliser pour afficher toutes les autorisations pour une base de données donnée. Soit pour un seul utilisateur/principal ou pour tous. sp_dbpermissions et sp_srvpermissions .

La sortie de sp_dbpermissions (sp_srvpermissions est la même au niveau du serveur) ressemble à ceci

enter image description here

Hors de la page, les commandes révoquer/accorder/refuser sont appropriées.

Pour info, l'exemple que j'ai ici a été exécuté en utilisant 'ALL' pour le paramètre de base de données, il affiche donc la sortie pour toutes les bases de données, pas une seule.

Je les ai principalement conçus comme des outils de recherche, vous trouverez donc des paramètres qui vous permettront de rechercher des autorisations directement appliquées à un objet donné (similaire à votre requête ci-dessus) ou des membres d'un rôle donné (et les autorisations pour ce rôle), etc.

Remarque: Minion a également une édition entreprise qui fait beaucoup de collecte de données détaillées sur les autorisations qui pourraient très bien vous donner ce que vous voulez. Il s'agit cependant d'un programme payant. (Si vous pouvez parler à votre direction des dépenses, cela en vaut probablement la peine)

4
Kenneth Fisher

J'ai trouvé n bon script pour voir les autorisations sur un objet de base de données .

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

le script ci-dessus fonctionne pour un objet de base de données. cependant, lorsque j'ajoute des autorisations sur le schéma où se trouve l'objet db, le script ci-dessus ne reprend pas cela, par exemple:

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

donc pour ce cas j'ai trouvé ce script ici qui répond à cela aussi :

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

lorsque j'exécute le script ci-dessus, j'obtiens le résultat suivant, qui inclut l'autorisation sur le schéma qui se reflète sur ma table.

enter image description here

4
Marcello Miorelli

L'intérêt de rôles comme le db_datareader le rôle est que vous n'avez pas à définir explicitement les autorisations de lecture pour chaque personne de ce rôle pour chaque objet. Vous ne trouverez donc pas de ligne pour chaque utilisateur du rôle. Ce n'est pas une requête, mais vous devez essentiellement faire ceci:

  1. Obtenez tous les utilisateurs qui ont été explicitement autorisés à accéder à cette table et pour lesquels un DENY/REVOKE n'existe pas.
  2. Obtenez tous les utilisateurs qui sont membres de l'un des rôles qui accordent implicitement un accès en lecture à l'objet donné (mais vérifiez encore une fois pour DENY/REVOKE explicite).

Pseudo code (je mettrai à jour avec de vrais exemples quand j'aurai le temps):

-- is user in role(s)? If so:
 -- does role have exec on procedure - include them
 -- does role have select on base table - include them
 -- does role have DENY/REVOKE on procedure - exclude them
 -- does role have DENY/REVOKE on table - exclude them

-- is user not in role(s)? Then:
 -- does user have exec on procedure - include them
 -- does user have select on base table - include them
 -- does user have DENY/REVOKE on procedure - exclude them
 -- does user have DENY/REVOKE on table - exclude them
1
Aaron Bertrand