From fc4b0e882e41de931c1398b877d209865511508f Mon Sep 17 00:00:00 2001 From: pashko Date: Sun, 16 Feb 2025 19:37:39 +0800 Subject: [PATCH] Add how_to_update_views.md --- how_to_update_views.md | 81 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 how_to_update_views.md diff --git a/how_to_update_views.md b/how_to_update_views.md new file mode 100644 index 0000000..8007291 --- /dev/null +++ b/how_to_update_views.md @@ -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; + +```