当前位置: 首页 > 面试题库 >

使用MySQL触发器将所有表更改记录到辅助表

赵钊
2023-03-14
问题内容

我有一张桌子:

CREATE TABLE `data_table` (
`data_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`field1` INT NOT NULL ,
`field2` INT NOT NULL ,
`field3` INT NOT NULL
) ENGINE = MYISAM ;

我会记录将任何机会记录到field1、2或3上:

CREATE TABLE `data_tracking` (
`tracking_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`data_id` INT NOT NULL ,
`field` VARCHAR( 50 ) NOT NULL ,
`old_value` INT NOT NULL ,
`new_value` INT NOT NULL ,
`modified` DATETIME NOT NULL
) ENGINE = MYISAM ;

我正在使用MySQL
5,我想创建一个触发器来做。我想在data_table更新时随时向data_tracking中插入新行,并记录旧的/更新的值以及更改的字段。我尝试了以下方法,但没有成功。

DELIMITER $$

DROP TRIGGER `update_data `$$

CREATE TRIGGER `update_data` AFTER UPDATE on `data_table`
FOR EACH ROW
BEGIN
    IF (NEW.field1 != OLD.field1) THEN
        INSERT INTO data_tracking set old_value = OLD.field1, new_value = NEW.field1, field = "field1";
    END IF;
END$$

DELIMITER ;

它在插入行上给出了错误,我不太确定该使用什么语法,或者我是否正以正确的方式进行操作。任何帮助,将不胜感激。谢谢。


问题答案:

插入语法为

INSERT INTO table (columns_list) VALUES (values_list)

因此您的插入内容应如下所示(我不是MySQL专家,但您可以适合查询):

INSERT INTO data_tracking 
(`data_id` , `field` , `old_value` , `new_value` , `modified` ) 
VALUES 
(NEW.data_id, 'field1', OLD.field, NEW.field, CURRENT_DATETIME());

并重复它以对field2和field3进行修改

我认为这将是完整的触发器,请尝试:

DELIMITER $$

DROP TRIGGER `update_data `$$

CREATE TRIGGER `update_data` AFTER UPDATE on `data_table`
FOR EACH ROW
BEGIN
    IF (NEW.field1 != OLD.field1) THEN
        INSERT INTO data_tracking 
            (`data_id` , `field` , `old_value` , `new_value` , `modified` ) 
        VALUES 
            (NEW.data_id, "field1", OLD.field1, NEW.field1, NOW());
    END IF;
    IF (NEW.field2 != OLD.field2) THEN
        INSERT INTO data_tracking 
            (`data_id` , `field` , `old_value` , `new_value` , `modified` ) 
        VALUES 
            (NEW.data_id, "field2", OLD.field2, NEW.field2, NOW());
    END IF;
    IF (NEW.field3 != OLD.field3) THEN
        INSERT INTO data_tracking 
            (`data_id` , `field` , `old_value` , `new_value` , `modified` ) 
        VALUES 
            (NEW.data_id, "field3", OLD.field3, NEW.field3, NOW());
    END IF;
END$$

DELIMITER ;


 类似资料:
  • 问题内容: 我正在寻找一种记录SQL Server 2005数据库中一组特定表上发生的更改的好方法。我相信,做到这一点的最佳方法是通过对更新和删除执行触发器。无论如何,有没有要抓住正在运行的实际语句?一旦有了该语句,我就可以轻松地将其记录在其他地方(其他数据库表)。但是,我还没有找到一种简单的方法(如果可能)来获取正在运行的SQL语句。 问题答案: 触发器不好,我会远离触发器。 如果您尝试对某些问

  • 问题内容: 我有一个班上的一个项目。当我们的两个表对它们进行了更改时,我们需要创建一个日志:insert / update /delete。我们需要使用Oracle触发器和PL-SQL。在日志文件中,我们需要记录UserID,DateTime,IPAddress和Event(插入/更新/删除)。我知道如何设置触发器,但是我遇到的主要问题是UserID(从以UserID在Users表中登录到PHP站

  • 我有两张表“产品”和“库存”。表将包含所有产品。在库存表中,我每次都将产品的库存保存为一个新的条目。 我有两种类型的产品。“1”类型的产品将以stock作为编号,“0”类型的产品将以stock作为重量。因此,在products表中,我创建了两列“stock_weight(保持在库存表中输入的总重量)”和“pieces(保持在库存表中输入的总数量)”。 为此,我在stock表上创建了一个触发器,每当

  • 我试图从DynamoDB表中设置ElasticSearch导入过程。我已经创建了AWS Lambda并启用了带有触发器的DynamoDB流,该触发器为每个添加/更新的记录调用我的Lambda。现在我想执行初始种子操作(将DynamoDB表中当前的所有记录导入ElasticSearch)。我该怎么做?有没有办法让表中的所有记录都“重新处理”并添加到流中(这样我的lambda就可以处理它们)?还是最好

  • 问题内容: 为了测试查询的正确性,我需要禁用db中的所有触发器。我看到在information_schema中存在表TRIGGERS。是否可以使用此表暂时禁用所有触发器?例如: 完成所有测试后,返回所有触发器,例如: 可能这可能会损坏db或在触发后将不起作用?我没有在文档中找到它。 问题答案: 您不能直接禁用触发器,我也不建议您做您建议的事情,但是您可以让触发器检查变量(在下面的示例中)是否 在执

  • 问题内容: 如何创建数据库触发器以将行更改记录到H2中的另一个表? 在MySQL中,这可以轻松完成: 问题答案: 声明此触发器: 使用Java / JDBC实现触发器: 用jOOQ实现触发器: 由于您在问题中添加了jOOQ标记,因此我怀疑这种替代方法也可能是相关的。您当然可以在H2触发器内使用jOOQ: