0

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

first_name  address  city  country

假设我编辑了 first_name让我们说Jack to Henk。它应该在另一个表中插入命令(i.e. update) ,time , description,但在我希望它写的描述中,当前用户将 Jack 更改为 John (i.e using the current-user () function),如果它是一个从 Mechinkova 更新为 Tostov 的城市,它应该对其他列执行相同的操作。

我知道我想必须在触发器中添加 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
//
4

1 回答 1

0

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

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

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. new并且old是在更新语句期间生成的伪记录。这些记录对应于正在更新的行。:new表示更新语句运行之后的行,表示更新语句运行:old之前的行。这适用于甲骨文。请确保它是否也适用于 MySQL。


编辑

您可以在此处阅读有关 MySQL 触发器的更多信息。在此处阅读有关审计跟踪和此 SO 问题的更多信息。

于 2013-04-19T20:01:01.250 回答