2010-03-28 11 views
10

SQL सर्वर 2008 का उपयोग करना, एक संग्रहित प्रक्रिया के माध्यम से केवल तालिका में सम्मिलित करने की अनुमति देने का एक तरीका है, और यदि ऐसा है तो कैसे?केवल संग्रहीत प्रक्रिया के माध्यम से बल INSERT

संपादित करें:
जाना सबसे अच्छा तरीका शायद एक INSTEAD OF INSERT ट्रिगर का उपयोग करने के मार्टिन स्मिथ के सुझाव है। इस प्रश्न का सीधा जवाब marc_s 'ग्रांट और डेनी के साथ है, हालांकि यह कुछ उपयोगकर्ता खातों को सीमित नहीं करेगा।

+0

की [संग्रहित प्रक्रिया और अनुमतियां संभावित डुप्लिकेट (आपका संगृहीत प्रक्रिया अपेक्षित मान को यह सेट कर सकते हैं) - पर्याप्त पर अमल ?] (http://stackoverflow.com/questions/3815411/stored-procedure-and-permissions-is-execute-enough) –

उत्तर

9

बस किसी भी डेटाबेस उपयोगकर्ता (और आपकी "सार्वजनिक" भूमिका) तालिका में INSERT अनुमति प्रदान न करें।

उन उपयोगकर्ताओं को आईएनएसईआरटी संग्रहीत प्रोसेस निष्पादित करने की अनुमति दें - इस तरह, वे संग्रहीत प्रो को कॉल कर सकते हैं, लेकिन वे सीधे अंतर्निहित तालिका में कोई भी डेटा सम्मिलित नहीं कर सकते हैं।

DENY INSERT ON dbo.YourTable TO PUBLIC 
GRANT EXECUTE ON dbo.InsertDataProc TO PUBLIC 
+0

यह * केवल * तरीका है ... यह मानते हुए कि कनेक्शन db_owner या sysadmin नहीं है ... – gbn

+0

यह मेरे लिए काम नहीं करता है। मुझे लगता है कि 'ऑब्जेक्ट पर INSERT अनुमति अस्वीकार कर दी गई थी ...' जब भी मैं एक संग्रहीत प्रक्रिया निष्पादित कर रहा हूं जो INSERT करता है। मैं एसक्यूएल 2012 का उपयोग कर रहा हूं। आह, मैंने अभी सीखा है कि ऐसा इसलिए है क्योंकि यह जवाब काम नहीं करेगा अगर INSERT proc के अंदर गतिशील एसक्यूएल के साथ किया जाता है। –

6

तालिका पर अनुमति INSERT अस्वीकार करें, और संग्रहीत प्रक्रिया पर अतिरिक्त अनुमति दें।

2

अनुमतियों का उपयोग करें (अनुदान)। एसपी बनाएं और execute को उपयोगकर्ता या प्रश्न में भूमिका के लिए दें। फिर तालिका पर insert से इनकार करें, आपको एक सेट होना चाहिए।

4

प्रश्न के लिए प्रेरणा क्या है? क्या ऐसा इसलिए है क्योंकि संग्रहित प्रक्रिया में कुछ तर्क शामिल हैं कि जब भी डेटा डाला जाता है तो आप बाहर किए जा रहे हैं? यदि ऐसा है तो आप इस तर्क को समाहित करने के लिए एक ट्रिगर का उपयोग करना चाहेंगे।

यदि यह उपयुक्त नहीं है और आप सिसडमिन अनुमतियों वाले लोगों को सीधे तालिका में डालने से रोकना चाहते हैं, तो आप नहीं कर सकते हैं, लेकिन आप यह सुनिश्चित कर सकते हैं कि INSTEAD OF INSERT ट्रिगर का उपयोग करके यह गलती से नहीं होता है कि एक त्रुटि को जन्म देती है और वापस रोल जब तक एक निश्चित CONTEXT_INFO मूल्य तो सेट कर दिया जाता साफ करता है CONTEXT_INFO

http://msdn.microsoft.com/en-us/library/aa214382%28SQL.80%29.aspx

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