Mysql 获取要在触发器中使用的当前更新列名

Mysql 获取要在触发器中使用的当前更新列名,mysql,sql,triggers,Mysql,Sql,Triggers,是否有一种方法可以实际获取已更新的列名,以便在触发器中使用它 基本上,每当用户插入或更新一个表时,我都会尝试进行审计跟踪(在本例中,它与联系人表有关) 如何获取已更新列的名称,并从中获取该列的OLD和NEW值。如果一行或多行中更新了多个列,是否可以对每个更新进行审核 只需对每列使用OLD.colname NEW.colname即可检查并找到不同的列。触发器在MySQL中的使用有点有限,太糟糕了。试试这段代码 create table sales ( orderno INT, sale

是否有一种方法可以实际获取已更新的列名,以便在触发器中使用它

基本上,每当用户插入或更新一个表时,我都会尝试进行审计跟踪(在本例中,它与联系人表有关)

如何获取已更新列的名称,并从中获取该列的
OLD
NEW
值。如果一行或多行中更新了多个列,是否可以对每个更新进行审核

只需对每列使用OLD.colname NEW.colname即可检查并找到不同的列。触发器在MySQL中的使用有点有限,太糟糕了。

试试这段代码

create table sales (
  orderno INT, 
  sale INT,
  empsalary int,
  ts TIMESTAMP
);

create table history (
  updated varchar(20),
  oldvalue INT,
  newvalue INT
);

INSERT INTO sales 
  (orderno, sale, empsalary) 
VALUES
  (1,700,7000),
  (2,800,8000),
  (3,900,9000);

DROP TRIGGER test.instrigger;

DELIMITER ///

CREATE TRIGGER test.instrigger
AFTER UPDATE ON sales
FOR EACH ROW

BEGIN

    IF NEW.sale <> OLD.sale THEN  
        INSERT INTO history
          (updated, oldvalue, newvalue) 
        VALUES
          ('sale', OLD.sale,NEW.sale);
    END IF;
  
    IF NEW.empsalary <> OLD.empsalary THEN  
        INSERT INTO history
          (updated, oldvalue, newvalue)
        VALUES
          ('empsalary', OLD.empsalary,NEW.empsalary);
    END IF;
END;
///

DELIMITER ;
创建销售表(
orderno INT,
国际销售,
EMPINT,
ts时间戳
);
创建表历史记录(
更新的varchar(20),
oldvalue INT,
新值整数
);
插入销售
(订单号、销售、工资)
价值观
(1,700,7000),
(2,800,8000),
(3,900,9000);
跌落触发试验。仪器仪表;
分隔符///
创建TRIGGER test.instrigger
更新销售信息后
每行
开始
如果是新的,出售旧的,那么出售
载入历史
(更新、旧值、新值)
价值观
('sale',旧的。sale,新的。sale);
如果结束;
如果NEW.empsalary OLD.empsalary,则
载入历史
(更新、旧值、新值)
价值观
('empsalary',旧.empsalary,新.empsalary);
如果结束;
结束;
///
定界符;

除非我误解了你的意思,否则我不确定这对我有什么帮助,我事先不知道更新了哪个列,所以我无法在触发器中硬编码。我需要找出哪些列已经更新,并在审计表中插入它的名称。因此,您必须检查所有列。正如我告诉你的,MySQL中的触发器非常有限。我很害怕。。。因此,如果我的表有5列,我需要使用if语句以及每个列的INSERT,以便审核每个更新的列?有没有办法通过名称访问
NEW
的属性?我正在寻找类似于
NEW的东西。[从pragma\u table\u info(“”)中选择名称]
。更好:
从pragma\u table\u info(“”)中选择NEW.[t.name],OLD.[t.name]作为t,其中NEW.[t.name]OLD.[t.name]
。有办法吗?
create table sales (
  orderno INT, 
  sale INT,
  empsalary int,
  ts TIMESTAMP
);

create table history (
  updated varchar(20),
  oldvalue INT,
  newvalue INT
);

INSERT INTO sales 
  (orderno, sale, empsalary) 
VALUES
  (1,700,7000),
  (2,800,8000),
  (3,900,9000);

DROP TRIGGER test.instrigger;

DELIMITER ///

CREATE TRIGGER test.instrigger
AFTER UPDATE ON sales
FOR EACH ROW

BEGIN

    IF NEW.sale <> OLD.sale THEN  
        INSERT INTO history
          (updated, oldvalue, newvalue) 
        VALUES
          ('sale', OLD.sale,NEW.sale);
    END IF;
  
    IF NEW.empsalary <> OLD.empsalary THEN  
        INSERT INTO history
          (updated, oldvalue, newvalue)
        VALUES
          ('empsalary', OLD.empsalary,NEW.empsalary);
    END IF;
END;
///

DELIMITER ;