कैसे विदेशी कुंजी डेटा पुनर्प्राप्त करने के लिए


10

मैं एक संपूर्ण स्कीमा की विदेशी कुंजी इन्फोस (प्रत्येक पंक्ति: रेफ़रिंग टेबल और फ़ील्ड, रेफ़रेंस टेबल और फ़ील्ड) को पुनः प्राप्त करने की अनुमति देने वाली क्वेरी की तलाश कर रहा हूं।

मुझे यह मिल गया है, लेकिन मुझे वह सारी जानकारी नहीं देनी चाहिए जिसकी मुझे ज़रूरत है: /programming/4389228/sql-for-oracle-to-check-if-a-constraint-exists

मैं वर्तमान में इस पर काम कर रहा हूं और अगले मिनट / घंटों में समाधान के साथ समाप्त हो सकता है। लेकिन अगर किसी के पास पहले से ही एक पूर्ण कार्य समाधान है, तो मुझे यह जानकर खुशी होगी :)


SQL डेवलपर के लिए, आप एक तालिका में 'मॉडल' टैब में ईआरडी प्रारूप में इस जानकारी को पा सकते हैं (जैसा कि यहां संदर्भित है । स्क्रिप्ट के लिए उपयोगी नहीं है, लेकिन अगर आपको सिर्फ जानकारी की आवश्यकता है और यहां जमीन की तरह जैसे मैंने किया था, हो सकता है। मददगार।
SnoringFrog

जवाबों:


13

एक टेबल के लिए डिज़ाइन टेबल विंडो खोलते समय नविकट टूल द्वारा किए गए प्रश्नों पर कुछ "रिवर्स-इंजीनियरिंग" के बाद ( इतिहास विंडो में विदेशी कुंजियों के बारे में जानकारी प्राप्त करने वाले प्रश्न ), यहाँ एक समाधान है:

SELECT
    CONS.CONSTRAINT_NAME,
    CONS.TABLE_NAME,
    COLS.COLUMN_NAME,
    CONS.R_CONSTRAINT_NAME,
    CONS_R.TABLE_NAME R_TABLE_NAME,
    COLS_R.COLUMN_NAME R_COLUMN_NAME

FROM USER_CONSTRAINTS CONS
    LEFT JOIN USER_CONS_COLUMNS COLS ON COLS.CONSTRAINT_NAME = CONS.CONSTRAINT_NAME
    LEFT JOIN USER_CONSTRAINTS CONS_R ON CONS_R.CONSTRAINT_NAME = CONS.R_CONSTRAINT_NAME
    LEFT JOIN USER_CONS_COLUMNS COLS_R ON COLS_R.CONSTRAINT_NAME = CONS.R_CONSTRAINT_NAME

-- returns only foreign key constraints
WHERE CONS.CONSTRAINT_TYPE = 'R'

ORDER BY CONS.TABLE_NAME, COLS.COLUMN_NAME

2

SQL डेवलपर एक रिपोर्ट के साथ जहाज करता है जो सिर्फ यही करता है।

यह इसे केवल लॉगिन स्कीमा के लिए करता है, लेकिन यह डेटाबेस में हर एक FK को प्राप्त करने के लिए एक त्वरित फिक्स है - हालांकि आप 'अपेक्स ...' और 'SYS' जैसे स्कीमा को छोड़ना चाहते हैं।

यह रीसायकल बिन में टेबल जैसी चीजों को भी छोड़ देता है।

मूल रिपोर्ट डेटा पैनल की रिपोर्ट में रिपोर्ट पैनल में है।

यहां सभी FK पाने के लिए संशोधित क्वेरी है।

    SELECT
    c.owner "Owner",
    c.table_name "Table_Name",
    c.constraint_name "Constraint_Name",
    c.delete_rule "Delete_Rule",
    d.columns,
    c.r_owner "Owner of Related Table",
    (
        SELECT
            r.table_name
        FROM
            sys.all_constraints r
        WHERE
            c.r_owner = r.owner
        AND
            c.r_constraint_name = r.constraint_name
    ) "Related Table",
    c.r_constraint_name "Related Constraint"
FROM
    sys.all_constraints c,
    (
        SELECT
            a.owner,
            a.table_name,
            a.constraint_name,
            MAX(
                DECODE(position,1,substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,2,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,3,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,4,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,5,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,6,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,7,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,8,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,9,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,10,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,11,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,12,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,13,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,14,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,15,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,16,','
                 ||  substr(column_name,1,30),NULL)
            ) columns
        FROM
            sys.all_constraints a,
            sys.all_cons_columns b
        WHERE
            a.constraint_name = b.constraint_name
        AND
            a.owner = b.owner
        AND
            a.constraint_type = 'R'
        AND
            substr(a.table_name,1,4) != 'BIN$'
        AND
            substr(a.table_name,1,3) != 'DR$'
        AND (
                :table_name IS NULL
            OR
                instr(upper(a.table_name),upper(:table_name) ) > 0
        ) GROUP BY
            a.owner,
            a.table_name,
            a.constraint_name
    ) d
WHERE
    c.owner = d.owner
AND
    c.table_name = d.table_name
AND
    c.constraint_name = d.constraint_name
ORDER BY
    c.owner,
    c.table_name,
    c.constraint_name

और यहाँ क्या है कि रिपोर्ट की तरह लग रहा है।

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


1

एक छोटा सा जटिल कोड जो कॉल्स पर टिप्पणी डंप करता है (फ्रॉस्टी कोड के आधार पर):

SELECT
    dt.table_name, dt.column_name, dt.data_type, dt.data_length,
    constr.r_tbl r_table, constr.r_col r_column,
    comm.comments
  FROM user_col_comments comm, user_tab_columns dt
  LEFT OUTER JOIN (
    SELECT
      cons.table_name tbl,
      cols.column_name col,
      cons_r.table_name r_tbl,
      cols_r.column_name r_col
    FROM user_constraints cons
      LEFT JOIN user_cons_columns cols ON cols.constraint_name = cons.constraint_name
      LEFT JOIN user_constraints cons_r ON cons_r.constraint_name = cons.r_constraint_name
      LEFT JOIN user_cons_columns cols_r ON cols_r.constraint_name = cons.r_constraint_name
    WHERE cons.constraint_type = 'R'
    ) constr ON constr.tbl = dt.table_name AND constr.col = dt.column_name
  WHERE dt.table_name = comm.table_name
    AND dt.column_name = comm.column_name
  ORDER BY dt.table_name, dt.column_name
  ;

उत्पादन अधिक पठनीय मैं उपयोग करने के लिए break on TABLE_NAME;में sqlplus(मेरे सवाल का रंग-रूप /programming/14998296/print-only-first-unique-value-for-column-that-order-by-in-oracle-sqlplus / ) है।

अद्यतन सरल क्वेरी जो सारणी की FK संदर्भ वाली तालिकाओं की सूची एकत्र करती है (उपयोगी यदि आप तालिका नाम बदलने के बाद बाधाओं को साफ करना चाहते हैं):

select * from SYS.USER_CONSTRAINTS cons
  join SYS.USER_CONSTRAINTS rcons on rcons.CONSTRAINT_NAME = cons.R_CONSTRAINT_NAME
  where cons.CONSTRAINT_TYPE = 'R' and rcons.TABLE_NAME 'TBL_NAME';

select * from SYS.USER_CONSTRAINTS cons
  join SYS.USER_CONSTRAINTS rcons on rcons.CONSTRAINT_NAME = cons.R_CONSTRAINT_NAME
  where cons.CONSTRAINT_TYPE = 'R' and rcons.TABLE_NAME like '%/_OLD' escape '/';
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.