Mysql 如何修改或操作此触发器

Mysql 如何修改或操作此触发器,mysql,triggers,Mysql,Triggers,我正在尝试创建一个触发器,它将捕获在更新前后更新表中任何列时发生的任何事件,假设我有4列: first_name address city country 比如说我编辑了first\u name比如说Jack to Henk。 它应该在另一个表中插入命令(即update)、time、description,但在我希望它写的描述中,Jack被当前用户更改为John(即使用当前用户()函数),如果它是一个从Mechinkova更新为Tostov的城市,它应该对其他列执行相同的操作 我知道我想

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

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触发器的更多信息。阅读更多有关审计跟踪和审计的信息。

    嘿,你知道我可以查阅哪些教程,以便阅读,触发器不起作用,但我喜欢你的方法此触发器不应该起作用。我已经讲清楚了。请参阅我答案的编辑部分。