Topic: [Скрипт] Логирование изменений в таблице с помощью тригеров (SQLite)

Логирование изменений в таблице с помощью тригеров (SQLite)



скрипт:

procedure Form1_OnShow (Sender: string; Action: string);
begin
    //SQLExecute('DROP TRIGGER IF EXISTS my_log_insert'); // how to remove trigger

    // trigger when insert new a record
    SQLExecute(
    'CREATE TRIGGER IF NOT EXISTS my_log_insert AFTER INSERT ON employees '+
    'BEGIN '+
    '    INSERT INTO employees_logs(ParentId, datetimeEvent, operation, lastname, firstname, salary, dateofbirth) VALUES (NEW.id, datetime(''now'', ''localtime''), ''New'', NEW.lastname, NEW.firstname, NEW.salary, NEW.dateofbirth); '+
    'END;'
    );

    // trigger when update a record
    SQLExecute(
    'CREATE TRIGGER IF NOT EXISTS my_log_update AFTER UPDATE ON employees '+
    'BEGIN '+
    '    INSERT INTO employees_logs(ParentId, datetimeEvent, operation, lastname, firstname, salary, dateofbirth) VALUES (NEW.id, datetime(''now'', ''localtime''), ''Update'', NEW.lastname, NEW.firstname, NEW.salary, NEW.dateofbirth); '+
    'END;'
    );

    // trigger when delete a record
    SQLExecute(
    'CREATE TRIGGER IF NOT EXISTS my_log_delete AFTER DELETE ON employees '+
    'BEGIN '+
    '    INSERT INTO employees_logs(ParentId, datetimeEvent, operation, lastname, firstname, salary, dateofbirth) VALUES (OLD.id, datetime(''now'', ''localtime''), ''Delete'', OLD.lastname, OLD.firstname, OLD.salary, OLD.dateofbirth); '+
    'END;'
    );
end;



procedure Form1_bUpdate_OnClick (Sender: string; var Cancel: boolean);
begin
    if Form1.cbEmp.dbItemID = -1 then Form1.GridLogs.dbFilter := '' else Form1.GridLogs.dbFilter := 'ParentId='+Form1.cbEmp.sqlValue;
    Form1.GridLogs.dbUpdate;
end;


procedure frmEmployee_OnShow (Sender: string; Action: string);
begin
    if frmEmployee.bSave.dbGeneralTableId <> -1 then
    begin
        frmEmployee.GridLogs.dbFilter := 'ParentId='+IntToStr(frmEmployee.bSave.dbGeneralTableId);
        frmEmployee.GridLogs.dbUpdate;
    end else
    begin
        frmEmployee.GridLogs.ClearRows;
    end;
end;



Проект с примером:

Post's attachments

Attachment icon Logging and triggers.zip 9.6 kb, 927 downloads since 2017-08-11 

Dmitry.

Re: [Скрипт] Логирование изменений в таблице с помощью тригеров (SQLite)

а возможно-ли добавить исключния, то есть что-бы операции с определенными таблицами или полями не записывались в лог

Re: [Скрипт] Логирование изменений в таблице с помощью тригеров (SQLite)

sibprogsistem wrote:

а возможно-ли добавить исключния, то есть что-бы операции с определенными таблицами или полями не записывались в лог

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

Dmitry.