您要求的是审核触发器。这很容易实现。
让我们首先稍微修改您的主表。让我们添加一个数据类型的字段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 触发器的更多信息。在此处阅读有关审计跟踪和此 SO 问题的更多信息。