Sql server 如何使用TSQL确定对特定存储过程授予了哪些角色执行权限?

Sql server 如何使用TSQL确定对特定存储过程授予了哪些角色执行权限?,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,如何使用TSQL确定对特定存储过程授予了哪些角色执行权限?是否有我可以使用的系统存储过程或系统视图?您可以尝试类似的方法。注意,我认为3是执行的 SELECT grantee_principal.name AS [Grantee], CASE grantee_principal.type WHEN 'R' THEN 3 WHEN 'A' THEN 4 ELSE 2 END - CASE 'database' WHEN 'database' THEN 0 ELSE 2 END AS [Grant

如何使用TSQL确定对特定存储过程授予了哪些角色执行权限?是否有我可以使用的系统存储过程或系统视图?

您可以尝试类似的方法。注意,我认为3是执行的

SELECT
grantee_principal.name AS [Grantee],
CASE grantee_principal.type WHEN 'R' THEN 3 WHEN 'A' THEN 4 ELSE 2 END - CASE 'database' WHEN  'database' THEN 0 ELSE 2 END AS [GranteeType]
FROM
sys.all_objects AS sp
INNER JOIN sys.database_permissions AS prmssn ON prmssn.major_id=sp.object_id AND prmssn.minor_id=0 AND prmssn.class=1
INNER JOIN sys.database_principals AS grantee_principal ON grantee_principal.principal_id = prmssn.grantee_principal_id
WHERE
(sp.type = N'P' OR sp.type = N'RF' OR sp.type='PC')and(sp.name=N'myProcedure' and SCHEMA_N

我通过在查看过程的权限时简单地使用SQL Profiler获得了这个示例。我希望这会有所帮助。

在7.0或2000中,您可以修改并使用以下代码:

SELECT convert(varchar(100),
        'GRANT ' +
        CASE         WHEN actadd & 32 = 32 THEN 'EXECUTE'
                ELSE
                        CASE WHEN actadd & 1 = 1   THEN 'SELECT' + CASE WHEN actadd & (8|2|16) > 0  THEN ', ' ELSE '' END ELSE '' END +
                        CASE WHEN actadd & 8 = 8   THEN 'INSERT' + CASE WHEN actadd & (2|16) > 0  THEN ', ' ELSE '' END ELSE '' END +
                        CASE WHEN actadd & 2 = 2   THEN 'UPDATE' + CASE WHEN actadd & (16) > 0  THEN ', ' ELSE '' END ELSE '' END +
                        CASE WHEN actadd & 16 = 16 THEN 'DELETE' ELSE '' END
        END + ' ON [' + o.name + '] TO [' + u.name + ']') AS '--Permissions--'
FROM syspermissions p
INNER JOIN sysusers u ON u.uid = p.grantee
INNER JOIN sysobjects o ON p.id = o.id
WHERE o.type <> 'S'
AND o.name NOT LIKE 'dt%'
--AND o.name = '<specific procedure/table>'
--AND u.name = '<specific user>'
ORDER BY u.name, o.name 
选择convert(varchar(100),
“格兰特”+
当actadd&32=32时,则为“执行”
其他的
当actadd&1=1时的大小写,然后“选择”+当actadd&(8 | 2 | 16)>0时的大小写,然后“ELSE”结束“ELSE”结束+
当actadd&8=8时的大小写,然后“插入”+当actadd&(2 | 16)>0时的大小写,然后“ELSE”结束ELSE结束+
当actadd&2=2时为大小写,然后“更新”+当actadd&16>0时为大小写,然后“ELSE”结束“ELSE”结束+
当actadd&16=16时,则“删除”ELSE“结束
在['+o.name+']上结束+'到['+u.name+']')作为'--Permissions--'
从sysp
u.uid=p.grantee上的内部联接系统用户u
p.id=o.id上的内部联接系统对象o
o.type'S'S'
o.名称与“dt%”不同
--和o.name=''
--而u.name=“”
按u.名称、o.名称订购