Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1397
Задача:
1) Хранение в специальной таблице (назовём её meta) ссылок на таблицы и столбцы других таблиц.
2) При переименовании таблиц и столбцов эти ссылки должны сохранять свою целостность (должны оставаться рабочими).
3) При восстановлении БД из дампа эти ссылки должны сохранять свою целостность (должны оставаться рабочими).

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

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

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

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

Сообщение было отредактировано: 16 ноя 20, 00:25
16 ноя 20, 00:28    [22232551]     Ответить | Цитировать Сообщить модератору
 Re: Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4404
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

Сообщение было отредактировано: 16 ноя 20, 11:37
16 ноя 20, 09:30    [22232614]     Ответить | Цитировать Сообщить модератору
 Re: Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1397
Maxim Boguk
Обьясните нафига вам это надо может все сильно проще можно сделать.
Задача банальная: учёт изменения данных.
Проще - это как? У меня просто никогда не бывает. Карма такая...

Maxim Boguk
PS: в сём омуте живут драконы (в смысле вероятнее всего ничего хорошего из вашей затеи в целом не получится без совершенно запредельного объема работы).
Вот, состряпал:
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();
17 ноя 20, 00:15    [22233411]     Ответить | Цитировать Сообщить модератору
 Re: Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1397
Если имена столбцов не содержат имён таблиц, то при переименовании столбцов нужно ещё добавить проверку таблицы (т.к. в разных таблицах могут быть одноимённые столбцы). И тогда второе регулярное выражение "по протяжённости" станет длиннее первого.

Сообщение было отредактировано: 17 ноя 20, 00:46
17 ноя 20, 00:49    [22233422]     Ответить | Цитировать Сообщить модератору
 Re: Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1397
Окончательный вариант (с проверкой таблицы при переименовании столбца):
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();
17 ноя 20, 01:06    [22233424]     Ответить | Цитировать Сообщить модератору
 Re: Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4404
Cyrax_02,

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

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

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

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
17 ноя 20, 01:25    [22233433]     Ответить | Цитировать Сообщить модератору
 Re: Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц  [new]
Guzya
Member

Откуда:
Сообщений: 632
Такое


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. действует на уровне бд в которой создано
17 ноя 20, 09:07    [22233496]     Ответить | Цитировать Сообщить модератору
 Re: Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1397
Maxim Boguk
А добавление - удаление столбцов у вас не бывает?
Так при удалении/добавлении столбцов в таблице с историей ничего не меняется. Соответственно, ничего делать не нужно.
Как я написал выше, задачей является учёт изменения данных, а не структуры таблиц/БД.

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

Maxim Boguk
pps: "Задача банальная: учёт изменения данных." какое же это изменение данных если это изменение структуры а его отслеживают путем непускания кого попала в базу
Нет, это именно отслеживание изменения данных. Для решения этой задачи необходимо обеспечить корректное хранение ссылок на таблицы и столбцы. Именно эта подзадача и озвучена в сабже.
17 ноя 20, 12:00    [22233603]     Ответить | Цитировать Сообщить модератору
 Re: Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1397
Guzya
Такое
...
1. до конца не определился какие столбцы оставить, а какие убрать из information_schema.ddl_events
2. не учитывается работа с ролями\пользователями
3. на некоторых моментах идет двойная запись
4. действует на уровне бд в которой создано
Это уже задача аудита изменений структуры БД. Тем не менее, посетителям форума будет полезно.
Нечто подобное реализуется здесь.
17 ноя 20, 13:05    [22233659]     Ответить | Цитировать Сообщить модератору
 Re: Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4404
Cyrax_02
Maxim Boguk
А добавление - удаление столбцов у вас не бывает?
Так при удалении/добавлении столбцов в таблице с историей ничего не меняется. Соответственно, ничего делать не нужно.
Как я написал выше, задачей является учёт изменения данных, а не структуры таблиц/БД.

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

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


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

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

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

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
17 ноя 20, 13:28    [22233675]     Ответить | Цитировать Сообщить модератору
 Re: Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1397
Maxim Boguk
1)не понимаю как у вас переименование колонки в таблице (и тем более таблицы) выливается в изменение данных в ней?
2)для изменения структуры таблицы в нормальной схеме безопасности тоже требуется суперпользователь (чтобы посторонние не лазали с ddl поперед dba)
Логика, реализующая задачу "поддерживать актуальность ссылок на таблицы и столбцы при переименовании таблиц и столбцов" совсем не должна реализовывать другие задачи. Учёт изменения данных, производимых пользователями, будет выполняться приложением явным образом. Соответственно, эти пользователи не будут иметь прямого доступа к БД. Не являюсь сторонником реализации всей бизнес-логики на уровне БД.

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

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

Сообщение было отредактировано: 17 ноя 20, 14:34
17 ноя 20, 14:31    [22233770]     Ответить | Цитировать Сообщить модератору
 Re: Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц  [new]
fte
Member

Откуда: Moscow
Сообщений: 386
Cyrax_02
Maxim Boguk
1)не понимаю как у вас переименование колонки в таблице (и тем более таблицы) выливается в изменение данных в ней?
2)для изменения структуры таблицы в нормальной схеме безопасности тоже требуется суперпользователь (чтобы посторонние не лазали с ddl поперед dba)
Логика, реализующая задачу "поддерживать актуальность ссылок на таблицы и столбцы при переименовании таблиц и столбцов" совсем не должна реализовывать другие задачи. Учёт изменения данных, производимых пользователями, будет выполняться приложением явным образом. Соответственно, эти пользователи не будут иметь прямого доступа к БД. Не являюсь сторонником реализации всей бизнес-логики на уровне БД.

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

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


Извиняюсь, ИМХО Вы - Китайский пионер, Сам создаю себе задачи и Сам успешно их решаю...
17 ноя 20, 14:37    [22233785]     Ответить | Цитировать Сообщить модератору
 Re: Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц  [new]
fte
Member

Откуда: Moscow
Сообщений: 386
Cyrax_02
Таблица с историей изменения данных не содержит и не должна содержать истории изменения структуры таблиц.

Тогда зачем нужен Event Trigger ??? Просто читаем из актуальную структуру из pg_catalog...
17 ноя 20, 15:15    [22233847]     Ответить | Цитировать Сообщить модератору
 Re: Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц  [new]
Ы2
Member

Откуда:
Сообщений: 189
Cyrax_02
Таблица с историей изменения данных не содержит и не должна содержать истории изменения структуры таблиц.

Вы отслеживаете переименования таблиц и колонок, а это — изменения структуры. Напр., если я переименовал таблицу table1 в cities, данные не изменились, а структура БД — да. Изменение данных — это «в колонке num такой-то записи было 8 стало 6».
17 ноя 20, 15:44    [22233889]     Ответить | Цитировать Сообщить модератору
 Re: Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1397
fte
Тогда зачем нужен Event Trigger ??? Просто читаем из актуальную структуру из pg_catalog...

Как вы предлагаете отслеживать переименование таблиц и столбцов без событийного триггера ???
Что касается pg_catalog, то он не содержит ни данных таблиц, ни предыдущих (до переименования) имён таблиц/столбцов.

Ы2
Вы отслеживаете переименования таблиц и колонок, а это — изменения структуры. Напр., если я переименовал таблицу table1 в cities, данные не изменились, а структура БД — да. Изменение данных — это «в колонке num такой-то записи было 8 стало 6».

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

P.S. Это уже классический троллинг. Иначе это объяснить нельзя...
18 ноя 20, 08:56    [22234353]     Ответить | Цитировать Сообщить модератору
 Re: Хранение в мета-таблице ссылок на таблицы и столбцы других таблиц  [new]
Ы2
Member

Откуда:
Сообщений: 189
Cyrax_02
Переименовываем столбец num в num20. Далее смотрим, что у нас в истории. А в истории по-прежнему «в колонке num такой-то записи = 6». Некто из зала предлагает менять имена таблиц и столбцов в таблице истории данных одновременно с их фактическим переименованием. Чтобы после переименования в истории было не «в колонке num такой-то записи = 6», а «в колонке num20 такой-то записи = 6».

В истории зафиксирован момент изменения данных. Появились они, когда колонка называлась num. Затем структура изменилась, теперь колонка называется num20. Вы хотите пройтись по истории и везде переименовать num в num20? Ваше право. Хорошо ли это? Сомнительно.

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

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

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

Я не чтец в ваших мыслях, вижу лишь то, что вы пишите, не более. А пишите вы так, что создается впечатление, будто вы данные и структуру не вполне различаете.

Возможно, вас спасло бы что-то вроде timetravel, чтобы можно было посмотреть состояние базы на произвольный момент в прошлом.

Сообщение было отредактировано: 18 ноя 20, 14:55
18 ноя 20, 14:59    [22234641]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить