|
| 1 | +-- based on "Oracle Database Transactions and Locking Revealed" book by Thomas Kyte |
| 2 | +WITH |
| 3 | +ref_int_constraints AS ( |
| 4 | +SELECT /*+ MATERIALIZE NO_MERGE */ |
| 5 | + col.owner, |
| 6 | + col.table_name, |
| 7 | + col.constraint_name, |
| 8 | + con.status, |
| 9 | + con.r_owner, |
| 10 | + con.r_constraint_name, |
| 11 | + COUNT(*) col_cnt, |
| 12 | + MAX(CASE col.position WHEN 01 THEN col.column_name END) col_01, |
| 13 | + MAX(CASE col.position WHEN 02 THEN col.column_name END) col_02, |
| 14 | + MAX(CASE col.position WHEN 03 THEN col.column_name END) col_03, |
| 15 | + MAX(CASE col.position WHEN 04 THEN col.column_name END) col_04, |
| 16 | + MAX(CASE col.position WHEN 05 THEN col.column_name END) col_05, |
| 17 | + MAX(CASE col.position WHEN 06 THEN col.column_name END) col_06, |
| 18 | + MAX(CASE col.position WHEN 07 THEN col.column_name END) col_07, |
| 19 | + MAX(CASE col.position WHEN 08 THEN col.column_name END) col_08, |
| 20 | + MAX(CASE col.position WHEN 09 THEN col.column_name END) col_09, |
| 21 | + MAX(CASE col.position WHEN 10 THEN col.column_name END) col_10, |
| 22 | + MAX(CASE col.position WHEN 11 THEN col.column_name END) col_11, |
| 23 | + MAX(CASE col.position WHEN 12 THEN col.column_name END) col_12, |
| 24 | + MAX(CASE col.position WHEN 13 THEN col.column_name END) col_13, |
| 25 | + MAX(CASE col.position WHEN 14 THEN col.column_name END) col_14, |
| 26 | + MAX(CASE col.position WHEN 15 THEN col.column_name END) col_15, |
| 27 | + MAX(CASE col.position WHEN 16 THEN col.column_name END) col_16, |
| 28 | + par.owner parent_owner, |
| 29 | + par.table_name parent_table_name, |
| 30 | + par.constraint_name parent_constraint_name |
| 31 | + FROM dba_constraints con, |
| 32 | + dba_cons_columns col, |
| 33 | + dba_constraints par |
| 34 | + WHERE con.constraint_type = 'R' |
| 35 | + AND con.owner NOT IN ('ANONYMOUS','APEX_030200','APEX_040000','APEX_SSO','APPQOSSYS','CTXSYS','DBSNMP','DIP','EXFSYS','FLOWS_FILES','MDSYS','OLAPSYS','ORACLE_OCM','ORDDATA','ORDPLUGINS','ORDSYS','OUTLN','OWBSYS') |
| 36 | + AND con.owner NOT IN ('SI_INFORMTN_SCHEMA','SQLTXADMIN','SQLTXPLAIN','SYS','SYSMAN','SYSTEM','TRCANLZR','WMSYS','XDB','XS$NULL','PERFSTAT','STDBYPERF') |
| 37 | + AND col.owner = con.owner |
| 38 | + AND col.constraint_name = con.constraint_name |
| 39 | + AND col.table_name = con.table_name |
| 40 | + AND par.owner(+) = con.r_owner |
| 41 | + AND par.constraint_name(+) = con.r_constraint_name |
| 42 | + GROUP BY |
| 43 | + col.owner, |
| 44 | + col.constraint_name, |
| 45 | + col.table_name, |
| 46 | + con.status, |
| 47 | + con.r_owner, |
| 48 | + con.r_constraint_name, |
| 49 | + par.owner, |
| 50 | + par.constraint_name, |
| 51 | + par.table_name |
| 52 | +), |
| 53 | +ref_int_indexes AS ( |
| 54 | +SELECT /*+ MATERIALIZE NO_MERGE */ |
| 55 | + r.owner, |
| 56 | + r.constraint_name, |
| 57 | + c.table_owner, |
| 58 | + c.table_name, |
| 59 | + c.index_owner, |
| 60 | + c.index_name, |
| 61 | + r.col_cnt |
| 62 | + FROM ref_int_constraints r, |
| 63 | + dba_ind_columns c, |
| 64 | + dba_indexes i |
| 65 | + WHERE c.table_owner = r.owner |
| 66 | + AND c.table_name = r.table_name |
| 67 | + AND c.column_position <= r.col_cnt |
| 68 | + AND c.column_name IN (r.col_01, r.col_02, r.col_03, r.col_04, r.col_05, r.col_06, r.col_07, r.col_08, |
| 69 | + r.col_09, r.col_10, r.col_11, r.col_12, r.col_13, r.col_14, r.col_15, r.col_16) |
| 70 | + AND i.owner = c.index_owner |
| 71 | + AND i.index_name = c.index_name |
| 72 | + AND i.table_owner = c.table_owner |
| 73 | + AND i.table_name = c.table_name |
| 74 | + AND i.index_type != 'BITMAP' |
| 75 | + GROUP BY |
| 76 | + r.owner, |
| 77 | + r.constraint_name, |
| 78 | + c.table_owner, |
| 79 | + c.table_name, |
| 80 | + c.index_owner, |
| 81 | + c.index_name, |
| 82 | + r.col_cnt |
| 83 | +HAVING COUNT(*) = r.col_cnt |
| 84 | +) |
| 85 | +SELECT /*+ NO_MERGE */ * |
| 86 | + FROM ref_int_constraints c |
| 87 | + WHERE NOT EXISTS ( |
| 88 | +SELECT NULL |
| 89 | + FROM ref_int_indexes i |
| 90 | + WHERE i.owner = c.owner |
| 91 | + AND i.constraint_name = c.constraint_name |
| 92 | + AND i.col_cnt >= c.col_cnt |
| 93 | +) |
| 94 | + ORDER BY |
| 95 | + 1, 2, 3 |
| 96 | +/ |
0 commit comments