ओरेकल एसक्यूएल डेवलपर में दी गई तालिका के संदर्भ में मैं किस तालिका को ढूँढ सकता हूँ?


199

में Oracle SQL डेवलपर , मैं एक मेज पर जानकारी देख रहा हूँ अगर, मैं की कमी है, जो मुझे विदेशी कुंजी (और इस प्रकार जो टेबल इस तालिका द्वारा संदर्भित कर रहे हैं) देखते हैं देख सकते हैं, और मैं क्या देखने के लिए निर्भरता देख सकते हैं पैकेज और इस तरह के संदर्भ तालिका। लेकिन मुझे यकीन नहीं है कि कैसे पता लगाया जाए कि कौन सी तालिका तालिका को संदर्भित करती है।

उदाहरण के लिए, मान लीजिए कि मैं empतालिका देख रहा हूं । एक और तालिका है emp_deptजो पकड़ती है कि कौन से कर्मचारी किन विभागों में काम करते हैं, जो empतालिका emp_idके प्राथमिक तालिका के माध्यम से संदर्भित करता है emp। क्या कोई रास्ता है (कार्यक्रम में कुछ यूआई तत्व के माध्यम से, एसक्यूएल के माध्यम से नहीं) यह पता लगाने के लिए कि emp_deptतालिका तालिका का संदर्भ देती empहै, मेरे बिना यह जानने के लिए कि emp_deptतालिका मौजूद है?

जवाबों:


258

नहीं। Oracle SQL Developer से ऐसा कोई विकल्प उपलब्ध नहीं है।

आपको हाथ से किसी क्वेरी को निष्पादित करना होगा या अन्य टूल का उपयोग करना होगा (उदाहरण के लिए PLSQL डेवलपर के पास ऐसा विकल्प है)। निम्नलिखित SQL वह है जो PLSQL डेवलपर द्वारा उपयोग किया जाता है:

select table_name, constraint_name, status, owner
from all_constraints
where r_owner = :r_owner
and constraint_type = 'R'
and r_constraint_name in
 (
   select constraint_name from all_constraints
   where constraint_type in ('P', 'U')
   and table_name = :r_table_name
   and owner = :r_owner
 )
order by table_name, constraint_name

r_ownerस्कीमा कहां है, और r_table_nameवह तालिका है जिसके लिए आप संदर्भ ढूंढ रहे हैं। नाम केस संवेदी हैं


ओरेकल एसक्यूएल डेवलपर की रिपोर्ट टैब पर सावधान रहें क्योंकि "ऑल टेबल / डिपेंडेंसीज़" विकल्प है यह ALL_DEPENDENCIES से है जो " प्रक्रियाओं, पैकेजों, फ़ंक्शंस, पैकेज बॉडीज़ के बीच निर्भरता और वर्तमान उपयोगकर्ता के लिए ट्रिगर्स निर्भर करता है, जिसमें निर्भरता भी शामिल है।" किसी भी डेटाबेस लिंक के बिना बनाए गए विचारों पर। " । फिर, इस रिपोर्ट का आपके प्रश्न के लिए कोई मूल्य नहीं है।


30
जवाब के लिए धन्यवाद। चूसने के लिए Oracle Sql डेवलपर पर शर्म आती है।
ग्रेग

1
आपने इस कार्य को करने में सक्षम होने के कारण PLSQL डेवलपर का उल्लेख किया, क्या आप बता सकते हैं कि कैसे?
निकोलस

4
@ निकोलस, ऑब्जेक्ट ब्राउज़र में, एक टेबल का चयन करें, एक टेबल पर राइट-क्लिक करें और "विदेशी कुंजी संदर्भ" का चयन करें
FerranB

3
यह उत्तर बताता है कि SQL डेवलपर 4.1 और अब के पास एक विकल्प "मॉडल" टैब है जो इस जानकारी को ईआरडी प्रारूप में दिखाएगा।
SnoringFrog

1
r_owner वह स्कीमा है जिसका आप उपयोग कर रहे हैं, r_table_name वह तालिका है जिसे आप संदर्भों के लिए देख रहे हैं
Flowy

108

एक्सटेंशन के रूप में SQL डेवलपर में इसे जोड़ने के लिए निम्न कार्य करें:

  1. नीचे दिए गए कोड को xml फ़ाइल में सहेजें (जैसे fk_ref.xml):
<items>
    <item type="editor" node="TableNode" vertical="true">
    <title><![CDATA[FK References]]></title>
    <query>
        <sql>
            <![CDATA[select a.owner,
                            a.table_name,
                            a.constraint_name,
                            a.status
                     from   all_constraints a
                     where  a.constraint_type = 'R'
                            and exists(
                               select 1
                               from   all_constraints
                               where  constraint_name=a.r_constraint_name
                                      and constraint_type in ('P', 'U')
                                      and table_name = :OBJECT_NAME
                                      and owner = :OBJECT_OWNER)
                               order by table_name, constraint_name]]>
        </sql>
    </query>
    </item>
</items>
  1. SQL डेवलपर में एक्सटेंशन जोड़ें:

    • उपकरण> प्राथमिकताएँ
    • डेटाबेस> उपयोगकर्ता परिभाषित एक्सटेंशन
    • "रो जोड़ें" बटन पर क्लिक करें
    • टाइप में "EDITOR" चुनें, वह स्थान जहाँ आपने ऊपर xml फ़ाइल को सहेजा है
    • "ओके" पर क्लिक करें फिर SQL डेवलपर को पुनरारंभ करें
  2. किसी भी तालिका पर नेविगेट करें और अब आपको FK सन्दर्भों को लेबल करते हुए SQL एक के बगल में एक अतिरिक्त टैब देखना चाहिए, जो नई FK जानकारी प्रदर्शित करता है।

  3. संदर्भ


क्या आप जानते हैं कि संकुल का नोड नाम क्या है? वेब पर मुझे मिलने वाले सभी xsd लिंक अब मान्य नहीं हैं (जैसा कि Oracle ने उन्हें हटा दिया है)।
जेम्स सुमेर

1
मैंने आपके सुझाव में एक छोटा सा परिवर्तन जोड़ा: और मालिक = उपयोगकर्ता द्वारा आदेश से पहले, जैसे कि यदि आपके पास दो
स्कीमाओं

मैंने यह शर्त जोड़ी: and owner = :OBJECT_OWNERपहले and exists
एम डेनिस

3
@ एम-डेनिस, इस मामले में आप अन्य स्कीमा से संदर्भ याद कर सकते हैं।
Youw

इस लागू करने और चलाने के बाद describe books;और select * from books;, यह Oracle SQL डेवलपर वी एम पर FK संदर्भ टैब नहीं दिखाती है।
mLstudent33

36

नीचे दी गई क्वेरी में साम्राज्य के साथ [आपका टेबल] बदलें

select owner,constraint_name,constraint_type,table_name,r_owner,r_constraint_name
  from all_constraints 
 where constraint_type='R'
   and r_constraint_name in (select constraint_name 
                               from all_constraints 
                              where constraint_type in ('P','U') 
                                and table_name='[YOUR TABLE]');

मुझे लगता constraint_type in ('P','U') है कि यह अतिश्योक्तिपूर्ण है, क्योंकि यदि एक बाधा TOTO का अवरोध_ 'टाइप' 'R' है, तो TOTO का r_constraint_name निश्चित रूप से संदर्भित तालिका में 'P' OR 'U' प्रकार की बाधा का नाम है। इसे निर्दिष्ट करने की कोई आवश्यकता नहीं है। आप एक का उपयोग कर रहे हैं IN, इसलिए यह बहुत सारे की तरह है ORऔर हम केवल OR के एकमात्र ऑपरेंड की परवाह करते हैं जो सच का मूल्यांकन करता है।
गब 是

10

आप इसे ALL_CONSTRAINTSदृश्य से क्वेरी करने में सक्षम हो सकते हैं :

SELECT table_name
FROM ALL_CONSTRAINTS
WHERE constraint_type = 'R' -- "Referential integrity"
  AND r_constraint_name IN
    ( SELECT constraint_name
      FROM ALL_CONSTRAINTS
      WHERE table_name = 'EMP'
        AND constraint_type IN ('U', 'P') -- "Unique" or "Primary key"
    );

1
विदेशी कुंजी अद्वितीय कुंजी को संदर्भित कर सकती है, न केवल प्राथमिक कुंजी, साथ ही, तालिका नाम का उपयोग कई स्कीमाओं में किया जा सकता है जिसके परिणामस्वरूप कई मैच होंगे। यदि आप 'All_Constraints' का उपयोग करने जा रहे हैं, तो 'Owner' कॉलम का उपयोग करने की आवश्यकता है, न कि 'User_Constraints' की।
मार्क रोडी

टिप्पणी करने के लिए धन्यवाद कि 'आर' 'यू' और 'पी' क्या हैं
जेएफ

SQL अनुरोध के अंत में अर्धविराम को न भूलें।
गाब :59

वैसे, constraint_type में ('P', 'U') का उपयोग बहुत कम है, क्योंकि यदि किसी constraint TOTO का constraint_type 'R' है, तो TOTO का r_constraintname निश्चित रूप से 'P' या 'U' U 'U' प्रकार के एक बाधा का नाम है 'संदर्भित तालिका में। इसे निर्दिष्ट करने की कोई आवश्यकता नहीं है।
गाब 好人

9

SQL डेवलपर 4.1, 2015 के मई में रिलीज़ किया गया, एक मॉडल टैब जोड़ा गया जो तालिका विदेशी कुंजियों को दिखाता है जो एक इकाई संबंध आरेख प्रारूप में आपकी तालिका को संदर्भित करता है।


1
कम उपयोगी यदि आपको किसी कारण से स्क्रिप्ट में इसकी आवश्यकता है, लेकिन अगर आपको बस उन कनेक्शनों के बारे में जानना है जो यह जाने का आधुनिक तरीका लगता है।
SnoringFrog

1
@SnoringFrog अच्छी तरह से तकनीकी रूप से सवाल एक यूआई तत्व के लिए पूछता है तो यह सबसे उपयुक्त जवाब है
WhatsThePoint

4

इस जैसे किसी और के बारे में क्या राय है:

SELECT c.constraint_name, c.constraint_type, c2.constraint_name, c2.constraint_type, c2.table_name
  FROM dba_constraints c JOIN dba_constraints c2 ON (c.r_constraint_name = c2.constraint_name)
 WHERE c.table_name = <TABLE_OF_INTEREST>
   AND c.constraint_TYPE = 'R';

2
यह मेरे लिए काम किया जब मैं से तालिका नाम बदल दिया है dba_constraintsकरने के लिए all_constraintsतो जैसे:SELECT c.constraint_name, c.constraint_type, c2.constraint_name, c2.constraint_type, c2.table_name FROM all_constraints c JOIN all_constraints c2 ON (c.r_constraint_name = c2.constraint_name) WHERE c.table_name = '<TABLE_OF_INTEREST>' AND c.constraint_TYPE = 'R';
chrisjleu

4
SELECT DISTINCT table_name, 
                constraint_name, 
                column_name, 
                r_table_name, 
                position, 
                constraint_type 
FROM   (SELECT uc.table_name, 
               uc.constraint_name, 
               cols.column_name, 
               (SELECT table_name 
                FROM   user_constraints 
                WHERE  constraint_name = uc.r_constraint_name) r_table_name, 
               (SELECT column_name 
                FROM   user_cons_columns 
                WHERE  constraint_name = uc.r_constraint_name 
                       AND position = cols.position)           r_column_name, 
               cols.position, 
               uc.constraint_type 
        FROM   user_constraints uc 
               inner join user_cons_columns cols 
                       ON uc.constraint_name = cols.constraint_name 
        WHERE  constraint_type != 'C') 
START WITH table_name = '&&tableName' 
           AND column_name = '&&columnName' 
CONNECT BY NOCYCLE PRIOR table_name = r_table_name 
                         AND PRIOR column_name = r_column_name; 

यह बेहद उपयोगी है - एक निश्चित रूट तालिका से सभी तालिकाओं को दिखाता है, जो इस रूट तालिका में आपके द्वारा चुने गए कॉलम के मुख्य मूल्य के रूप में हैं। शानदार, धन्यवाद।
Ev0oD

यह वास्तव में अच्छा है - अच्छा काम। मैं केवल table_name और column_name की तुलना करने के लिए कम () जोड़ूंगा।
टोबियास ओटो

4

यह उत्पाद में वर्षों से है - हालांकि यह 2011 में उत्पाद में नहीं था।

लेकिन, बस मॉडल पेज पर क्लिक करें।

सुनिश्चित करें कि आप इस सुविधा का उपयोग करने के लिए कम से कम संस्करण 4.0 (2013 में जारी) पर हैं।

यहां छवि विवरण दर्ज करें


0

Sql डेवलपर प्लगइन के लिए उपर्युक्त उत्तर को जोड़ने के लिए, नीचे दिए गए xml का उपयोग करने से विदेशी कुंजी से जुड़े कॉलम को प्राप्त करने में मदद मिलेगी।

    <items>
        <item type="editor" node="TableNode" vertical="true">
        <title><![CDATA[FK References]]></title>
        <query>
            <sql>
                <![CDATA[select a.owner,
                                a.constraint_name,
                                a.table_name,
                                b.column_name,
                                a.status
                         from   all_constraints a
                         join   all_cons_columns b ON b.constraint_name = a.constraint_name
                         where  a.constraint_type = 'R'
                                and exists(
                                   select 1
                                   from   all_constraints
                                   where  constraint_name=a.r_constraint_name
                                          and constraint_type in ('P', 'U')
                                          and table_name = :OBJECT_NAME
                                          and owner = :OBJECT_OWNER)
                                   order by table_name, constraint_name]]>
            </sql>
        </query>
        </item>
    </items>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.