· 9 years ago · Oct 07, 2016, 08:38 AM
1ИнÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ Ð´Ð»Ñ Ð¿Ð¾ÑˆÐ°Ð³Ð¾Ð²Ð¾Ð³Ð¾ ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ FK Ñ Ðталоном и наката ÐедоÑтающих FK в Целевую Collapse source
2--!! (1 запроÑ) Отрабатываем на Ðталоне
3SELECT DISTINCT
4 '(''' ||
5 t.table_name || ''',''' ||
6 l.column_name || ''',''' ||
7 k.table_name || ''',''' ||
8 k.column_name || ''',''' ||
9 pg_constraint.confupdtype || ''',''' ||
10 pg_constraint.confdeltype || ''',''' ||
11 t.constraint_name || '''),'
12FROM information_schema.constraint_table_usage t
13 JOIN information_schema.constraint_column_usage l ON
14 t.constraint_name = l.constraint_name
15 JOIN information_schema.key_column_usage k ON t.constraint_name =
16 k.constraint_name
17 JOIN information_schema.table_constraints c ON t.constraint_name =
18 c.constraint_name
19 JOIN pg_constraint ON pg_constraint.conname = t.constraint_name
20WHERE c.constraint_type = 'FOREIGN KEY';
21----!! Ð’Ñе запроÑÑ‹ ниже отрабатываем на Целевой БД
22CREATE TABLE IF NOT EXISTS tmp_cons_etalon (
23 k_tablename VARCHAR(255),
24 k_column_name VARCHAR(255),
25 f_table_name VARCHAR(255),
26 f_coumn_name VARCHAR(255),
27 confupdtype VARCHAR(15),
28 confdeltype VARCHAR(15),
29 constraint_name VARCHAR(255)
30) WITHOUT OIDS;
31CREATE TABLE IF NOT EXISTS tmp_cons_this (
32 k_tablename VARCHAR(255),
33 k_column_name VARCHAR(255),
34 f_table_name VARCHAR(255),
35 f_coumn_name VARCHAR(255),
36 confupdtype VARCHAR(15),
37 confdeltype VARCHAR(15),
38 constraint_name VARCHAR(255)
39) WITHOUT OIDS;
40
41DELETE FROM tmp_cons_this;
42
43INSERT INTO tmp_cons_this
44(
45SELECT DISTINCT
46 t.table_name,
47 l.column_name,
48 k.table_name,
49 k.column_name,
50 pg_constraint.confupdtype,
51 pg_constraint.confdeltype,
52 t.constraint_name
53FROM information_schema.constraint_table_usage t
54 JOIN information_schema.constraint_column_usage l ON
55 t.constraint_name = l.constraint_name
56 JOIN information_schema.key_column_usage k ON t.constraint_name =
57 k.constraint_name
58 JOIN information_schema.table_constraints c ON t.constraint_name =
59 c.constraint_name
60 JOIN pg_constraint ON pg_constraint.conname = t.constraint_name
61WHERE c.constraint_type = 'FOREIGN KEY'
62);
63
64
65-- 1. Ð’ÑтавлÑем результат запроÑа (1 запроÑ) в блокнот, добавлÑем
66-- 2. "INSERT INTO tmp_cons_etalon VALUES", в поÑледней Ñтроке менÑем "," на ";".
67-- ПолучитÑÑ Ð¿Ð¾Ñ…Ð¾Ð¶Ð¸Ð¹ запроÑ:
68-- INSERT INTO tmp_cons_etalon VALUES
69-- ('address_code_book','id','address_code','book_id','a','a','fkfb92358b108e7d1'),
70-- .........................
71-- ('address_element','id','address_code','element_id','a','c','fkfb923587c264bd0');
72-- 3. Отрабатываем его на Ñерве.
73
74
75 --!! (2 запроÑ)
76SELECT 'ALTER TABLE ' || p.f_table_name || ' ADD CONSTRAINT ' || p.constraint_name || '
77 FOREIGN KEY (' || p.f_coumn_name || ')
78 REFERENCES ' || p.k_tablename || '(' || p.k_column_name || ')
79 ON DELETE ' || CASE p.confdeltype
80 WHEN 'a' THEN 'NO ACTION'
81 WHEN 'c' THEN 'CASCADE'
82 WHEN 'n' THEN 'SET NULL'
83 WHEN 'd' THEN 'SET DEFAULT'
84 WHEN 'r' THEN 'RESTRICT'
85 ELSE NULL
86 END || '
87 ON UPDATE ' || CASE p.confupdtype
88 WHEN 'a' THEN 'NO ACTION'
89 WHEN 'c' THEN 'CASCADE'
90 WHEN 'n' THEN 'SET NULL'
91 WHEN 'd' THEN 'SET DEFAULT'
92 WHEN 'r' THEN 'RESTRICT'
93 ELSE NULL
94 END || '
95 NOT DEFERRABLE;'
96FROM tmp_cons_etalon p
97JOIN (
98SELECT t.k_tablename,
99 t.k_column_name,
100 t.f_table_name,
101 t.f_coumn_name
102 -- t.constraint_name,
103 -- t.confupdtype,
104 -- t.confdeltype
105FROM tmp_cons_etalon t
106EXCEPT --INTERSECT
107SELECT t.k_tablename,
108 t.k_column_name,
109 t.f_table_name,
110 t.f_coumn_name
111 --t.constraint_name,
112 -- t.confupdtype,
113 -- t.confdeltype
114FROM tmp_cons_this t
115) t ON t.k_tablename = p.k_tablename AND
116 t.k_column_name = p.k_column_name AND
117 t.f_table_name = p.f_table_name AND
118 t.f_coumn_name = p.f_coumn_name;
119
120--!! Результат запроÑа отрабатываем поÑтрочно или Ñкопом (еÑли БД не активно иÑпользуетÑÑ ), в завиÑимоÑти от текущей загруженноÑти БД и риÑках заблочить чаÑть ÑущноÑтей