我正在为更新时表中的记录更改编写触发器 我的触发器是
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/