如何检查用户是否可以在MS SQL服务器中执行存储过程?
我可以通过连接到master数据库并执行:
来查看用户是否具有显式执行权限databasename..sp_helpprotect 'storedProcedureName', 'username'
但是,如果用户是具有执行权限的角色的成员,则sp_helprotect将无法帮助我。
理想情况下,我希望能够调用类似
的内容databasename..sp_canexecute 'storedProcedureName', 'username'
会返回一个布尔。
答案 0 :(得分:12)
答案 1 :(得分:4)
尝试这样的事情:
CREATE PROCEDURE [dbo].[sp_canexecute]
@procedure_name varchar(255),
@username varchar(255),
@has_execute_permissions bit OUTPUT
AS
IF EXISTS (
/* Explicit permission */
SELECT 1
FROM sys.database_permissions p
INNER JOIN sys.all_objects o ON p.major_id = o.[object_id] AND o.[name] = @procedure_name
INNER JOIN sys.database_principals dp ON p.grantee_principal_id = dp.principal_id AND dp.[name] = @username
)
OR EXISTS (
/* Role-based permission */
SELECT 1
FROM sys.database_permissions p
INNER JOIN sys.all_objects o ON p.major_id = o.[object_id]
INNER JOIN sys.database_principals dp ON p.grantee_principal_id = dp.principal_id AND o.[name] = @procedure_name
INNER JOIN sys.database_role_members drm ON dp.principal_id = drm.role_principal_id
INNER JOIN sys.database_principals dp2 ON drm.member_principal_id = dp2.principal_id AND dp2.[name] = @username
)
BEGIN
SET @has_execute_permissions = 1
END
ELSE
BEGIN
SET @has_execute_permissions = 0
END
GO
答案 2 :(得分:1)
假设SP只运行SELECT语句:
执行用户= [用户ID /登录]
EXEC sp_foobar(sna,fu)
REVERT
请务必注意,您需要在提示符后运行REVERT命令,因为SQL Server会将您视为正在执行AS的用户,直到您关闭连接或REVERT模拟为止。也就是说,你应该看到用户会得到什么(获得一些但不是全部?这可以帮助你)。