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 ;