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'
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'
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:
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
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?
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
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)
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.
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:
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