2012-10-31 14 views
7

मैं SQL Server 2008 R2 का उपयोग कर रहा हूं। मुझे उन सभी संग्रहीत प्रक्रियाओं को सूचीबद्ध करने की आवश्यकता है जिन्हें डेटाबेस उपयोगकर्ता (MYUSER) ने निष्पादित अनुमति दी है।निष्पादित अनुमति वाले संग्रहित प्रक्रियाओं को ढूंढना

इसके अलावा, मैं बाहर सूचीबद्ध करने की आवश्यकता है जो संग्रहित प्रक्रियाओं निष्पादन अनुमति उपयोगकर्ता नहीं है कि कर रहे हैं - लेकिन संग्रहीत प्रक्रिया

वहाँ किसी भी एसक्यूएल बयान या इन प्रयोजन के लिए सहायक समारोह है की स्क्रिप्ट पढ़ सकते हैं?

संदर्भ:

  1. Granting execute permission on all stored procedures in a certain database

उत्तर

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

मैं संग्रहीत proc की स्क्रिप्ट देख सकते हैं "स्क्रिप्ट संग्रहीत प्रक्रिया के रूप में" का उपयोग करके "-" बनाएं "; लेकिन has_view_definition "0" के रूप में आ रहा है। हम इसे कैसे ठीक कर सकते हैं? – Lijo

+1

क्या आप ['SELECT * से sys.fn_my_permissions ('', 'ऑब्जेक्ट') '] (http://msdn.microsoft.com/en-us/library/ms176097.aspx) चला सकते हैं और परिणाम यहां पोस्ट कर सकते हैं? –

+1

बीटीडब्लू, मेरी क्वेरी अन्य स्कीमा में प्रक्रियाओं को संभालती नहीं है, न कि डीबीओ। आप आसानी से इसे स्वयं ठीक कर सकते हैं। –

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; 

वर्क्स 2012

4

लापता अधिकारों के कारण knb का जवाब मेरे लिए काम नहीं करता है। (वर्तमान की जगह किसी दूसरे उपयोगकर्ता के लिए एक समाधान)

डेटाबेस प्रिंसिपल के रूप में नहीं चलाया जा सकता क्योंकि प्रिंसिपल "मेरे उपयोगकर्ता" मौजूद नहीं है, प्राचार्य के इस प्रकार प्रतिरूपित नहीं किया जा सकता है, या आप की जरूरत नहीं है अनुमति।

यह answer दिखाता है कि कैसे संग्रहित प्रक्रियाओं की सूची किसी विशेष डेटाबेस उपयोगकर्ता ('मेरे उपयोगकर्ता') अनुमति स्पष्ट रूप से दी गई निष्पादित है जिस पर प्राप्त करने के लिए:

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 सर्वर पर परीक्षण किया गया 2008 R2

संबंधित मुद्दे