2009-06-03 12 views
16

मैं एक टेबल की विदेशी कुंजी खोजना चाहता हूं लेकिन एक ही नाम के साथ एक से अधिक उपयोगकर्ता/स्कीमा हो सकता है। मैं वर्तमान में लॉग इन उपयोगकर्ता को कैसे देख सकता हूं? क्या कोई ऐसा कार्य है जो इसके मालिक को देता है? क्या होगा यदि सार्वजनिक समानार्थी हैं?ओरेकल में ऑब्जेक्ट के स्वामी को मैं कैसे ढूंढ सकता हूं?

उत्तर

30

आप ALL_OBJECTS क्वेरी कर सकता है देखने: एक उपयोगकर्ता उपयोगकर्ता की SQL विवरण कोई स्कीमा योग्यता के साथ एक वस्तु नाम का संदर्भ यदि

select * 
    from ALL_SYNONYMS 
where synonym_name = 'FOO' 

बस स्पष्ट करने के लिए, (:

select owner 
    , object_name 
    , object_type 
    from ALL_OBJECTS 
where object_name = 'FOO' 

समानार्थी शब्द खोजने के लिए उदाहरण के लिए 'FOO'), ओरेकल FIRST उस नाम की किसी ऑब्जेक्ट के लिए उपयोगकर्ता की स्कीमा की जांच करता है (उस उपयोगकर्ता की स्कीमा में समानार्थी समेत)। यदि ओरेकल उपयोगकर्ता की स्कीमा से संदर्भ को हल नहीं कर सकता है, तो ओरेकल फिर सार्वजनिक समानार्थी के लिए जांच करता है।

आप एक विशेष TABLE_NAME पर बाधाओं के लिए विशेष रूप से देख रहे हैं:

select c.* 
    from all_constraints c 
where c.table_name = 'FOO' 
union all 
select cs.* 
    from all_constraints cs 
    join all_synonyms s 
    on (s.table_name = cs.table_name 
    and s.table_owner = cs.owner 
    and s.synonym_name = 'FOO' 
     ) 

HTH

- परिशिष्ट:

यदि आपका उपयोगकर्ता जैसे DBA_ विचारों के लिए उपयोग (दी जाती है आपके उपयोगकर्ता को SELECT_CATALOG_ROLE दिया गया है), आप पिछले SQL उदाहरणों में 'ALL_' के स्थान पर 'DBA_' को प्रतिस्थापित कर सकते हैं। ALL_x विचार केवल उन वस्तुओं को दिखाते हैं जिन्हें आपको विशेषाधिकार प्रदान किए गए हैं। DBA_x विचार सभी डेटाबेस ऑब्जेक्ट्स दिखाएंगे, भले ही आपके पास उनके पास विशेषाधिकार हों या नहीं।

+0

बस क्वेरी एक छोटे से अधिक लचीला बनाने के लिए, मैं क्वेरी होगा 'जहां कम (OBJECT_NAME) = ' foo'' यह विशेष रूप से सहायक होता है जब आपके पास फ़ंक्शन का नाम होता है, लेकिन आवरण नहीं (उदाहरण के लिए, किसी बाहरी प्रोग्राम में कॉल से, जो असंवेदनशील है, जैसा कि मेरे लिए मामला था)। – Travis

+0

@Travis: जो क्वेरी को और अधिक लचीला बना देगा। एसक्यूएल कथन में ओरेकल को "केस असंवेदनशील" पहचानकर्ताओं को कैसे देखता है, उससे अधिक बारीकी से मिलान करने के लिए, हम ** 'WHERE object_name = UPPER (' foo ') '** चाहते हैं। (एक पहचानकर्ता जो SQL कथन में डबल कोट्स में संलग्न नहीं है, ओरेकल द्वारा देखा जाता है जैसे कि यह ऊपरी मामला था। (ओरेकल पहचानकर्ता * केस संवेदनशील हैं; हमें उन्हें कम मामले को सुरक्षित रखने के लिए SQL कथन में डबल कोट्स में संलग्न करना होगा अक्षर। जब हम 'चयन * से foo' करते हैं, तो ओरेकल वास्तव में पहचानकर्ता को' FOO' के रूप में देखता है, जैसे कि हमने 'भोजन से चुनें' किया था।) – spencer7593

2

दिलचस्प सवाल - मैं वहाँ किसी भी ओरेकल समारोह है कि (लगभग एक "जो" यूनिक्स में आदेश की तरह) यह करता है नहीं लगता है, लेकिन आप से नाम के लिए संकल्प आदेश प्राप्त कर सकते हैं:

select * from 
(
select object_name objname, object_type, 'my object' details, 1 resolveOrder 
    from user_objects 
    where object_type not like 'SYNONYM' 
union all 
select synonym_name obj , 'my synonym', table_owner||'.'||table_name, 2 resolveOrder 
    from user_synonyms 
union all 
select synonym_name obj , 'public synonym', table_owner||'.'||table_name, 3 resolveOrder 
    from all_synonyms where owner = 'PUBLIC' 
) 
where objname like upper('&objOfInterest') 
1

ओरेकल सत्र के भीतर वर्तमान उपयोगकर्ता का नाम ढूंढने के लिए, USER फ़ंक्शन का उपयोग करें।

ध्यान दें कि बाधा के मालिक, विदेशी कुंजी वाले तालिका के मालिक, और संदर्भित तालिका के मालिक सभी अलग-अलग हो सकते हैं। ऐसा लगता है कि यह ’ तालिका आप मालिक है ’ रुचि रखते हैं, में जो मामले में आप यही चाहते के करीब होना चाहिए:

select Constraint_Name 
from All_Constraints 
where Table_Name = 'WHICHEVER_TABLE' 
    and Constraint_Type = 'R' and Owner = User; 
1

ALL_TABLES और ALL_CONSTRAINTS तरह ओरेकल विचारों को स्वामी स्तंभ है, जो आप करने के लिए उपयोग कर सकते हैं अपनी क्वेरी को प्रतिबंधित करें। सभी के बजाय USER के साथ शुरू होने वाली इन तालिकाओं के वेरिएंट भी हैं, जो केवल उन ऑब्जेक्ट्स को सूचीबद्ध करते हैं जिन्हें वर्तमान उपयोगकर्ता द्वारा एक्सेस किया जा सकता है।

these विचारों में से एक को आपकी समस्या को हल करने में मदद करनी चाहिए। वे हमेशा इसी तरह की समस्याओं के लिए मेरे लिए ठीक काम करते थे।

0

मुझे यह प्रश्न शीर्ष परिणाम के रूप में मिला, जबकि ओगकल में किसी तालिका के मालिक को कैसे ढूंढना है, इसलिए मैंने सोचा कि मैं दूसरों की सुविधा के लिए तालिका विशिष्ट उत्तर का योगदान दूंगा।

निम्न क्वेरी एक Oracle DB में एक विशिष्ट तालिका के मालिक को खोजने के लिए उपयोग करें:

select owner from ALL_TABLES where TABLE_NAME ='<MY-TABLE-NAME>'; 
संबंधित मुद्दे

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