Add how_to_update_views.md
This commit is contained in:
parent
47984710c2
commit
fc4b0e882e
81
how_to_update_views.md
Normal file
81
how_to_update_views.md
Normal file
@ -0,0 +1,81 @@
|
||||
### 1. Определить зависимости представления
|
||||
|
||||
```sql
|
||||
WITH RECURSIVE view_dependencies AS (
|
||||
-- Начинаем с document_details
|
||||
SELECT
|
||||
c.oid AS view_oid,
|
||||
c.relname AS view_name,
|
||||
n.nspname AS schema_name,
|
||||
NULL::text COLLATE "C" AS depends_on -- явная коллация
|
||||
FROM pg_class c
|
||||
JOIN pg_namespace n ON c.relnamespace = n.oid
|
||||
WHERE c.relkind = 'v' -- Только представления
|
||||
AND c.relname = 'document_details'
|
||||
|
||||
UNION ALL
|
||||
|
||||
-- Находим представления, зависящие от текущего списка
|
||||
SELECT
|
||||
v.oid AS view_oid,
|
||||
v.relname AS view_name,
|
||||
n.nspname AS schema_name,
|
||||
d.view_name COLLATE "C" AS depends_on -- явная коллация
|
||||
FROM pg_class v
|
||||
JOIN pg_namespace n ON v.relnamespace = n.oid
|
||||
JOIN pg_views pv ON pv.schemaname = n.nspname AND pv.viewname = v.relname
|
||||
JOIN view_dependencies d ON pv.definition ILIKE '%' || d.view_name || '%'
|
||||
WHERE v.relkind = 'v' -- Только представления
|
||||
)
|
||||
SELECT * FROM view_dependencies;
|
||||
```
|
||||
|
||||
### 2.Сохранить текущие скрипты создания представлений
|
||||
|
||||
```sql
|
||||
SELECT format('CREATE OR REPLACE VIEW %I.%I AS %s;',
|
||||
n.nspname, c.relname, pg_get_viewdef(c.oid, true)) AS create_script
|
||||
FROM pg_class c
|
||||
JOIN pg_namespace n ON c.relnamespace = n.oid
|
||||
WHERE c.relkind = 'v'
|
||||
AND n.nspname = 'public'
|
||||
AND c.relname IN ('document_details', 'author_documents');
|
||||
|
||||
```
|
||||
|
||||
|
||||
### 3. Получить корректный порядок удаления
|
||||
|
||||
```sql
|
||||
WITH RECURSIVE dependencies AS (
|
||||
SELECT
|
||||
c.oid,
|
||||
c.relname AS object_name,
|
||||
n.nspname AS schema_name,
|
||||
'VIEW' AS object_type,
|
||||
NULL::text AS depends_on
|
||||
FROM pg_class c
|
||||
JOIN pg_namespace n ON c.relnamespace = n.oid
|
||||
WHERE c.relkind = 'v'
|
||||
AND c.relname = 'document_details'
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
d.refobjid AS oid,
|
||||
c.relname AS object_name,
|
||||
n.nspname AS schema_name,
|
||||
'VIEW' AS object_type,
|
||||
d.objid::regclass::text AS depends_on
|
||||
FROM pg_depend d
|
||||
JOIN pg_class c ON d.refobjid = c.oid
|
||||
JOIN pg_namespace n ON c.relnamespace = n.oid
|
||||
WHERE d.classid = 'pg_class'::regclass
|
||||
AND d.refclassid = 'pg_class'::regclass
|
||||
AND c.relkind = 'v'
|
||||
)
|
||||
SELECT format('DROP VIEW IF EXISTS %I.%I CASCADE;', schema_name, object_name) AS drop_script
|
||||
FROM dependencies
|
||||
ORDER BY object_type DESC;
|
||||
|
||||
```
|
||||
Loading…
x
Reference in New Issue
Block a user