2009-12-13 15 views
0

Il y a environ 500 sprocs dans ma base de données SQLSERVER 2000; chaque sproc a une instruction Grant Execute typique similaire à ce qui suit.SQL Server 2000 - Afficher la liste des sprocs avec GRANT EXECUTE pour un rôle particulier exclusivement?

GRANT EXECUTE sur [dbo]. [Sproc_name]
À [rôle1], [rôle2], [role3], [role4], etc ...

Comment afficher les noms des sprocs qui avoir accorder à un rôle particulier et seulement ce rôle particulier exclusivement. Par exemple, je ne veux pas role1 en combinaison avec role2, ou role3, je veux juste voir ceux où seul role1 a lui-même l'autorisation d'exécution.

+0

appartient à superuser.com ... –

+0

@Mitch: ServerFault si partout, mais il est aussi la programmation liée de façon sone – gbn

+0

Mon intérêt pour cette question est purement programmation liée. Le programme de l'interface graphique appelle les procédures stockées, les utilisateurs appartiennent aux rôles. Je le programmeur doit programmer les procs stockés, et travailler sur quelles permissions accorder! – joedotnot

Répondre

1

Ceci est pour SQL Server 2000:

SELECT 
    OBJECT_NAME(p1.id) 
FROM 
    syspermissions p1 
WHERE 
    USER_NAME(p1.grantee) = 'MyRole' 
    AND 
    OBJECT_NAME(p1.id) = 'MyProc' 
    AND 
    NOT EXISTS (SELECT * 
     FROM 
      syspermissions p2 
     WHERE 
      p1.grantee <> p2.grantee 
      AND 
      p1.id = p2.id) 
+0

Essentiellement ce que je cherchais! Merci beaucoup. (Incidemment, 'MyProc' ne devrait pas être dans la clause where, car nous voulons une liste de sprocs). Ma réponse modifiée ci-dessous, mais essentiellement vous obtenez le crédit. – joedotnot

1

Sur la base de la réponse par GBN. C'est plus approprié, mais essentiellement il a fourni la réponse.

-- show all stored procs where permission is granted to 'MyRole' and only 'MyRole' 
SELECT OBJECT_NAME(p1.id) AS sproc_name 
    FROM syspermissions p1 
    inner join sysobjects o ON p1.id = o.id 
    AND o.xtype = 'p' 
    AND o.[name] not like 'dt_%' 
WHERE USER_NAME(p1.grantee) = 'MyRole' 
AND NOT EXISTS (
     SELECT *   
      FROM syspermissions p2   
     WHERE p1.grantee <> p2.grantee    
     AND p1.id = p2.id 
    ) 
ORDER BY 1