2012-10-31 65 views

回答

10

使用HAS_PERMS_BY_NAME

select name, 
    has_perms_by_name(name, 'OBJECT', 'EXECUTE') as has_execute, 
    has_perms_by_name(name, 'OBJECT', 'VIEW DEFINITION') as has_view_definition 
from sys.procedures 
+0

我可以查看存儲過程的腳本使用「腳本存儲過程爲」修改 - >「創建到」;但has_view_definition爲「0」。我們如何糾正它? – Lijo

+1

你可以運行['SELECT * FROM sys.fn_my_permissions('','OBJECT')'](http://msdn.microsoft.com/en-us/library/ms176097.aspx)並在這裏發佈結果? –

+1

順便說一句,我的查詢不處理其他架構中的程序,而不是dbo。你可以輕鬆地解決這個問題。 –

5

HAS_PERMS_BY_NAME,如在第一個答案提供的腳本的情況下使用,會提供所需的結果僅當您連接時爲"MYUSER",因爲此功能

「評估當前用戶的有效權限」

5

要檢查的權限不同的用戶,使用此:

use my_db; 
EXECUTE AS user = 'my_user' 
SELECT SUSER_NAME(), USER_NAME(); 
select name, 
    has_perms_by_name(name, 'OBJECT', 'EXECUTE') as has_execute 

from sys.procedures 
where name = 'myprocname'; 
revert; 

適合我的SQL Server 2012的

4

由於缺少權限,knb的回答對我無效。 (比目前一個是供不同的用戶解決方案)

無法執行作爲數據庫主要因爲主體「我的用戶」 不存在,這種類型的主體不能被冒充,或者你 沒有允許。

answer說明如何獲取的存儲過程列表上的特定數據庫用戶(「我的用戶」)擁有EXECUTE明確授予的權限:

SELECT [name] 
FROM sys.objects obj 
INNER JOIN sys.database_permissions dp ON dp.major_id = obj.object_id 
WHERE obj.[type] = 'P' -- stored procedure 
AND dp.permission_name = 'EXECUTE' 
AND dp.state IN ('G', 'W') -- GRANT or GRANT WITH GRANT 
AND dp.grantee_principal_id = 
    (SELECT principal_id 
    FROM sys.database_principals 
    WHERE [name] = 'my user') 

我修改它,如下所示得到名單我需要:

SELECT [name] 
FROM sys.procedures 
WHERE [name] NOT IN 
    (SELECT [name] 
    FROM sys.objects obj 
    INNER JOIN sys.database_permissions dp ON dp.major_id = obj.object_id 
    WHERE obj.[type] = 'P' -- stored procedure 
    AND dp.permission_name = 'EXECUTE' 
    AND dp.state IN ('G', 'W') -- GRANT or GRANT WITH GRANT 
    AND dp.grantee_principal_id = 
     (SELECT principal_id 
     FROM sys.database_principals 
     WHERE [name] = 'my user')) 

測試的Microsoft SQL Server 2008 R2上