下午好,
所以我的任务是尝试在413个存储过程中检查特定用户的用户权限。主要是它也无法访问的那些。
我目前有: -
select name,
HAS_PERMS_BY_NAME(name, 'OBJECT', 'EXECUTE') as has_execute
from sys.procedures
where HAS_PERMS_BY_NAME(name, 'OBJECT', 'EXECUTE') = 0;
但由于某种原因,这不起作用,表格什么也没有显示。但我知道它对某些表没有执行权限,我可以看到它!
现在,我只是一个卑微的学徒,并且没有特别长时间地做SQL,所以任何指导都会非常感激。
由于
答案 0 :(得分:2)
作为您正在采用的方法的替代方法,下面的脚本将返回指定用户具有执行权限的给定数据库的所有过程。可以轻松地针对其他类型(例如,视图或表)以及其他指定的权限级别进行调整。
USE [Database]
GO
DECLARE @UserToCheck varchar(200) = 'UserToCheck'
SELECT DISTINCT
O.Name as ProcedureName,
IIF(P.Name IS NULL, 0, 1) AS HasExplicitExecutePermission,
P.Name as SysUser ,
P.permission_name As Permission
FROM sys.objects O
LEFT JOIN (
SELECT A.major_id, B.Name, A.permission_name
FROM sys.database_permissions A
JOIN sys.database_principals B ON A.grantee_principal_id = B.principal_id
WHERE
B.Name = @UserToCheck AND
A.permission_name = 'EXECUTE' AND
A.state IN ('G', 'W')
) P ON P.major_id = O.object_id
WHERE
o.type = 'P' --Stored Proc
Order By HasExplicitExecutePermission Asc, ProcedureName