Search code examples
mysqlsqlaudit-logging

How to analyze, what happend while updating rows


I have a table like this:

| id |   address   |  name  |    oid    | state | event_id | ctrl |
-------------------------------------------------------------------
| 1  | test_addr_1 | test_1 | 25.345.17 |   1   |     0    |  15  |

I need to get event_id while update data in row.

I want to do something like this:

If new name not equals with old name event_id = event_id + 1
If new oid not equals with old oid event_id = event_id + 2
If new state not equals with old state event_id = event_id + 4
If new ctrl bigger then old ctrl event_id = event_id + 8

# Params to procedure
PROCEDURE Write(IN pAddr VARCHAR(20), IN pName VARCHAR(20), IN pOid VARCHAR(20), IN pState TINYINT, IN pCtrl INT)

#procedure body
SET @ev = 0;
SELECT
CASE
    WHEN name != pName THEN SET @ev = @ev + 1
    WHEN oid != pOid THEN SET @ev = @ev + 2
    WHEN state != pState THEN SET @ev = @ev + 4
    WHEN ctrl > pCtrl THEN SET @ev = @ev + 8
END 
FROM table1 

UPDATE table1 SET ..... , event_id = @ev WHERE address = pAddr

How can I do it? Or will it be better to make it not with the help of SQL?


Solution

  • Solved! Thanks to @Alexei. I wanted to know, why the row was added to the history table.

    The result is:

    CREATE TRIGGER SetReason BEFORE UPDATE ON <table1>
    FOR EACH ROW BEGIN
        SET NEW.event_id = 
            (CASE WHEN OLD.name != NEW.name THEN 1 ELSE 0 END) + 
            (CASE WHEN OLD.oid != NEW.oid THEN 2 ELSE 0 END) + 
            (CASE WHEN OLD.state != NEW.state THEN 4 ELSE 0 END) +  
            (CASE WHEN OLD.ctrl != NEW.ctrl THEN 8 ELSE 0 END)    
    END;