বিদেশী কী সীমাবদ্ধতার ডেটা কীভাবে পুনরুদ্ধার করবেন


10

আমি একটি পূর্ণাঙ্গ স্কিমার বিদেশী কী ইনফোগুলি (প্রতিটি লাইন: রেফারেন্সিং টেবিল এবং ক্ষেত্র, রেফারেন্সযুক্ত টেবিল এবং ক্ষেত্র) পুনরুদ্ধার করার মঞ্জুরি দিয়ে এমন একটি প্রশ্নের সন্ধান করছি।

আমি এটি খুঁজে পেয়েছি, তবে আমার প্রয়োজনীয় সমস্ত তথ্য দেয় না: /programming/4389228/sql-for-oracle-to-check-if-a-straint-exists

আমি বর্তমানে এটিতে কাজ করছি এবং পরবর্তী মিনিট / ঘন্টার মধ্যে একটি সমাধান দিয়ে শেষ হতে পারে। তবে কারও কাছে ইতিমধ্যে যদি একটি সম্পূর্ণ কার্যক্ষম সমাধান থাকে তবে আমি এটি জানতে পেরে আনন্দিত হব :)


এসকিউএল বিকাশকারীর জন্য, আপনি এই তথ্যটি একটি টেবিলের 'মডেল' ট্যাবে একটি ইআরডি ফর্ম্যাটে খুঁজে পেতে পারেন ( এখানে রেফারেন্স হিসাবে দেওয়া হয়েছে a কোনও স্ক্রিপ্টের জন্য দরকারী নয়, তবে যদি এখানে আমার মতো তথ্য এবং জমি প্রয়োজন হয় তবে এটি হতে পারে সহায়ক।
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

এসকিউএল বিকাশকারী একটি প্রতিবেদন দেয় যা কেবল এটি করে।

এটি কেবল লগইন স্কিমার জন্যই করে, তবে এটি ডাটাবেসে প্রতিটি একক এফকে পেতে একটি দ্রুত সমাধান - যদিও আপনি 'এপেক্স ...' এবং 'এসওয়াইএস' এর মতো স্কিমাকে বাদ দিতে চাইবেন।

এটি রিসাইকেল বিনের মতো টেবিলগুলি বাদ দেয়।

মূল প্রতিবেদনটি তথ্য পাতায় থাকে ডেটা অভিধানের প্রতিবেদনে।

সমস্ত এফকে পেতে এখানে সংশোধিত কোয়েরিটি দেওয়া আছে।

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

আপডেট করুন সরল ক্যোয়ারী যা প্রদত্ত টেবিলের এফকে রেফারেন্স রয়েছে এমন টেবিলগুলির তালিকা সংগ্রহ করে (আপনি যদি টেবিলের নামগুলির পরে সীমাবদ্ধতাগুলি পরিষ্কার করতে চান তবে দরকারী):

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.