MySQL 更新触发器 - 查找更改的列?

2024-03-28

我有一个有 120 列的表。我需要设置审计跟踪,如果发生更改,它将记录任何列。就像现在一样,我想我必须为每一列设置一个具有如下条件的触发器:

IF(NEW.columnName != OLD.columnName)
THEN //log the old value

这需要完成 120 次...虽然 20 年前我会接受这种方法,但今天我拒绝相信不可能自动执行这样一个简单的过程来自动查找已更改的列。

这是我到目前为止发现的:

  • NEW 和 OLD 都不是表,它是一种语言构造,因此您不能执行“SELECT NOW.*”或类似的操作。
  • 触发器中不允许使用动态 SQL(这可以解决问题)。
  • 触发器中不允许使用动态 SQL 的过程(说真的,Oracle,无论如何,看起来您已经非常努力地禁用此功能)。

我想将 BEFORE 和 AFTER 触发器与临时表和变量结合使用,这可能会解决问题,但是仍然需要动态 SQL。我感觉我走进了死胡同。

有没有办法解决这个问题?

附带问题:这在 PostgreSQL 中可能吗?

UPDATE:我发现了两个潜在的解决方案,但对我来说它们都不够清晰:

  • 使用 EVENTS 作为将触发器与动态 SQL 结合使用的解决方法解决方法 https://stackoverflow.com/questions/12575631/workaround-for-dynamic-statements-in-stored-procedures-called-from-triggers。我必须承认,我不太明白这一点,这是否意味着 EVENT 无论如何都会每秒触发?
  • 本文 http://codewordhank.com/sql-server/dynamic-sql-and-a-trigger-gotcha/说只要与临时表一起使用,就可以在触发器内使用动态SQL。那还是用动态SQL,所以不太明白。

有趣的是,几年前我在实现基于动态触发器的审计日志时遇到了同样的问题。我提出的解决方案是简单地生成 SQL 触发器代码,然后可以(自动)应用该代码来替换旧的触发器定义。如果没记错的话,我创建了几个由 PHP 脚本处理的 SQL 模板,该脚本又根据“SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE ...”输出完整的触发器定义是的,触发器代码很大,但它有效!希望有一点帮助=)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 更新触发器 - 查找更改的列? 的相关文章

  • Flask SqlAlchemy 连接两个模型,无需外键 MYSQL

    我正在加入两个没有外键的模型 Models class Users db Model tablename Users userName db Column db String primary key True lastLogin db Co
  • MySQL 唯一 id 或组合 id

    我的项目和开发人员计划的结构如下 developer table id developer name etc project table id project name etc developer project table 因为一个开发人
  • 显示mysql中存储路径的图像

    我已将图像上传到文件夹中并将路径存储到 MySQL 数据库中 路径已存储 图像已成功插入文件夹 但我的问题是当我显示存储在数据库中的路径中的图像时 它没有显示 当我回显图像路径时 它会显示图像路径 我检查了浏览器设置 一切正常 这是我的代码
  • 搜索拥有超过十亿条记录的数据库的最有效方法?

    我的客户有一个巨大的数据库 仅包含三个字段 主键 无符号数 姓名 多字文本 描述 最多 1000 个 varchar 该数据库拥有超过数十亿条条目 我以前没有处理如此大量数据的经验 他希望我设计一个使用 AJAX 如 Google 的界面来
  • 将数据导入mysql的最佳方法

    我有一个包含 500 000 行和大约 10 列的表 该表处于访问状态 我如何将其导入到mysql 这是关于该主题的文章 http www kitebird com articles access migrate html http www
  • 在 SQL 查询中使用聚合函数

    我的表结构是这样的 ATT Table Fields Act ID Assigned To ID Percent Complete Integer value Act ID is primary key Assigned To ID is
  • sql 查询不适用于 order by

    这是我原来有效的查询 Select FROM story st sentences s speaker sp WHERE st lesson id 1 AND st speaker id sp speaker id AND st sente
  • 按任意顺序对 SQL 行输出进行排序?

    因此 在我的数据库中 我存储乐器名称 以及各种其他属性 比方说id是主键 并且name是唯一的密钥 在 PHP 脚本中 我按仪器类别选择项目 如下所示 name mysql real escape string POST name row
  • CodeIgniter 中使用 Active Record 的查询中的 DATE_FORMAT 不起作用

    编码员 我在这里遇到一个小问题 找不到解决方案 我正在使用 CI 的 Active Record 构建查询 这是查询的代码 this gt db gt select u id AS user id u email p display nam
  • CentOs Php 和 MySql 配置

    我已经安装了 php 并运行了一段时间 但我开始从事一个连接到数据库 即 mysql 的项目 所以我安装了 mysql 5 1 73 现在当我使用它连接到数据库时线 dbhandle mysql connect hostname usern
  • 如何从 netbeans 远程调试 jar

    我正在尝试弄清楚如何调试远程运行的 jar 这是我的场景 我的 jar 将从 VPS 运行 这个jar基本上运行一个服务器 对于游戏 所以它还连接到 mysql 数据库 我使用 3 个 bat 文件启动服务器 如下所示 设置 CLASSPA
  • Postgres 在插入访问 NEW 后触发

    我有一个非常简单的触发器 CREATE OR REPLACE FUNCTION f log datei RETURNS TRIGGER AS BEGIN INSERT INTO logs aktion tabelle benutzer id
  • postgresql中插入语句中的加密密码抛出错误(需要添加显式类型转换)

    刚接触 postgresql 这可能很简单 但我不明白 我在 mysql 中有这个 insert into APP USERS VALUES 1 admin adminemailid System Administrator SysAdmi
  • MySQL 存储映像 BLOB 不良实践性能

    我知道不建议在 SQL 中将图像存储为 BLOB 然而 在我的本地 PC 和服务器上同时工作使得在两者之间同步图像变得困难 是否还有理由不单独使用 BLOB 作为备份 这会在本地创建缓存文件 以静态方式提供服务 本质上 只有选择 BLOB
  • MySQL“GROUP BY NULL”是做什么的?

    我正在维护一些遗留代码 其中有一个我不理解的 SQL 查询 我希望这里有人可以向我解释这样做的目的 查询如下所示 select from product performance where merchantid 2151277 and cl
  • 在插入行上返回最后一个 ID (IDENTITY) VB.NET MySQL

    Dim insert coupon query As String INSERT INTO qa discountcoupons id status code VALUES AUTO INCREMENT ID 5 Dim cmd query
  • 获取两个表中某段时间内SUM数量的数据

    我有下面两张表 订单详细信息 OrderNumber quantityordered priceEach Orders OrderNumber orderDate 问题 orderDate 看起来像这样 2005 01 01 2005 02
  • MySQL 监听通知等效项

    是否有相当于 PostgresQL 的notify http www postgresql org docs 9 1 static sql notify html and listen http www postgresql org doc
  • mysql_insert_id 带更新

    执行下面的查询后 我使用 PHP 函数mysql insert id 它总是给我0 UPDATE tbl training types SET fld serial serial no fld name training name fld
  • 初学者 MYSQL 错误 - 访问被拒绝

    错误 1045 28000 用户 root localhost 的访问被拒绝 使用密码 N 哦 我已经尝试了一切 我已经阅读了一页又一页的答案 但似乎没有人知道正确的答案 当我尝试登录我的数据库时 我只是收到上述错误 我还没有设置密码或其他

随机推荐