powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Восстановление по логу
8 сообщений из 8, страница 1 из 1
Восстановление по логу
    #39363138
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В IBExpert'e есть генерация триггеров для логирования удаления. А есть где-то пример скрипта, как по логу восстанавливать удаленные строки? Или у кого-то есть опыт такового восстановления?
...
Рейтинг: 0 / 0
Восстановление по логу
    #39363480
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax,

Если ты про протоколирование операций, то IBE просто в свою таблицу логов пишет сам факт изменения данных, но не данные. Т.е. в лог попадает только основная информация - имя таблицы, операция, время и значение PK. Чтобы организовать восстановление данных - их нужно самому писать. Т.е. при удалении к примеру выставлять какой-то флаг типа ISDELETED == 1 в таблице и создавать таблицу- зеркало в которую писать старые версии данных при UPDATE. Как-то так.
...
Рейтинг: 0 / 0
Восстановление по логу
    #39363512
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMaxВ IBExpert'e есть генерация триггеров для логирования удаления. А есть где-то пример скрипта, как по логу восстанавливать удаленные строки? Или у кого-то есть опыт такового восстановления?

INSERT вроде не проблема по данным таблиц протоколирования составить.
Только в общем случае это не будет работать, ибо по логике протоколирования восстанавливать нужно все начиная с последней запротоколированной операции, в обратном порядке. И хорошо, если протоколировалось все. А если частично?
В общем, эти логи, скорее, для посмотреть, кто, что и когда менял.
...
Рейтинг: 0 / 0
Восстановление по логу
    #39363782
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert,

А разве в лог IBE все ланные попадают? Ну составит он INSERT скрипт из лога, повставляет ID (как PK) - дальше чего? Пусть строит зеркальные таблицы для логирования всего, что нужно, а потом откатывает назад (по метке времени к примеру).
...
Рейтинг: 0 / 0
Восстановление по логу
    #39363965
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterIBExpert,
А разве в лог IBE все ланные попадают? Ну составит он INSERT скрипт из лога, повставляет ID (как PK) - дальше чего?

Эксперт только триггеры соответствующие создает. Да, можно протоколировать изменения любых полей. Какие галки в интерфейсе натыкаешь, то и попадет в триггер. Ну и руками туда дописать что угодно тоже не возбраняется.
...
Рейтинг: 0 / 0
Восстановление по логу
    #39364589
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert,

Так ведь при восстановлении (INSERT) надо указать то содержимое полей, которое было зафиксировано при удалении - этого достаточно.
Решил проблему в два этапа - перегонку во временную таблицу логов (для ускорения операции) и восстановление строк. Получилось вот так:
Код: 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.
EXECUTE BLOCK
--RETURNS(
--ID_BATCH DOM$KEY,
--ID_CREATOR DOM$KEY,
--ID_ABONENT DOM$ABONENT,
--ID_PERIOD_FOR_PAYMENT DOM$PERIOD,
--ID_TYPE_RECEIPT DOM$KEY,
--TIMESTAMP_CREATION DOM$TIMESTAMP)
AS
DECLARE VARIABLE KEY_VALUE DOM$KEY;
DECLARE VARIABLE ID DOM$KEY;
DECLARE VARIABLE ID_BATCH DOM$KEY;
DECLARE VARIABLE ID_CREATOR DOM$KEY;
DECLARE VARIABLE ID_ABONENT DOM$ABONENT;
DECLARE VARIABLE ID_PERIOD_FOR_PAYMENT DOM$PERIOD;
DECLARE VARIABLE ID_TYPE_RECEIPT DOM$KEY;
DECLARE VARIABLE TIMESTAMP_CREATION DOM$TIMESTAMP;
DECLARE VARIABLE DATE_PAYMENT DOM$DATE;
DECLARE VARIABLE AMOUNT_SERVICE_1 DOM$AMOUNT;
DECLARE VARIABLE AMOUNT_SERVICE_2 DOM$AMOUNT;
DECLARE VARIABLE AMOUNT_SERVICE_3 DOM$AMOUNT;
DECLARE VARIABLE AMOUNT_SERVICE_4 DOM$AMOUNT;
DECLARE VARIABLE AMOUNT_SERVICE_5 DOM$AMOUNT;
DECLARE VARIABLE AMOUNT_FINE DOM$AMOUNT;
DECLARE VARIABLE AMOUNT_RECEIPT DOM$AMOUNT;
DECLARE VARIABLE AUTODISTRIBUTE_SERVICES DOM$BOOLEAN;
DECLARE VARIABLE CASHLESS DOM$BOOLEAN;
BEGIN
    FOR SELECT
        R.KEY_VALUE
    FROM
        TMP$REST R
    GROUP BY
        R.KEY_VALUE
    INTO    
        :KEY_VALUE
    DO
    BEGIN
        ID_BATCH = (SELECT R.OLD_VALUE FROM TMP$REST R WHERE R.KEY_VALUE = :KEY_VALUE AND R.FIELD_NAME = 'ID_BATCH');

        IF (:ID_BATCH = 253804) THEN
        BEGIN
            ID = (SELECT R.OLD_VALUE FROM TMP$REST R WHERE R.KEY_VALUE = :KEY_VALUE AND R.FIELD_NAME = 'ID');
            ID_CREATOR = (SELECT R.OLD_VALUE FROM TMP$REST R WHERE R.KEY_VALUE = :KEY_VALUE AND R.FIELD_NAME = 'ID_CREATOR');
            ID_ABONENT = (SELECT R.OLD_VALUE FROM TMP$REST R WHERE R.KEY_VALUE = :KEY_VALUE AND R.FIELD_NAME = 'ID_ABONENT');
            ID_PERIOD_FOR_PAYMENT = (SELECT R.OLD_VALUE FROM TMP$REST R WHERE R.KEY_VALUE = :KEY_VALUE AND R.FIELD_NAME = 'ID_PERIOD_FOR_PAYMENT');
            ID_TYPE_RECEIPT = (SELECT R.OLD_VALUE FROM TMP$REST R WHERE R.KEY_VALUE = :KEY_VALUE AND R.FIELD_NAME = 'ID_TYPE_RECEIPT');
            TIMESTAMP_CREATION = (SELECT R.OLD_VALUE FROM TMP$REST R WHERE R.KEY_VALUE = :KEY_VALUE AND R.FIELD_NAME = 'TIMESTAMP_CREATION');
            DATE_PAYMENT = (SELECT R.OLD_VALUE FROM TMP$REST R WHERE R.KEY_VALUE = :KEY_VALUE AND R.FIELD_NAME = 'DATE_PAYMENT');
            AMOUNT_SERVICE_1 = (SELECT R.OLD_VALUE FROM TMP$REST R WHERE R.KEY_VALUE = :KEY_VALUE AND R.FIELD_NAME = 'AMOUNT_SERVICE_1');
            AMOUNT_SERVICE_2 = (SELECT R.OLD_VALUE FROM TMP$REST R WHERE R.KEY_VALUE = :KEY_VALUE AND R.FIELD_NAME = 'AMOUNT_SERVICE_2');
            AMOUNT_SERVICE_3 = (SELECT R.OLD_VALUE FROM TMP$REST R WHERE R.KEY_VALUE = :KEY_VALUE AND R.FIELD_NAME = 'AMOUNT_SERVICE_3');
            AMOUNT_SERVICE_4 = (SELECT R.OLD_VALUE FROM TMP$REST R WHERE R.KEY_VALUE = :KEY_VALUE AND R.FIELD_NAME = 'AMOUNT_SERVICE_4');
            AMOUNT_SERVICE_5 = (SELECT R.OLD_VALUE FROM TMP$REST R WHERE R.KEY_VALUE = :KEY_VALUE AND R.FIELD_NAME = 'AMOUNT_SERVICE_5');
            AMOUNT_FINE = (SELECT R.OLD_VALUE FROM TMP$REST R WHERE R.KEY_VALUE = :KEY_VALUE AND R.FIELD_NAME = 'AMOUNT_FINE');
            AMOUNT_RECEIPT = (SELECT R.OLD_VALUE FROM TMP$REST R WHERE R.KEY_VALUE = :KEY_VALUE AND R.FIELD_NAME = 'AMOUNT_RECEIPT');
            AUTODISTRIBUTE_SERVICES = (SELECT R.OLD_VALUE FROM TMP$REST R WHERE R.KEY_VALUE = :KEY_VALUE AND R.FIELD_NAME = 'AUTODISTRIBUTE_SERVICES');
            CASHLESS = (SELECT R.OLD_VALUE FROM TMP$REST R WHERE R.KEY_VALUE = :KEY_VALUE AND R.FIELD_NAME = 'CASHLESS');

        INSERT INTO BAT$RECEIPT$RECEIPT
            (ID, ID_BATCH, ID_CREATOR, ID_ABONENT, ID_PERIOD_FOR_PAYMENT, ID_TYPE_RECEIPT,
            TIMESTAMP_CREATION, DATE_PAYMENT, AMOUNT_SERVICE_1, AMOUNT_SERVICE_2,
            AMOUNT_SERVICE_3, AMOUNT_SERVICE_4, AMOUNT_SERVICE_5, AMOUNT_FINE, AMOUNT_RECEIPT, AUTODISTRIBUTE_SERVICES,
            CASHLESS)
        VALUES
            (:ID, :ID_BATCH, :ID_CREATOR, :ID_ABONENT, :ID_PERIOD_FOR_PAYMENT, :ID_TYPE_RECEIPT,
            :TIMESTAMP_CREATION, :DATE_PAYMENT, :AMOUNT_SERVICE_1, :AMOUNT_SERVICE_2,
            :AMOUNT_SERVICE_3, :AMOUNT_SERVICE_4, :AMOUNT_SERVICE_5, :AMOUNT_FINE, :AMOUNT_RECEIPT, :AUTODISTRIBUTE_SERVICES,
            :CASHLESS);

        END
    END
END



Если когда-нибудь в IBE появится генерация подобного скрипта, было бы очень удобно. Но потребность в этом неизвестна.
...
Рейтинг: 0 / 0
Восстановление по логу
    #39364605
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMaxТак ведь при восстановлении (INSERT) надо указать то содержимое полей, которое было зафиксировано при удалении - этого достаточно.

В каких-то случаях - да, достаточно.
Но восстанавливаемая запись может ссылаться на записи в других таблицах, которые тоже могут быть удалены. И тогда сначала нужно восстанавливать их, иначе твой INSERT обломается. Я об этом.
...
Рейтинг: 0 / 0
Восстановление по логу
    #39364613
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert,

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


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