2009-01-27 91 views
8

如何檢查用戶是否可以在MS SQL服務器中執行存儲過程?MS SQL Server:檢查用戶是否可以執行存儲過程

我可以看到,如果用戶已經明確通過連接到主數據庫,並執行執行權限:但是

databasename..sp_helpprotect 'storedProcedureName', 'username' 

如果用戶是具有執行權限則sp_helprotect不會幫我一個角色的成員。

理想情況下,我想能夠調用類似

databasename..sp_canexecute 'storedProcedureName', 'username' 

這將返回一個布爾值。

+0

另外,如果你使用SQL Server 2005或以上,並允許被分配到架構或數據庫(EXECUTE可以了),則sp_helprotect不會報告它。存儲過程僅包含向後兼容性,並根據SQL Server 2000中的內容報告權限。 – 2009-01-27 19:18:19

回答

13
+1

我不認爲這些函數回答原始問題,即檢查** _任何給定用戶_ **是否具有執行權限給定的存儲過程。這兩個函數的MSDN文章都表示,它們僅返回** _調用主體_ **的權限,而不是任何主體。 – 2017-03-21 20:33:55

1

假設SP僅運行一個SELECT語句:

EXECUTE AS USER = [使用ID /登錄]
EXEC sp_foobar(SNA,福)
REVERT

請務必注意,在SQL Server將考慮提示後,您需要運行REVERT命令您作爲您正在執行的用戶,直到您關閉連接或恢復模擬爲止。也就是說,你應該看到一個用戶會得到什麼(得到一些行,但不是全部?這應該幫助你)。

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 
+0

如果用戶是具有權限的角色的成員,並且沒有明確允許執行存儲過程,那麼這是否行得通? – Andrew 2009-01-28 09:24:25

相關問題