Mysql 如何修改或操作此触发器
我正在尝试创建一个触发器,它将捕获在更新前后更新表中任何列时发生的任何事件,假设我有4列:Mysql 如何修改或操作此触发器,mysql,triggers,Mysql,Triggers,我正在尝试创建一个触发器,它将捕获在更新前后更新表中任何列时发生的任何事件,假设我有4列: first_name address city country 比如说我编辑了first\u name比如说Jack to Henk。 它应该在另一个表中插入命令(即update)、time、description,但在我希望它写的描述中,Jack被当前用户更改为John(即使用当前用户()函数),如果它是一个从Mechinkova更新为Tostov的城市,它应该对其他列执行相同的操作 我知道我想
first_name address city country
比如说我编辑了first\u name
比如说Jack to Henk
。
它应该在另一个表中插入命令(即update)、time、description
,但在我希望它写的描述中,Jack被当前用户更改为John(即使用当前用户()函数)
,如果它是一个从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
//
您要求的是审计触发器。它很容易实现 让我们先稍微修改一下主表。让我们添加一个数据类型为
integer
的字段id
,作为表的主键,使表看起来像:
tablename
( id integer PK
, first_name varchar
, address varchar
, city varchar
, country varchar
)
现在,您需要一个表,比如UNIVERSAL\u AUDIT\u ENTRY
table,它将存储对模式中的数据所做的更改
根据我的经验,我建议您创建以下表格:
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\u audit\u条目
表准备就绪,您的触发器看起来应该有点像:
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
是update语句期间生成的伪记录。这些记录对应于正在更新的行:new
表示update语句运行后的行,:old
表示update语句运行前的行。这在Oracle中起作用。请确保它是否也在MySQL中工作编辑
您可以阅读有关MySQL触发器的更多信息。阅读更多有关审计跟踪和审计的信息。嘿,你知道我可以查阅哪些教程,以便阅读,触发器不起作用,但我喜欢你的方法此触发器不应该起作用。我已经讲清楚了。请参阅我答案的编辑部分。