टेबल-वैल्यू फ़ंक्शन पर अनुमति कैसे दें


21

क्या मैं यह ठीक कर रहा हूँ...?

मेरे पास एक फ़ंक्शन है जो पैसे लौटाता है ...

CREATE FUNCTION functionName( @a_principal money, @a_from_date
  datetime, @a_to_date datetime, @a_rate float )  RETURNS money AS BEGIN

  DECLARE @v_dint money   set @v_dint = computation_here
     set @v_dint = round(@v_dint, 2)

  RETURN @v_dint    
END 
GO 
Grant execute on functionName to another_user 
Go

Im सिर्फ सोच रहा था कि क्या यह संभव है कि iTVF में बदला जाए?

मैंने ऐसा करने की कोशिश की है, लेकिन मुझे एक त्रुटि मिली है:

CREATE FUNCTION functionName ( @a_principal money, @a_from_date
  datetime, @a_to_date datetime, @a_rate float )  
RETURNS TABLE AS 
RETURN SELECT returnMoney = computation_here  
GO  
Grant execute on functionName to another_user  Go

त्रुटि:

Msg 4606, लेवल 16, स्टेट 1, लाइन 2 ग्रांटेड या निरस्त विशेषाधिकार EXECUTE ऑब्जेक्ट के साथ संगत नहीं है।

इस फ़ंक्शन का उपयोग इस तरह किया जाता है:

update table_name set interest = functionName(col1,col2...) where...

अग्रिम में धन्यवाद!


जैसा कि आप अब एक तालिका लौटा रहे हैं, GRANT स्टेटमेंट को GRANT EXECUTE के बजाय GRANT SELECT होना चाहिए।
माइक

जवाबों:


33

स्केलर फ़ंक्शंस के लिए EXECUTEअनुमतियों की आवश्यकता होती है, हालाँकि जब आप टेबल वेल्यूएड फ़ंक्शन में परिवर्तित हो जाते हैं तो अनुमतियों में परिवर्तन की आवश्यकता होती है SELECT

अब आपको करना चाहिए GRANT SELECT ON functionName TO another_user;

से बोल :

मालिक के अलावा अन्य उपयोगकर्ताओं को किसी फ़ंक्शन (यदि फ़ंक्शन स्केलर-वैल्यू है) पर किसी फ़ंक्शन-SQL कथन में इसका उपयोग करने से पहले अनुमति दी जानी चाहिए। यदि फ़ंक्शन तालिका-मूल्यवान है, तो उपयोगकर्ता को संदर्भित करने से पहले फ़ंक्शन पर SELECT अनुमतियाँ होनी चाहिए।


और एक अन्य उत्तर पर RDFozz की टिप्पणी के अनुसार, यदि उपयोगकर्ता नाम में विशेष वर्ण हैं (जैसे कि DOMAINNAME \ उपयोगकर्ता नाम में एक बैकस्लैश), तो आपको उपयोगकर्ता नाम को वर्ग कोष्ठक में रखने की आवश्यकता है, अर्थात:grant select on functionName to [DOMAINNAME\username];
youcantrytmeme

0

इसे GRANT SELECT ON functionName TO [another_user]कोष्ठक के साथ - करने की आवश्यकता है ।


जब तक उपयोगकर्ता नाम में एक विशेष वर्ण नहीं होता तब तक ब्रैकेट वैकल्पिक होते हैं। चूंकि बैकस्लैश एक विशेष चरित्र है, और अक्सर उपयोगकर्ताओं के लिए w / विंडोज प्रमाणीकरण लॉगिन के उपयोगकर्ता नाम का हिस्सा होने जा रहा है, यह संभवतः ब्रैकेट का उपयोग करने की आदत में सबसे सुरक्षित है।
RDFozz

-4

मैंने उपयोग करने की कोशिश की:

GRANT SELECT ON functionName TO another_user

लेकिन यह काम नहीं किया, तो, मैं के EXECUTEबजाय इस्तेमाल किया SELECT, और यह अब काम करता है


मैं उत्सुक हूं कि आपने इसे कैसे प्रबंधित किया, क्योंकि grant executeSQL फ़ंक्शन पर प्रयास करने से हमेशा एक त्रुटि होगी।
इयान केम्प

3
यह शायद एक टेबल-वैल्यू फ़ंक्शन नहीं था, इसीलिए इसने काम किया।
डिएगो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.