2010-03-04 11 views
8

मैं ज्यादातर एक दैवज्ञ नौसिखिया हूँ, इसलिए मुझे माफ कर दो अगर यह एक बेवकूफ सवाल यह है कि के रूप में निष्पादित ...एक Oracle संग्रहित प्रोक एक अन्य उपयोगकर्ता

मैं एक स्कीमा एक संग्रहीत proc कि मनमाने ढंग से कार्यान्वित के साथ 'कोड' नामक एसक्यूएल (अभी के लिए, कृपया उससे जुड़े संभावित सुरक्षा मुद्दों को अनदेखा करें)। जो एसक्यूएल पास किया गया है वह डेटा का चयन करेगा; लेकिन सभी डेटा स्कीमा ए, बी, या सी में रहते हैं - लेकिन एसक्यूएल एक समय में केवल एक स्कीमा से ही चयन करेगा।

उदाहरण के लिए: प्रकार ए का उपयोगकर्ता एक स्ट्रिंग 'चयन * से * ASERTABLE' बनाता है - जबकि प्रकार बी के उपयोगकर्ता एक स्ट्रिंग 'चयन * से BUSERTABLE' बनाता है।

जो मैं करने की कोशिश कर रहा हूं वह उपयोगकर्ता को अपनी स्कीमा को स्पष्ट रूप से निर्दिष्ट करने की अनुमति नहीं देता है। फ्रंट एंड नेट एप्लिकेशन में; मुझे पहले से ही पता है कि वे टाइप ए, बी, या सी हैं। मैं चाहता हूं कि सभी तीन बस 'उपयोगकर्ता से चुनें' दर्ज करें।

मेरी समस्या यह है कि मुझे नहीं पता कि यह कैसे करना है। मेरा ऐप केवल 'कोड' स्कीमा में प्रो निष्पादित कर सकता है - इसलिए मैं कोड को डुप्लिकेट नहीं कर सकता और उपयोगकर्ता को 'एएक्सक्यूट एसक्यूएल' कॉल करने देता हूं।

मैंने कुछ चीजों की कोशिश की है; लेकिन अब तक कुछ भी काम नहीं किया है। मैं ExecuteSQL proc को कोड स्कीमा में रहना चाहता हूं; लेकिन जब 'USERTABLE' पास हो जाता है, तो मुझे यह जानने की आवश्यकता होती है कि कभी-कभी इसका अर्थ है AUSERNAME और कभी-कभी B.USERNAME।

कोई सुझाव?

उत्तर

10

उपयोग:

ALTER SESSION SET CURRENT_SCHEMA = schema 

equivalent to SQL Server's EXECUTE AS syntax है।

+0

यह कैसे काम करता है? पहला एप्लिकेशन इस 'ALTER' कथन को निष्पादित करता है या प्रक्रिया' कोड 'में निष्पादित करता है? – Guru

+1

http://asktom.oracle.com/pls/asktom/f?p=100:11TP:::P11_QUESTION_ID:588045400346317188 में कुछ और जानकारी है। ऐसा लगता है कि आप इसे अपने संग्रहीत प्रो के अंदर गतिशील एसक्यूएल (तत्काल निष्पादित) के साथ कर सकते हैं। –

+0

@ गुरू: रोब पी के AskTom लिंक देखें –

7

एक और विकल्प AUTHID CURRENT_USER pragma का उपयोग करेगा।

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

यानी

CREATE FUNCTION examplefunc 
    (pSqlStatement IN VARCHAR2) 
RETURN INTEGER 
    AUTHID CURRENT_USER 
AS 
    lResult INTEGER; 
BEGIN 
    EXECUTE IMMEDIATE pSqlStatement INTO lResult; 
    RETURN lResult; 
END examplefunc; 

ध्यान दें कि कार्यों और प्रक्रियाओं अंदरूनी सूत्र एक पैकेज के लिए, pragma केवल लागू किया जा सकता ओवरराइड करता है पैकेज स्तर पर। आप प्रति कार्य आधार पर अधिकार निर्धारित नहीं कर सकते हैं।

यह उपयोगकर्ताओं के विशेषाधिकारों के साथ निष्पादित करने के लिए फ़ंक्शन, पैकेज इत्यादि के अंदर किसी भी SQL का कारण बनना चाहिए।

मैंने इसे समान रूप से 'एसक्यूएल गतिशील रूप से किसी भी पुराने बिट को चलाने के लिए' नियमित रूप से प्रबंधित करने के लिए उपयोग किया है - कम से कम आप एक 'सामान्य' उपयोगकर्ता को एक टेबल ड्रॉप करने के लिए अपनी संग्रहीत प्रक्रिया का उपयोग करने में सक्षम होने से रोक देंगे। कोड स्कीमा में अतिरिक्त कोड स्थापित करें।

(यह भी लायक हो सकता है - यदि आप पहले से नहीं हैं - कुछ कीवर्ड को फेंकने के लिए कुछ सत्यापन जोड़ना - यानी चयन के साथ शुरू करना चाहिए, इसमें एम्बेडेड पीएल/एसक्यूएल ब्लॉक नहीं होना चाहिए - जो भी आप बिना तोड़ने से दूर हो सकते हैं मौजूदा कोड)।

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