सबसे अधिक संभावना है, समस्या यह है कि अनुदान एक भूमिका के माध्यम से किया गया था। किसी उपयोगकर्ता को दिए गए विशेषाधिकार एक निश्चित अधिकार संग्रहीत कार्यविधि (डिफ़ॉल्ट) में उपलब्ध नहीं होते हैं।
SQL डेवलपर में, यह सत्यापित करना अपेक्षाकृत आसान है कि यह समस्या है। यदि आप कमांड चलाते हैं
SET ROLE none
और फिर सेलेक्ट स्टेटमेंट चलाएँ, मुझे उम्मीद है कि आपको वही ORA-00942 त्रुटि मिलेगी।
यह मानते हुए कि मामला है, समाधान आम तौर पर यह पूछना होगा कि YYY स्कीमा में तालिकाओं के मालिक भूमिका के माध्यम से पहुंच प्रदान करने के बजाय सीधे आपको टेबल तक पहुंच प्रदान करें। इसे छोड़कर, आप घोषणा में AUTHID CURRENT_USER जोड़कर अपनी संग्रहीत प्रक्रिया को एक आवेदक के अधिकार संग्रहीत प्रक्रिया के रूप में परिभाषित कर सकते हैं। ऐसा होगा कि प्रक्रिया के कॉलर को अंतर्निहित वस्तुओं तक पहुंच की आवश्यकता होगी लेकिन यह आपकी प्रक्रियाओं को भूमिका के माध्यम से दिए गए विशेषाधिकारों का उपयोग करने की अनुमति देगा।
यदि आप एक आह्वानकर्ता के अधिकार संग्रहीत प्रक्रिया बनाना चाहते हैं, तो आपको विशेषाधिकार जांच को रनटाइम पर स्थगित करने के लिए गतिशील SQL का उपयोग करके तालिका नाम का भी उल्लेख करना होगा। तो आपके पास कुछ ऐसा होगा
CREATE OR REPLACE PROCEDURE PRC_SOMESP
AUTHID CURRENT_USER
AS
l_cnt pls_integer;
BEGIN
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM yyy.TableA' INTO l_cnt;
END PRC_SOMESP;
यदि आप एक आवेदक के अधिकार संग्रहीत प्रक्रिया चाहते हैं जो स्कीमा XXX में TableA तालिका से पूछताछ करता है।