Add owner/schema support for constraints

This commit is contained in:
Jan Kvetina 2022-03-10 21:27:55 +01:00
parent 06abbd0f1f
commit 1922730481
3 changed files with 59 additions and 37 deletions

View File

@ -1,46 +1,53 @@
CREATE OR REPLACE VIEW obj_constraints AS CREATE OR REPLACE VIEW obj_constraints AS
WITH x AS ( WITH x AS (
SELECT /*+ MATERIALIZE */ SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_item('$TABLE_NAME') AS table_name app.get_item('$TABLE_NAME') AS table_name
FROM DUAL FROM DUAL
), ),
n AS ( n AS (
SELECT XMLTYPE(DBMS_XMLGEN.GETXML('SELECT c.constraint_name AS name, c.search_condition AS text SELECT /*+ MATERIALIZE */
FROM user_constraints c XMLTYPE(DBMS_XMLGEN.GETXML('SELECT c.constraint_name AS name, c.search_condition AS text
WHERE c.table_name = NVL(''' || x.table_name || ''', c.table_name) FROM all_constraints c
WHERE c.owner = ''' || x.owner || '''
AND c.table_name = NVL(''' || x.table_name || ''', c.table_name)
AND c.constraint_type = ''C'' AND c.constraint_type = ''C''
')) AS constraint_source ')) AS constraint_source
FROM x FROM x
), ),
s AS ( s AS (
SELECT SELECT /*+ MATERIALIZE */
EXTRACTVALUE(s.object_value, '/ROW/NAME') AS constraint_name, EXTRACTVALUE(s.object_value, '/ROW/NAME') AS constraint_name,
EXTRACTVALUE(s.object_value, '/ROW/TEXT') AS search_condition EXTRACTVALUE(s.object_value, '/ROW/TEXT') AS search_condition
FROM n FROM n
CROSS JOIN TABLE(XMLSEQUENCE(EXTRACT(n.constraint_source, '/ROWSET/ROW'))) s CROSS JOIN TABLE(XMLSEQUENCE(EXTRACT(n.constraint_source, '/ROWSET/ROW'))) s
), ),
p AS ( p AS (
SELECT SELECT /*+ MATERIALIZE */
n.table_name, n.table_name,
n.constraint_name, n.constraint_name,
k.table_name AS primary_table, k.table_name AS primary_table,
LISTAGG(p.column_name, ', ') WITHIN GROUP (ORDER BY p.position) AS primary_cols, LISTAGG(p.column_name, ', ') WITHIN GROUP (ORDER BY p.position) AS primary_cols,
n.r_constraint_name AS primary_constraint n.r_constraint_name AS primary_constraint
FROM user_constraints n FROM all_constraints n
JOIN x JOIN x
ON n.table_name = NVL(x.table_name, n.table_name) ON x.owner = n.owner
JOIN user_cons_columns c AND n.table_name = NVL(x.table_name, n.table_name)
ON c.constraint_name = n.constraint_name JOIN all_cons_columns c
JOIN user_cons_columns p ON c.owner = n.owner
ON p.constraint_name = n.r_constraint_name AND c.constraint_name = n.constraint_name
JOIN all_cons_columns p
ON p.owner = n.owner
AND p.constraint_name = n.r_constraint_name
AND p.position = c.position AND p.position = c.position
JOIN user_constraints k JOIN all_constraints k
ON k.constraint_name = n.r_constraint_name ON k.owner = n.owner
AND k.constraint_name = n.r_constraint_name
WHERE n.constraint_type = 'R' WHERE n.constraint_type = 'R'
GROUP BY n.table_name, n.constraint_name, k.table_name, n.r_constraint_name GROUP BY n.table_name, n.constraint_name, k.table_name, n.r_constraint_name
), ),
c AS ( c AS (
SELECT SELECT /*+ MATERIALIZE */
n.table_name, n.table_name,
n.constraint_name, n.constraint_name,
n.constraint_type, n.constraint_type,
@ -53,11 +60,13 @@ c AS (
MAX(CASE WHEN n.deferrable = 'DEFERRABLE' THEN 'Y' END) AS is_deferred, MAX(CASE WHEN n.deferrable = 'DEFERRABLE' THEN 'Y' END) AS is_deferred,
-- --
MAX(n.delete_rule) AS delete_rule MAX(n.delete_rule) AS delete_rule
FROM user_constraints n FROM all_constraints n
JOIN x JOIN x
ON n.table_name = NVL(x.table_name, n.table_name) ON x.owner = n.owner
JOIN user_cons_columns c AND n.table_name = NVL(x.table_name, n.table_name)
ON c.constraint_name = n.constraint_name JOIN all_cons_columns c
ON c.owner = n.owner
AND c.constraint_name = n.constraint_name
LEFT JOIN s LEFT JOIN s
ON s.constraint_name = n.constraint_name ON s.constraint_name = n.constraint_name
AND s.search_condition = '"' || c.column_name || '" IS NOT NULL' AND s.search_condition = '"' || c.column_name || '" IS NOT NULL'

View File

@ -1,6 +1,7 @@
CREATE OR REPLACE VIEW obj_constraints_fix_dt1 AS CREATE OR REPLACE VIEW obj_constraints_fix_dt1 AS
WITH x AS ( WITH x AS (
SELECT /*+ MATERIALIZE */ SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_item('$TABLE_NAME') AS table_name app.get_item('$TABLE_NAME') AS table_name
FROM DUAL FROM DUAL
), ),
@ -23,14 +24,19 @@ s AS (
n.constraint_type, n.constraint_type,
c.constraint_name, c.constraint_name,
n.r_constraint_name n.r_constraint_name
FROM user_tab_columns a FROM all_tab_columns a
JOIN user_tables t JOIN x
ON t.table_name = a.table_name ON x.owner = a.owner
JOIN user_cons_columns c JOIN all_tables t
ON c.table_name = a.table_name ON t.owner = a.owner
AND t.table_name = a.table_name
JOIN all_cons_columns c
ON c.owner = a.owner
AND c.table_name = a.table_name
AND c.column_name = a.column_name AND c.column_name = a.column_name
JOIN user_constraints n JOIN all_constraints n
ON n.constraint_name = c.constraint_name ON n.owner = c.owner
AND n.constraint_name = c.constraint_name
AND n.constraint_type IN ('P', 'R') AND n.constraint_type IN ('P', 'R')
ORDER BY a.table_name, n.constraint_type, n.constraint_name, a.column_name ORDER BY a.table_name, n.constraint_type, n.constraint_name, a.column_name
) )

View File

@ -1,6 +1,7 @@
CREATE OR REPLACE VIEW obj_constraints_fix_dt2 AS CREATE OR REPLACE VIEW obj_constraints_fix_dt2 AS
WITH x AS ( WITH x AS (
SELECT /*+ MATERIALIZE */ SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_item('$TABLE_NAME') AS table_name app.get_item('$TABLE_NAME') AS table_name
FROM DUAL FROM DUAL
), ),
@ -20,11 +21,15 @@ s AS (
-- --
ELSE a.data_type ELSE a.data_type
END AS data_type END AS data_type
FROM user_tab_columns a FROM all_tab_columns a
JOIN user_tables t JOIN x
ON t.table_name = a.table_name ON x.owner = a.owner
LEFT JOIN user_mviews m JOIN all_tables t
ON m.mview_name = a.table_name ON t.owner = a.owner
AND t.table_name = a.table_name
LEFT JOIN all_mviews m
ON m.owner = a.owner
AND m.mview_name = a.table_name
LEFT JOIN obj_constraints_fix_dt1 d LEFT JOIN obj_constraints_fix_dt1 d
ON d.foreign_table = a.table_name ON d.foreign_table = a.table_name
AND d.foreign_column = a.column_name AND d.foreign_column = a.column_name
@ -33,7 +38,7 @@ s AS (
AND d.foreign_table IS NULL -- skip columns marked as FK errors AND d.foreign_table IS NULL -- skip columns marked as FK errors
), ),
t AS ( t AS (
SELECT SELECT /*+ MATERIALIZE */
s.column_name, s.column_name,
s.data_type, s.data_type,
-- --
@ -43,15 +48,17 @@ t AS (
), ),
r AS ( r AS (
-- unmatching column data types -- unmatching column data types
SELECT t.* SELECT /*+ MATERIALIZE */
t.*
FROM t FROM t
CROSS JOIN x CROSS JOIN x
WHERE ( WHERE (
t.column_name IN ( t.column_name IN (
SELECT c.column_name SELECT c.column_name
FROM user_tab_cols c FROM all_tab_cols c
JOIN x JOIN x
ON x.table_name = c.table_name ON x.owner = c.owner
AND x.table_name = c.table_name
) )
OR x.table_name IS NULL OR x.table_name IS NULL
) )