Oracle उपयोगकर्ता का डिफ़ॉल्ट स्कीमा कैसे सेट करें?


12

मैंने Oracle में कुछ नए उपयोगकर्ता बनाए। हालाँकि, sqlplus चलाते समय, उन सभी को क्वेरी में तालिका नामों को पूरी तरह से योग्य बनाने की आवश्यकता होती है। इन नए उपयोगकर्ताओं के लिए डिफ़ॉल्ट स्कीमा सेट करने का सबसे अच्छा तरीका क्या है?

जवाबों:


19

set search_pathOracle में 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 लेनदेन में सर्वर पर त्रुटि लॉग करें और फिर इसे फिर से उठाएं ?
जॉर्ज 3

@ जॉर्ज 3: लेकिन अगर अपवाद वास्तव में फेंक दिया गया है, तो उपयोगकर्ता लॉग इन नहीं कर सकता है - मैं सिर्फ ट्रिगर में एक बेवकूफ गलती के कारण किसी को लॉग इन करने में सक्षम नहीं होने से रोकना चाहता था। लेकिन किसी को भी वह जो भी वह / वह चाहता है इस के लिए अनुकूलित करने के लिए स्वतंत्र है।
a_horse_with_no_name

0

मुझे नहीं लगता कि एक सेट करने का एक तरीका है। उपयोगकर्ता स्कीमा है। AFAIK आप केवल डिफ़ॉल्ट टेबलस्पेस सेट कर सकते हैं।

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