SQL Server 2000 - просмотреть список sprocs с GRANT EXECUTE исключительно для определенной роли?

В моей базе данных SQLSERVER 2000 около 500 sproc; каждый sproc имеет типичный оператор Grant Execute, подобный следующему.

GRANT EXECUTE ON [dbo].[sproc_name]
ДЛЯ [role1], [role2], [role3], [role4] и т. д...

Как просмотреть имена sprocs, которые предоставлены определенной роли и только этой конкретной роли.

Например, мне НЕ нужна роль1 в сочетании с ролью2 или роль3, я просто хочу просмотреть те, где только роль1 сама по себе имеет разрешение на выполнение.


person joedotnot    schedule 13.12.2009    source источник
comment
@Mitch: ServerFault, если где-нибудь, но это также каким-то образом связано с программированием.   -  person gbn    schedule 13.12.2009
comment
Мой интерес к этому вопросу связан исключительно с программированием. Программа с графическим интерфейсом вызывает хранимые процедуры, пользователи принадлежат ролям. Я, программист, должен программировать хранимые процессы и решать, какие разрешения предоставлять!   -  person joedotnot    schedule 14.12.2009


Ответы (2)


Это для 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)
person gbn    schedule 13.12.2009
comment
Собственно то, что я искал! Спасибо большое. (Кстати, «MyProc» не должно быть в предложении where, так как нам нужен список sprocs). Мой измененный ответ ниже, но, по сути, вы получаете кредит. - person joedotnot; 14.12.2009

На основании ответа gbn. Это более уместно, но по существу он дал ответ.

-- 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
person joedotnot    schedule 14.12.2009