Гость
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Восстановление по логу / 8 сообщений из 8, страница 1 из 1
09.12.2016, 09:18
    #39363138
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановление по логу
В IBExpert'e есть генерация триггеров для логирования удаления. А есть где-то пример скрипта, как по логу восстанавливать удаленные строки? Или у кого-то есть опыт такового восстановления?
...
Рейтинг: 0 / 0
09.12.2016, 14:26
    #39363480
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановление по логу
CyberMax,

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

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

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

Эксперт только триггеры соответствующие создает. Да, можно протоколировать изменения любых полей. Какие галки в интерфейсе натыкаешь, то и попадет в триггер. Ну и руками туда дописать что угодно тоже не возбраняется.
...
Рейтинг: 0 / 0
12.12.2016, 01:33
    #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
12.12.2016, 05:44
    #39364605
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановление по логу
CyberMaxТак ведь при восстановлении (INSERT) надо указать то содержимое полей, которое было зафиксировано при удалении - этого достаточно.

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

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


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