您要求的是审核触发器。很容易实现。
让我们首先稍微修改您的主表。让我们添加一个 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;
//
您可以使用类似的逻辑来审计同一个表中的更多列,也可以审计其他表。
注意:
此代码未经测试。我在这里添加它只是为了说明目的。此触发器代码不应直接使用。
new 和old 是在更新语句期间生成的伪记录。这些记录对应于正在更新的行。 :new 表示更新语句运行之后的行,:old 表示更新语句运行之前的行。这适用于甲骨文。请确保它是否也适用于 MySQL。
编辑
您可以阅读有关 MySQL 触发器的更多信息 here。阅读更多关于审计跟踪 here 和 this SO question 的信息。