mysql - 使用触发器更新后跟踪表行中的更改并将更改的列名和值写入另一个表

标签 mysql

我正在为更新时表中的记录更改编写触发器 我的触发器是

CREATE TRIGGER vehicle_mst_log 
AFTER UPDATE ON vehicle_mst
FOR EACH ROW BEGIN  
    IF (OLD.COLUMN1 != NEW.COLUMN1) THEN
        INSERT INTO ABN_OLDLOGTABLE (
            TABLENAME,
            COLUMNNAME,
            OLDVALUE,
            NEWVALUEW,
            TIME,
            USER)
        VALUES (
            "TABLE",
            "COLUMN1",
            COLUMN1OLDVALUE,
            COLUMN1NEWVALUE,
            NOW(),
            USER);
    END IF;
    IF (OLD.COLUMN2 != NEW.COLUMN2) THEN
        INSERT INTO ABN_OLDLOGTABLE (
            TABLENAME,
            COLUMNNAME,
            OLDVALUE,
            NEWVALUEW,
            TIME,
            USER)
        VALUES (
            "TABLE",
            "COLUMN2",
            COLUMN2OLDVALUE,
            COLUMN2NEWVALUE,
            NOW(),
            USER);
    END IF;
END;

但是我在表中有大约 40 列任何其他在循环中写入列名称并检查值更改的简单方法

最佳答案

您可能需要编写小型实用程序来从 MySQL 读取给定表的架构并创建检查所有列的触发器。他们需要在表结构更改后重新运行此实用程序。如果您在编写此类实用程序时需要帮助,请告诉我。

这是生成触发器的脚本:

#!/bin/sh

db="$1";
shift

echo "DELIMITER ;;"
for table in "$@"
do
  sql="show columns from $table"
  columns=`mysql -B -N -e "$sql" "$db" | cut -f 1`
  echo "CREATE TRIGGER ${table}_log"
  echo "AFTER UPDATE ON $table"
  echo "FOR EACH ROW BEGIN"
  for column in $columns
  do
    echo "  IF (OLD.$column != NEW.$column) THEN"
    echo "    INSERT INTO ABN_OLDLOGTABLE (TABLENAME, COLUMNNAME, OLDVALUE, NEWVALUEW, TIME, USER)"
    echo "    VALUES (\"$table\", \"$column\", OLD.$column, NEW.$column, NOW(), USER());"
    echo "  END IF;"
  done
  echo "END;;"
done

保存为trigger.sh,设置可执行位(chmod a+x trigger.sh),然后像这样运行:

trigger.sh dbname table1 table2 ...

它将在 STDIN 上打印触发器代码。

关于mysql - 使用触发器更新后跟踪表行中的更改并将更改的列名和值写入另一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15060193/

相关文章:

mysql - 如何检索表中出现次数不多的值的行?

mysql - 删除文件排序以改进mysql查询

PHP MySQL 网站到外部 SQL 系统集成

php - MySQL 从 PHP 插入 ://INPUT multiple rows

mysql - 从 MySql 查询某些值的 WordPress 简码

mySQL SUBSTRING 在 WHERE 子句中有多个条件

php - SQL QUERY 选择禁止列表、子级和父级连接

mysql - 检索每个组中的最后一条记录 - MySQL

mysql - 如何在 mysql 表中插入西里尔符号?

mysql - 查找 MySQL JSON 对象或数组的交集