我正在使用SQL Server 2008 R2。我需要列出數據庫用戶(MYUSER)具有執行權限的所有存儲過程。查找具有執行權限的存儲過程
另外,我需要列出哪些是用戶不具有執行權限的存儲過程 - 但可以讀取存儲過程
是否有任何SQL語句或輔助功能爲這些目的的腳本?
參考:
我正在使用SQL Server 2008 R2。我需要列出數據庫用戶(MYUSER)具有執行權限的所有存儲過程。查找具有執行權限的存儲過程
另外,我需要列出哪些是用戶不具有執行權限的存儲過程 - 但可以讀取存儲過程
是否有任何SQL語句或輔助功能爲這些目的的腳本?
參考:
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
HAS_PERMS_BY_NAME
,如在第一個答案提供的腳本的情況下使用,會提供所需的結果僅當您連接時爲"MYUSER"
,因爲此功能
「評估當前用戶的有效權限」
要檢查的權限不同的用戶,使用此:
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的
由於缺少權限,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上
我可以查看存儲過程的腳本使用「腳本存儲過程爲」修改 - >「創建到」;但has_view_definition爲「0」。我們如何糾正它? – Lijo
你可以運行['SELECT * FROM sys.fn_my_permissions('','OBJECT')'](http://msdn.microsoft.com/en-us/library/ms176097.aspx)並在這裏發佈結果? –
順便說一句,我的查詢不處理其他架構中的程序,而不是dbo。你可以輕鬆地解決這個問題。 –