【问题标题】:how can i modify or manipulate this trigger如何修改或操作此触发器
【发布时间】:2013-04-13 06:12:02
【问题描述】:

我正在尝试创建一个触发器,该触发器将捕获当我在更新前后更新表中的任何列时将发生的任何事件,假设我有 4 列:

first_name  address  city  country

假设我编辑了first_name 假设Jack to Henk。 它应该在另一个表中插入命令(i.e. update) ,time , description,但在我希望它写的描述中,杰克被当前用户(i.e using the current-user () function)更改为约翰,如果它是一个从梅钦科瓦更新为托斯托夫的城市,它应该做同样的事情与其他列。

我知道我想必须在触发器中添加 concat 函数,例如我希望它是这样的:

DROP TRIGGER IF EXISTS adminpanel.soft//
CREATE TRIGGER adminpanel.soft BEFORE UPDATE ON adminpanel.aggrement
FOR EACH ROW
BEGIN
INSERT INTO adminpanel.aggretrigger(cmd, time, cmd_user, last_name, city) VALUES("INSERT", NOW(), CURRENT_USER(), new.last_name, new.city);
END
//

【问题讨论】:

    标签: mysql triggers


    【解决方案1】:

    您要求的是审核触发器。很容易实现。

    让我们首先稍微修改您的主表。让我们添加一个 idinteger 数据类型的字段作为表的主键,因此您的表如下所示:

    tablename
    ( id            integer PK
    , first_name    varchar
    , address       varchar
    , city          varchar
    , country       varchar
    )
    

    现在,您需要一个表,例如 UNIVERSAL_AUDIT_ENTRY 表,它将存储对架构中的数据所做的更改。

    根据我的经验,我建议你创建这个表如下:

    universal_audit_entry
    ( universal_audit_entryid integer PK
    , table_name              varchar -- captures the name of the table
    , column_name             varchar -- captures the name of the column
    , entry_type              varchar -- captures the event, e.g., 'INSERT' or 'UPDATE'
    , primary_key_value       integer -- captures, e.g., the value in tblename.id
    , from_str                varchar -- captures the value that was present before
    , to_str                  varchar -- captures the value that was changed into
    , timestamp               datetime -- captures the timestamp of the event
    , username                varchar -- captures the name of user
    )
    

    现在universal_audit_entry 表已准备就绪,您的触发器应如下所示:

    CREATE TRIGGER adminpanel.soft
    BEFORE UPDATE ON adminpanel.aggrement
    FOR EACH ROW
    BEGIN
      IF UPDATING(first_name) THEN
        INSERT INTO universal_audit_entry VALUES
        ( 123 -- example for universal_audit_entryid
        , 'TABLENAME'
        , 'FIRST_NAME'
        , 'UPDATE'
        , new.id
        , old.first_name
        , new.first_name
        , current_timestamp()
        , current_user);
     END IF;
    END;
    //
    

    您可以使用类似的逻辑来审计同一个表中的更多列,也可以审计其他表。

    注意:

    1. 此代码未经测试。我在这里添加它只是为了说明目的。此触发器代码不应直接使用。

    2. newold 是在更新语句期间生成的伪记录。这些记录对应于正在更新的行。 :new 表示更新语句运行之后的行,:old 表示更新语句运行之前的行。这适用于甲骨文。请确保它是否也适用于 MySQL。


    编辑

    您可以阅读有关 MySQL 触发器的更多信息 here。阅读更多关于审计跟踪 herethis SO question 的信息。

    【讨论】:

    • 嘿有没有教程你知道我可以查找以便我阅读,触发器不起作用但我喜欢你的方法
    • 这个触发器不应该工作。我已经说清楚了。请参阅我的回答的 EDIT 部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多