วิธีการดึงข้อมูลข้อ จำกัด คีย์ต่างประเทศ


10

ฉันกำลังมองหาข้อความค้นหาที่อนุญาตให้ดึงข้อมูลคีย์ต่างประเทศ (แต่ละบรรทัด: ตารางอ้างอิงและฟิลด์, ตารางอ้างอิงและฟิลด์อ้างอิง) ของสคีมาทั้งหมด

ฉันได้พบสิ่งนี้แล้ว แต่ไม่ได้ให้ข้อมูลทั้งหมดที่ฉันต้องการ: /programming/4389228/sql-for-oracle-to-check-if-a-constraint-export

ขณะนี้ฉันกำลังดำเนินการอยู่และอาจสิ้นสุดด้วยวิธีแก้ไขปัญหาในนาที / ชั่วโมงถัดไป แต่ถ้าใครมีวิธีแก้ปัญหาการทำงานที่สมบูรณ์แล้วฉันจะดีใจที่ได้รู้ :)


สำหรับนักพัฒนา SQL คุณสามารถค้นหาข้อมูลนี้ในรูปแบบ ERD ในแท็บ 'Model' บนตาราง (ตามที่อ้างถึงที่นี่ไม่มีประโยชน์สำหรับสคริปต์ แต่ถ้าคุณต้องการข้อมูลและจุดที่นี่เหมือนที่ฉันทำ มีประโยชน์
SnoringFrog

คำตอบ:


13

หลังจาก "วิศวกรรมย้อนกลับ" บางรายการในเคียวรีที่ทำโดยเครื่องมือNavicatเมื่อเปิดหน้าต่างตารางออกแบบสำหรับตาราง (แบบสอบถามที่ดึงข้อมูลเกี่ยวกับคีย์ต่างประเทศแสดงขึ้นในหน้าต่างประวัติ ) นี่คือวิธีแก้ไข:

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 Developer มาพร้อมกับรายงานที่ทำสิ่งนี้

มันใช้สำหรับสกีมาเข้าสู่ระบบเท่านั้น แต่เป็นการแก้ไขอย่างรวดเร็วเพื่อให้ได้รับ FK ทุกรายการในฐานข้อมูล - แม้ว่าคุณอาจต้องการข้ามแบบแผนเช่น 'APEX ... ' และ '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

รหัสที่ซับซ้อนเล็กน้อยซึ่งยังทิ้งความคิดเห็นใน cols (ตามรหัส Frosty):

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 / )

UPDATEแบบสอบถามที่เรียบง่ายกว่าซึ่งรวบรวมรายการตารางที่มีการอ้างอิง 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 '/';
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.