मैंने Oracle में कुछ नए उपयोगकर्ता बनाए। हालाँकि, sqlplus चलाते समय, उन सभी को क्वेरी में तालिका नामों को पूरी तरह से योग्य बनाने की आवश्यकता होती है। इन नए उपयोगकर्ताओं के लिए डिफ़ॉल्ट स्कीमा सेट करने का सबसे अच्छा तरीका क्या है?
मैंने Oracle में कुछ नए उपयोगकर्ता बनाए। हालाँकि, sqlplus चलाते समय, उन सभी को क्वेरी में तालिका नामों को पूरी तरह से योग्य बनाने की आवश्यकता होती है। इन नए उपयोगकर्ताओं के लिए डिफ़ॉल्ट स्कीमा सेट करने का सबसे अच्छा तरीका क्या है?
जवाबों:
set search_path
Oracle में PostgreSQL की तरह कुछ भी नहीं है ।
निकटतम चीज जो मैं सोच सकता हूं कि उपयोगकर्ता के लिए एक लॉगऑन ट्रिगर होगा जो कि रन है ALTER SESSION SET CURRENT_SCHEMA ...
CREATE OR REPLACE TRIGGER LOGON_TRG
AFTER LOGON ON SCHEMA
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
EXCEPTION
when others
then null; -- prevent a login failure due to an exception
END;
/
यदि उपयोगकर्ताओं की सूची बहुत लंबी नहीं है, तो आप डेटाबेस लॉगऑन ट्रिगर बना सकते हैं ताकि आपको प्रत्येक उपयोगकर्ता के लिए वह ट्रिगर बनाने की आवश्यकता न हो:
CREATE OR REPLACE TRIGGER LOGON_TRG
AFTER LOGON ON DATABASE
BEGIN
if (user in ('TOM', 'DICK', 'HARRY')) then
EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
end if;
exception
when others
then null; -- prevent a login failure due to an exception
END logon_trg;
/
बेशक उन उपयोगकर्ताओं की सूची जहां आप डिफ़ॉल्ट स्कीमा बदलना चाहते हैं, एक तालिका से भी लिया जा सकता है। उस स्थिति में आपको केवल इस सुविधा को "सक्रिय" करने के लिए पंक्तियों को सम्मिलित करने या हटाने की आवश्यकता है (बजाय हर बार ट्रिगर को फिर से बनाने के)।
एक और विकल्प यह होगा कि आप हर बार जब आप उपयोगकर्ता को वास्तविक टेबल पर इंगित करते हैं तो समानार्थी शब्द बनाएं। आप एक स्कीमा में सभी तालिकाओं के माध्यम से छोरों कि संग्रहीत प्रक्रिया का उपयोग करके स्वचालित कर सकते हैं और दूसरे स्कीमा में उनके लिए समानार्थक शब्द बना सकते हैं।
जब तक आपके सभी ओरेकल उपयोगकर्ता एक ही टेबल पर काम नहीं करते हैं, मैं सार्वजनिक समानार्थी शब्द का उपयोग करने के खिलाफ दृढ़ता से सलाह दूंगा जो आपको केवल एक बार बनाना होगा - यदि आपके इंस्टॉलेशन में अलग-अलग एप्लिकेशन उपयोगकर्ता मौजूद हैं, तो वे बहुत परेशानी पैदा कर सकते हैं।
संपादित करें :
एलेक्स के सुझाव के बाद, यहां एक लॉगऑन ट्रिगर है जो उपयोगकर्ता नाम के बजाय भूमिका की जांच करता है:
CREATE OR REPLACE TRIGGER LOGON_TRG
AFTER LOGON ON DATABASE
declare
has_role boolean;
BEGIN
has_role := dbms_session.is_role_enabled('FOOBAR_ROLE');
if (has_role) then
EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
end if;
exception
when others
then null; -- prevent a login failure due to an exception
END logon_trg;
/
when others then null;
यह एक पकड़-सभी है, यह समस्या निवारण को जटिल करेगा क्योंकि यह किसी भी त्रुटि को अदृश्य बनाता है। हो सकता है कि अपवाद हैंडलिंग पूरी तरह से हटा दें या किसी AUTONOMOUS लेनदेन में सर्वर पर त्रुटि लॉग करें और फिर इसे फिर से उठाएं ?