Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц / 16 сообщений из 16, страница 1 из 1
16.11.2020, 00:28
    #40018629
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц
Задача :
1 ) Хранение в специальной таблице (назовём её meta ) ссылок на таблицы и столбцы других таблиц.
2 ) При переименовании таблиц и столбцов эти ссылки должны сохранять свою целостность (должны оставаться рабочими).
3 ) При восстановлении БД из дампа эти ссылки должны сохранять свою целостность (должны оставаться рабочими).

На первый взгляд, со ссылками на таблицы задача решается с помощью столбца meta.table типа regclass : при переименовании таблиц мы всегда будет видеть в meta.table текущие (актуальные) имена таблиц. Но поскольку тип regclass фактически хранит идентификатор oid , то при восстановлении БД из дампа все такие ссылки потеряют актуальность (целостность).

Что касается столбцов, то для них вообще ничего нет - даже псевдотипа regatt (столбцы не являются глобальными объектами PostgreSQL и в системных таблицах не имеют собственных oid ).

Поскольку триггеров на ALTER TABLE не существует, то единственным вариантом вижу хранение имён таблиц и столбцов, а при их переименовании - аналогичное переименование строк-имён в таблице meta (UPDATE-запросом).

Есть ли ещё какие варианты ?
...
Рейтинг: 0 / 0
16.11.2020, 09:30
    #40018660
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц
Cyrax_02

Есть ли ещё какие варианты ?


Вы зря на счет "триггеров на ALTER TABLE не существует"
Можете попробовать через https://www.postgresql.org/docs/13/sql-createeventtrigger.html / https://www.postgresql.org/docs/13/event-trigger-definition.html
конечно, он как раз для таких извращений и придуман. Так и 2 и 3 решится.

PS: в сём омуте живут драконы (в смысле вероятнее всего ничего хорошего из вашей затеи в целом не получится без совершенно запредельного объема работы). Обьясните нафига вам это надо может все сильно проще можно сделать.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
17.11.2020, 00:15
    #40019186
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц
Maxim BogukОбьясните нафига вам это надо может все сильно проще можно сделать.Задача банальная: учёт изменения данных.
Проще - это как? У меня просто никогда не бывает. Карма такая...

Maxim BogukPS: в сём омуте живут драконы (в смысле вероятнее всего ничего хорошего из вашей затеи в целом не получится без совершенно запредельного объема работы ).Вот, состряпал:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE OR REPLACE FUNCTION tr_alter_table_handler() RETURNS event_trigger LANGUAGE plpgsql AS $$
DECLARE
    info RECORD; sql_expr varchar;
    table_names  varchar[]; re_table_rename  varchar := '(?:(?:"(?:""|[^"])+"|[^"\s]+)\s*\.\s*)?("(?:""|[^"])+"|[^"\s]+)(?:(?<=")|(?=\s))\s*RENAME\s+TO\s*(?:(?<=\s)|(?="))(?:(?:"(?:""|[^"])+"|[^"\s]+)\s*\.\s*)?("(?:""|[^"])+"|[^"\s]+)(?:\s*;)?\s*$';
    column_names varchar[]; re_column_rename varchar := 'RENAME(?:\s+COLUMN)?\s*(?:(?<=\s)|(?="))("(?:""|[^"])+"|[^"\s]+)(?:(?<=")|(?=\s))\s*TO\s*(?:(?<=\s)|(?="))("(?:""|[^"])+"|[^"\s]+)(?:\s*;)?\s*$';
BEGIN
    FOR info IN SELECT * FROM pg_event_trigger_ddl_commands() LOOP
        sql_expr := current_query();  -- здесь по-хорошему нужно парсить info.pg_ddl_command, но в PostgreSQL для этого нет функций
        
        IF(info.object_identity LIKE '...') THEN     -- фильтрация отслеживаемых таблиц
            table_names := regexp_match(sql_expr, re_table_rename);
            column_names := CASE WHEN (table_names IS NULL) THEN regexp_match(sql_expr, re_column_rename) ELSE NULL END;
		
            IF(table_names IS NOT NULL) THEN	     -- переименование таблицы
                EXECUTE format('UPDATE meta SET table = ''%s'' WHERE table = ''%s''', table_names[2], table_names[1]);
            ELSEIF(column_names IS NOT NULL) THEN    -- переименование столбца
                EXECUTE format('UPDATE meta SET column = ''%s'' WHERE column = ''%s''', column_names[2], column_names[1]);
            END IF;
        END IF;
    END LOOP;
END; $$;

CREATE EVENT TRIGGER tr_alter_table ON ddl_command_end WHEN TAG IN ('ALTER TABLE') EXECUTE PROCEDURE tr_alter_table_handler();
...
Рейтинг: 0 / 0
17.11.2020, 00:49
    #40019196
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц
Если имена столбцов не содержат имён таблиц, то при переименовании столбцов нужно ещё добавить проверку таблицы (т.к. в разных таблицах могут быть одноимённые столбцы). И тогда второе регулярное выражение "по протяжённости" станет длиннее первого.
...
Рейтинг: 0 / 0
17.11.2020, 01:06
    #40019198
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц
Окончательный вариант (с проверкой таблицы при переименовании столбца):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE OR REPLACE FUNCTION tr_alter_table_handler() RETURNS event_trigger LANGUAGE plpgsql AS $$
DECLARE
    info RECORD; sql_expr varchar;
    table_names  varchar[]; re_table_rename  varchar := '(?:(?:"(?:""|[^"])+"|[^"\s]+)\s*\.\s*)?("(?:""|[^"])+"|[^"\s]+)(?:(?<=")|(?=\s))\s*RENAME\s+TO\s*(?:(?<=\s)|(?="))(?:(?:"(?:""|[^"])+"|[^"\s]+)\s*\.\s*)?("(?:""|[^"])+"|[^"\s]+)(?:\s*;)?\s*$';
    column_names varchar[]; re_column_rename varchar := '(?:(?:"(?:""|[^"])+"|[^"\s]+)\s*\.\s*)?("(?:""|[^"])+"|[^"\s]+)(?:(?<=")|(?=\s))\s*RENAME(?:\s+COLUMN)?\s*(?:(?<=\s)|(?="))("(?:""|[^"])+"|[^"\s]+)(?:(?<=")|(?=\s))\s*TO\s*(?:(?<=\s)|(?="))("(?:""|[^"])+"|[^"\s]+)(?:\s*;)?\s*$';
BEGIN
    FOR info IN SELECT * FROM pg_event_trigger_ddl_commands() LOOP
        sql_expr := current_query();  -- здесь по-хорошему нужно парсить info.pg_ddl_command, но в PostgreSQL для этого нет функций
        
        IF(info.object_identity LIKE '...') THEN     -- фильтрация отслеживаемых таблиц
            table_names := regexp_match(sql_expr, re_table_rename);
            column_names := CASE WHEN (table_names IS NULL) THEN regexp_match(sql_expr, re_column_rename) ELSE NULL END;
		
            IF(table_names IS NOT NULL) THEN	     -- переименование таблицы
                EXECUTE format('UPDATE meta SET table = ''%s'' WHERE table = ''%s''', table_names[2], table_names[1]);
            ELSEIF(column_names IS NOT NULL) THEN    -- переименование столбца
                EXECUTE format('UPDATE meta SET column = ''%s'' WHERE table = ''%s'' AND column = ''%s''', column_names[3], column_names[1], column_names[2]);
            END IF;
        END IF;
    END LOOP;
END; $$;

CREATE EVENT TRIGGER tr_alter_table ON ddl_command_end WHEN TAG IN ('ALTER TABLE') EXECUTE PROCEDURE tr_alter_table_handler();
...
Рейтинг: 0 / 0
17.11.2020, 01:25
    #40019206
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц
Cyrax_02,

А добавление - удаление столбцов у вас не бывает?

ps: для целей аудита - бессмысленно тот у кого есть права на alter у него вероятнее всего окажется достаточно прав чтобы триггер отключить.

pps: "Задача банальная: учёт изменения данных." какое же это изменение данных если это изменение структуры а его отслеживают путем непускания кого попала в базу и внос любых изменений скриптами миграции которые под системой контроля версий живут.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
17.11.2020, 09:07
    #40019257
Guzya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц
Такое


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
CREATE OR REPLACE FUNCTION information_schema.notice_ddl_event() RETURNS event_trigger
LANGUAGE plpgsql
AS $$
DECLARE
r RECORD;
log text;
activity RECORD;
BEGIN

    select CASE WHEN COALESCE(current_setting('notice_ddl_event.log',true),'off') = '' THEN 'off' WHEN COALESCE(current_setting('notice_ddl_event.log',true),'off') = 'off' THEn 'off' ELSE 'on' END INTO log;
    IF log = 'on' THEN
      RAISE INFO 'TAG: %   EVENT: %', tg_tag, tg_event;
    END IF;
    IF tg_tag != 'DROP TABLE' AND tg_event != 'sql_drop' THEN
      FOR r IN SELECT *,clock_timestamp() as "time",current_query() as current_query FROM pg_event_trigger_ddl_commands() LOOP
        select usename,application_name,client_addr,client_port,pid ,query,backend_xid from pg_stat_activity where pid=pg_backend_pid() INTO activity;
        EXECUTE 'insert into information_schema.ddl_events (timest,classid,objid,objsubid,tag,object_type,object_identity,pid,query,usename,application_name,client_addr,client_port,backend_xid,current_query) values($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15);'
          USING r.time, r.classid, r.objid, r.objsubid, r.command_tag, r.object_type, r.object_identity,activity.pid,activity.query,activity.usename,activity.application_name,activity.client_addr,activity.client_port,activity.backend_xid,r.current_query;
        IF log = 'on' THEN
          RAISE INFO '% :  % : % : % : % : % : % '
                      ,r.time
                      ,r.classid
                      ,r.objid
                      ,r.objsubid
                      ,r.command_tag
                      ,r.object_type
                      ,r.object_identity
                      ;

        END IF;  --- log
      END LOOP;
    END IF;

    IF tg_event = 'sql_drop' THEN
      FOR r IN SELECT *, clock_timestamp() as "time",current_query() as current_query FROM pg_event_trigger_dropped_objects()
        LOOP
          IF r.is_temporary != true  THEN
            select usename,application_name,client_addr,client_port,pid,query,backend_xid from pg_stat_activity where pid=pg_backend_pid() INTO activity;
            EXECUTE 'insert into information_schema.ddl_events (timest,classid,objid,objsubid,tag,object_type,object_identity,event_tag,pid,query,usename,application_name,client_addr,client_port,backend_xid,current_query) values($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16);'
              USING r.time, r.classid, r.objid, r.objsubid, tg_tag, r.object_type, r.object_identity,'DROP',activity.pid,activity.query,activity.usename,activity.application_name,activity.client_addr,activity.client_port,activity.backend_xid,r.current_query;
            IF log = 'on' THEN
              RAISE INFO '% :  % : % : % : % : % : %'
                        ,r.time
                        ,r.classid
                        ,r.objid
                        ,r.objsubid
                        ,tg_tag
                        ,r.object_type
                        ,r.object_identity
                        ;
            END IF;  --- log
          END IF;    --- drop
      END LOOP;
    END IF;
END;
$$;


------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS information_schema.ddl_events (
    id serial,                           ---
    timest timestamp without time zone,  --- clock_timestamp()
    classid oid,                         --- pg_event_trigger_ddl_commands().classid/pg_event_trigger_dropped_objects().classid
    objid oid,                           --- pg_event_trigger_ddl_commands().objid/pg_event_trigger_dropped_objects().objid
    objsubid integer,                    --- pg_event_trigger_ddl_commands().objsubid/pg_event_trigger_dropped_objects().objsubid
    tag text,                            --- pg_event_trigger_ddl_commands().command_tag/TG_TAG
    object_type text,                    --- pg_event_trigger_ddl_commands().object_type/pg_event_trigger_dropped_objects().object_type
    object_identity text,                --- pg_event_trigger_ddl_commands().object_identity/pg_event_trigger_dropped_objects().object_identity
    event_tag text,                      --- /"DROP"
    query text,                          --- pg_stat_activity.query
    current_query text,                  --- current_query()
    pid integer,                         --- pg_stat_activity.pid
    usename text,                        --- pg_stat_activity.usename
    application_name text,               --- pg_stat_activity.application_name
    client_addr text,                    --- pg_stat_activity.client_addr
    client_port text,                    --- pg_stat_activity.client_port
    backend_xid xid,                      --- pg_stat_activity.backend_xid
    export_time timestamp without time zone --- проставляется программой централизованного сбора статистики
);


------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
CREATE EVENT TRIGGER tr_event_drops
   ON sql_drop
   EXECUTE FUNCTION information_schema.notice_ddl_event();

CREATE EVENT TRIGGER tr_event_no_drops
  ON ddl_command_end
  EXECUTE FUNCTION information_schema.notice_ddl_event();



1. до конца не определился какие столбцы оставить, а какие убрать из information_schema.ddl_events
2. не учитывается работа с ролями\пользователями
3. на некоторых моментах идет двойная запись
4. действует на уровне бд в которой создано
...
Рейтинг: 0 / 0
17.11.2020, 12:00
    #40019338
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц
Maxim BogukА добавление - удаление столбцов у вас не бывает?Так при удалении/добавлении столбцов в таблице с историей ничего не меняется. Соответственно, ничего делать не нужно.
Как я написал выше, задачей является учёт изменения данных , а не структуры таблиц/БД.

авторps: для целей аудита - бессмысленно тот у кого есть права на alter у него вероятнее всего окажется достаточно прав чтобы триггер отключитьЧтобы триггер отключить, нужны права суперпользователя.

Maxim Bogukpps: "Задача банальная: учёт изменения данных." какое же это изменение данных если это изменение структуры а его отслеживают путем непускания кого попала в базуНет, это именно отслеживание изменения данных. Для решения этой задачи необходимо обеспечить корректное хранение ссылок на таблицы и столбцы. Именно эта подзадача и озвучена в сабже.
...
Рейтинг: 0 / 0
17.11.2020, 13:05
    #40019374
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц
GuzyaТакое
...
1. до конца не определился какие столбцы оставить, а какие убрать из information_schema.ddl_events
2. не учитывается работа с ролями\пользователями
3. на некоторых моментах идет двойная запись
4. действует на уровне бд в которой создано Это уже задача аудита изменений структуры БД. Тем не менее, посетителям форума будет полезно.
Нечто подобное реализуется здесь .
...
Рейтинг: 0 / 0
17.11.2020, 13:28
    #40019389
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц
Cyrax_02
Maxim BogukА добавление - удаление столбцов у вас не бывает?
Так при удалении/добавлении столбцов в таблице с историей ничего не меняется. Соответственно, ничего делать не нужно.
Как я написал выше, задачей является учёт изменения данных , а не структуры таблиц/БД.

авторps: для целей аудита - бессмысленно тот у кого есть права на alter у него вероятнее всего окажется достаточно прав чтобы триггер отключитьЧтобы триггер отключить, нужны права суперпользователя.

Maxim Bogukpps: "Задача банальная: учёт изменения данных." какое же это изменение данных если это изменение структуры а его отслеживают путем непускания кого попала в базуНет, это именно отслеживание изменения данных. Для решения этой задачи необходимо обеспечить корректное хранение ссылок на таблицы и столбцы. Именно эта подзадача и озвучена в сабже.

1)не понимаю как у вас переименование колонки в таблице (и тем более таблицы) выливается в изменение данных в ней?
2)для изменения структуры таблицы в нормальной схеме безопасности тоже требуется суперпользователь (чтобы посторонние не лазали с ddl поперед dba)

В общем вариант я вам подсказал, подачу вы приняли... делаете вы что то очень странное (за 22года работы dba/db-dev с postgresql не видел такой задачи а видел я очень и очень много) но в принципе сделать это рабочим возможно.

ps: сейчас подскажу схему как в вашу систему обмануть - удаляем колонку и добавляем с тем же именем заново... в итоге аудит ничего не увидел в истории ничего нет а в колонке все значения на null заменились почему то (я кстати с таким в реальности встречался после кривых миграций).

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
17.11.2020, 14:31
    #40019449
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц
Maxim Boguk1)не понимаю как у вас переименование колонки в таблице (и тем более таблицы) выливается в изменение данных в ней?
2)для изменения структуры таблицы в нормальной схеме безопасности тоже требуется суперпользователь (чтобы посторонние не лазали с ddl поперед dba)Логика, реализующая задачу " поддерживать актуальность ссылок на таблицы и столбцы при переименовании таблиц и столбцов " совсем не должна реализовывать другие задачи. Учёт изменения данных, производимых пользователями, будет выполняться приложением явным образом. Соответственно, эти пользователи не будут иметь прямого доступа к БД. Не являюсь сторонником реализации всей бизнес-логики на уровне БД.

авторВ общем вариант я вам подсказал, подачу вы приняли... делаете вы что то очень странное (за 22года работы dba/db-dev с postgresql не видел такой задачи а видел я очень и очень много) но в принципе сделать это рабочим возможно.Не может быть такого, чтобы вы не сталкивались с задачей хранения истории изменения данных в отдельных таблицах.
А такая задача всегда требует хранения ссылок на таблицы и столбцы (сабж).

авторps: сейчас подскажу схему как в вашу систему обмануть - удаляем колонку и добавляем с тем же именем заново... в итоге аудит ничего не увидел в истории ничего нет а в колонке все значения на null заменились почему то (я кстати с таким в реальности встречался после кривых миграций).Такого не будет, потому что при удалении и добавлении столбцов данные не меняются.
Таблица с историей изменения данных не содержит и не должна содержать истории изменения структуры таблиц.
Т.е. обмануть не получится...
...
Рейтинг: 0 / 0
17.11.2020, 14:37
    #40019457
fte
fte
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц
Cyrax_02
Maxim Boguk1)не понимаю как у вас переименование колонки в таблице (и тем более таблицы) выливается в изменение данных в ней?
2)для изменения структуры таблицы в нормальной схеме безопасности тоже требуется суперпользователь (чтобы посторонние не лазали с ddl поперед dba)
Логика, реализующая задачу " поддерживать актуальность ссылок на таблицы и столбцы при переименовании таблиц и столбцов " совсем не должна реализовывать другие задачи. Учёт изменения данных, производимых пользователями, будет выполняться приложением явным образом. Соответственно, эти пользователи не будут иметь прямого доступа к БД. Не являюсь сторонником реализации всей бизнес-логики на уровне БД.

авторВ общем вариант я вам подсказал, подачу вы приняли... делаете вы что то очень странное (за 22года работы dba/db-dev с postgresql не видел такой задачи а видел я очень и очень много) но в принципе сделать это рабочим возможно.Не может быть такого, чтобы вы не сталкивались с задачей хранения истории изменения данных в отдельных таблицах.
А такая задача всегда требует хранения ссылок на таблицы и столбцы (сабж).

авторps: сейчас подскажу схему как в вашу систему обмануть - удаляем колонку и добавляем с тем же именем заново... в итоге аудит ничего не увидел в истории ничего нет а в колонке все значения на null заменились почему то (я кстати с таким в реальности встречался после кривых миграций).Такого не будет, потому что при удалении и добавлении столбцов данные не меняются.
Таблица с историей изменения данных не содержит и не должна содержать истории изменения структуры таблиц.

Извиняюсь, ИМХО Вы - Китайский пионер, Сам создаю себе задачи и Сам успешно их решаю...
...
Рейтинг: 0 / 0
17.11.2020, 15:15
    #40019492
fte
fte
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц
Cyrax_02Таблица с историей изменения данных не содержит и не должна содержать истории изменения структуры таблиц.
Тогда зачем нужен Event Trigger ??? Просто читаем из актуальную структуру из pg_catalog...
...
Рейтинг: 0 / 0
17.11.2020, 15:44
    #40019525
Ы2
Ы2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц
Cyrax_02
Таблица с историей изменения данных не содержит и не должна содержать истории изменения структуры таблиц.

Вы отслеживаете переименования таблиц и колонок, а это — изменения структуры. Напр., если я переименовал таблицу table1 в cities, данные не изменились, а структура БД — да. Изменение данных — это «в колонке num такой-то записи было 8 стало 6».
...
Рейтинг: 0 / 0
18.11.2020, 08:56
    #40019802
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц
fteТогда зачем нужен Event Trigger ??? Просто читаем из актуальную структуру из pg_catalog...
Как вы предлагаете отслеживать переименование таблиц и столбцов без событийного триггера ???
Что касается pg_catalog , то он не содержит ни данных таблиц, ни предыдущих (до переименования) имён таблиц/столбцов.

Ы2Вы отслеживаете переименования таблиц и колонок, а это — изменения структуры. Напр., если я переименовал таблицу table1 в cities, данные не изменились, а структура БД — да. Изменение данных — это «в колонке num такой-то записи было 8 стало 6».
Переименовываем столбец num в num20 . Далее смотрим, что у нас в истории. А в истории по-прежнему «в колонке num такой-то записи = 6» . Некто из зала предлагает менять имена таблиц и столбцов в таблице истории данных одновременно с их фактическим переименованием. Чтобы после переименования в истории было не «в колонке num такой-то записи = 6» , а «в колонке num20 такой-то записи = 6» . Но ему возражают: отслеживание переименования таблиц и столбцов - это не история изменения данных, а история изменения структуры. А значит, нужно отслеживать все изменения структуры, а не только таблиц и столбцов, что нужно ограничивать права пользователей БД, нужно использовать систему контроля версий и т.д. и т.п. Но некто возражает: мол, достаточно отслеживать только имена таблиц и столбцов, т.к. для ведения таблицы истории данных не нужно отслеживать все изменения структуры. Ему снова возражают: мол, так никто не далает, вы предлагаете очень странные вещи. И начинают объяснять, что такое изменение данных, а что такое изменение структуры. Ведь некто этого абсолютно не понимает. АБСОЛЮТНО.

P.S . Это уже классический троллинг. Иначе это объяснить нельзя...
...
Рейтинг: 0 / 0
18.11.2020, 14:59
    #40019959
Ы2
Ы2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц
Cyrax_02Переименовываем столбец num в num20 . Далее смотрим, что у нас в истории. А в истории по-прежнему «в колонке num такой-то записи = 6» . Некто из зала предлагает менять имена таблиц и столбцов в таблице истории данных одновременно с их фактическим переименованием. Чтобы после переименования в истории было не «в колонке num такой-то записи = 6» , а «в колонке num20 такой-то записи = 6» .
В истории зафиксирован момент изменения данных. Появились они, когда колонка называлась num. Затем структура изменилась, теперь колонка называется num20. Вы хотите пройтись по истории и везде переименовать num в num20? Ваше право. Хорошо ли это? Сомнительно.

Cyrax_02Но ему возражают: отслеживание переименования таблиц и столбцов - это не история изменения данных, а история изменения структуры. А значит, нужно отслеживать все изменения структуры, а не только таблиц и столбцов. <…> Но некто возражает: мол, достаточно отслеживать только имена таблиц и столбцов, т.к. для ведения таблицы истории данных не нужно отслеживать все изменения структуры.
И, на мой взгляд, зря возражает, т.к. при таком подходе у него могут появиться данные, о которых его история ничего не знает: добавили колонку с какими-то готовыми значениями, попользовались и удалили. Если данные не обновлялись , в истории их существование не отразится. Поэтому разумно протоколировать изменения как данных, так и структуры.

Cyrax_02И начинают объяснять, что такое изменение данных, а что такое изменение структуры. Ведь некто этого абсолютно не понимает. АБСОЛЮТНО.
Я не чтец в ваших мыслях, вижу лишь то, что вы пишите , не более. А пишите вы так, что создается впечатление , будто вы данные и структуру не вполне различаете.

Возможно, вас спасло бы что-то вроде timetravel, чтобы можно было посмотреть состояние базы на произвольный момент в прошлом.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]