sql - 使用触发器的 PostgreSQL 审计历史

标签 sql postgresql triggers sql-update

我需要维护一个历史表,该表将跟踪我数据库中所有表中发生的所有修改。

下面是认可的sql,是一个通用的表,会接受表名,列名,值,涉及的 Action (插入/更新/删除)等。

CREATE TABLE "User_History" (
  "id" serial,
  "table_name" text NOT NULL,
  "column_name" text NOT NULL,
  "pk_id" text,
  "old_value" text,
  "new_value" text,
  "action" text,
  "modified_at" timestamp NOT NULL DEFAULT NOW(),
  "modified_by" UUID NOT NULL,
  PRIMARY KEY ("id")
);

任何跨数据库的 CRUD 操作都必须插入到这个表中。

我总共有78张 table (以后很可能会增加)。 go to 方法是使用触发器。 这让我很担心。因为,如果我的理解是正确的,我将不得不为每一列创建一个函数,然后将其绑定(bind)到触发器。这意味着,如果我在 78 个表中各有 10 列,那么它将总共有 780 个函数(每个函数代表每个表的各个列)和调用这些函数的相等数量的触发器。

我真的希望有更好的解决方案。目前根本不可能在代码中跟踪这一点。

我们将不胜感激任何对此问题的帮助。

最佳答案

每个表需要一个触发器,而不是每个列。

您可以为每个表编写一个触发器函数,或者编写一个适用于所有表的通用触发器函数。

关于sql - 使用触发器的 PostgreSQL 审计历史,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56873432/

相关文章:

c# - 在应用程序中硬编码主键值

android - 如何在 DBFlow 中进行复杂查询?

mysql - 计算用户点击 MySQL 中不同事件的数量

json - Postgres json_object。仅当值不为空时才添加 json 字段

javascript - 以编程方式向 Google Apps 脚本中的加载项添加基于时间的触发器

gif动画完成时javascript触发

mysql - QSqlQuery 仅返回两列 SELECT * FROM ...,知道为什么我没有得到所有列吗?

ruby-on-rails - 为什么会出现此重复列错误?

sql-server - SQL Server 内部级联更新/删除如何工作?

sql - 为什么我们使用 `As foo (geom)` 而不是 `As geom`