2009-01-30 6 views
10

मैं SQL सर्वर 2005 का उपयोग कर रहा हूं, मैं यह जानना चाहता हूं कि सभी अनुदान सभी तालिकाओं के लिए एक विशिष्ट डेटाबेस पर क्या हैं। यह उन सभी टेबलों को खोजने में भी मदद करेगा जहां एक विशिष्ट उपयोगकर्ता के लिए डिलीट अनुदान दिया गया है।मैं SQL डेटाबेस के लिए सभी अनुदान कैसे देख सकता हूं?

नोट: इस this question के समान हो सकती है, लेकिन मैं चयनित जवाब के समाधान काम नहीं कर रहा हो सकता है

उत्तर

15

दिए गए समाधान में कवर नहीं किया गया है जहां स्कीमा या डेटाबेस के खिलाफ अनुमति दी गई है, जो तालिकाओं के खिलाफ अनुदान अनुमति भी देता है। यह आपको उन परिस्थितियों को भी देगा। आप केवल DELETE तक सीमित करने के लिए अनुमति_नाम के विरुद्ध WHERE खंड का उपयोग कर सकते हैं।

SELECT 
    class_desc 
    , CASE WHEN class = 0 THEN DB_NAME() 
     WHEN class = 1 THEN OBJECT_NAME(major_id) 
     WHEN class = 3 THEN SCHEMA_NAME(major_id) END [Securable] 
    , USER_NAME(grantee_principal_id) [User] 
    , permission_name 
    , state_desc 
FROM sys.database_permissions 

इसके अलावा, db_datawriter क्योंकि यह अंतर्निहित सम्मिलित करें, अद्यतन देता सदस्यता के लिए जांच की जानी चाहिए, और अधिकार हटाएँ, जिसका अर्थ है कि आप इसे अनुमति DMVs या उनके डेरिवेटिव में दिखाई नहीं देखेंगे होगा।

4

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

Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES WHERE PRIVILEGE_TYPE = 'DELETE' 
2

एक पर अनुदान देखने के लिए:

Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES 

सिर्फ इस एक विशिष्ट डेटाबेस उपयोग पर अनुदान हटाना को देखने के लिए संपूर्ण डीबी, प्रश्न में डीबी का चयन करें, एक नई क्वेरी विंडो खोलें, दर्ज करें - sp_helprotect, क्वेरी

+2

sp_helprotect एसक्यूएल 2005 और बाद में मान्य नहीं है। Http://msdn.microsoft.com/en-us/library/ms190310.aspx देखें –

3

नियंत्रित करने वाली सभी अनुमतियों को सूचीबद्ध करने के लिए आप fn_my_permission फ़ंक्शन का उपयोग कर सकते हैं।

select * from fn_my_permissions(NULL, NULL) 

आप एक खाता sysadmin भूमिका है कि का उपयोग कर लॉगिन करना: इस क्वेरी सर्वर पर सभी अनुमतियों को सूचीबद्ध करता है।

आप निम्न मानकों का उपयोग करके फ़ंक्शन कॉल को परिष्कृत कर सकते हैं।

डेटाबेस पर सभी अनुमतियों के लिए:

select * from fn_my_permissions('dbo.test', 'object') 
: एक तालिका पर

select * from fn_my_permissions('dbo', 'schema') 

सभी अनुमतियों के लिए:

select * from fn_my_permissions(NULL, 'database') 

dbo पर सभी अनुमतियों के लिए स्कीमा

4

मुझे के। ब्रायन केली से जवाब पसंद आया, लेकिन मैं थोड़ी अधिक जानकारी (स्कीमा की तरह) चाहता था और साथ ही इसी अनुदान और रिवॉके स्टेटमेंट्स उत्पन्न करना चाहता था ताकि मैं उन्हें विभिन्न वातावरणों में लागू कर सकूं (जैसे देव/परीक्षण/प्रोड)।

ध्यान दें कि आप आसानी से प्रणाली वस्तुओं बाहर कर सकते हैं, टिप्पणी की देख जहां खंड

select 
    class_desc 
    ,USER_NAME(grantee_principal_id) as user_or_role 
    ,CASE WHEN class = 0 THEN DB_NAME() 
      WHEN class = 1 THEN ISNULL(SCHEMA_NAME(o.uid)+'.','')+OBJECT_NAME(major_id) 
      WHEN class = 3 THEN SCHEMA_NAME(major_id) END [Securable] 
    ,permission_name 
    ,state_desc 
    ,'revoke ' + permission_name + ' on ' + 
     isnull(schema_name(o.uid)+'.','')+OBJECT_NAME(major_id)+ ' from [' + 
     USER_NAME(grantee_principal_id) + ']' as 'revokeStatement' 
    ,'grant ' + permission_name + ' on ' + 
     isnull(schema_name(o.uid)+'.','')+OBJECT_NAME(major_id)+ ' to ' + 
     USER_NAME(grantee_principal_id) + ']' as 'grantStatement' 
FROM sys.database_permissions dp 
LEFT OUTER JOIN sysobjects o 
    ON o.id = dp.major_id 
-- where major_id >= 1 -- ignore sysobjects 

order by 
    class_desc desc 
    ,USER_NAME(grantee_principal_id) 
    ,CASE WHEN class = 0 THEN DB_NAME() 
     WHEN class = 1 THEN isnull(schema_name(o.uid)+'.','')+OBJECT_NAME(major_id) 
     WHEN class = 3 THEN SCHEMA_NAME(major_id) end 
    ,permission_name 
संबंधित मुद्दे