【问题标题】:PostgreSQL: back-up table has different ID from parentPostgreSQL:备份表的 ID 与父表不同
【发布时间】:2021-07-23 11:43:20
【问题描述】:

我们在 PostgreSQL 中使用DO ALSO RULEs 来创建审计(历史)表。

我注意到,当我有一个 SERIAL 列时,值在父表和审计表之间“共享”(因此您不能将值用于 JOIN 表)。

我使用CREATE TABLE abc AS SELECT * FROM def...创建了审计表

如何确保SERIAL 列在两个表之间具有相同的值?

编辑,这是完整的测试用例

第 1 步 - 创建父表(要审计/历史跟踪的表)

CREATE TABLE audit_testing_parent (
    id SERIAL PRIMARY KEY,
    varchar_col1 VARCHAR NOT NULL,
    varchar_col2 VARCHAR NOT NULL,
    int_col INTEGER,
    created_on TIMESTAMP DEFAULT NOW()
);

第 2 步 - 插入一些数据

INSERT INTO audit_testing_parent(varchar_col1, varchar_col2, int_col)
VALUES ('test01','test01',1);

第 3 步 - 创建审核表

CREATE TABLE audit_testing_audit
AS SELECT 'INSERT' audit_Type, NOW() audit_time, a.*
   FROM audit_testing_parent a
;

第 4 步 - 创建一个规则来审核父母的数据

create rule audit_testing_parent_on_insert as on insert to audit_testing_parent do also
insert into audit_testing_audit
(
    audit_type,
    audit_time,
    id,
    varchar_col1,
    varchar_col2,
    int_col,
    created_on
)
values
(
'INSERT',
now(),
    new.id,
    new.varchar_col1,
    new.varchar_col2,
    new.int_col,
    new.created_on
);

第 4 步 - 通过执行另一个 INSERT 测试规则

INSERT INTO audit_testing_parent(varchar_col1, varchar_col2, int_col)
VALUES ('test02','test02',2);

父表现在如下所示:

审计表如下所示:

注意 ID 列的区别。

在父表中,int_col = 2id = 2 所在行

但审计表中的同一行(int_col = 2),id = 3

如何确保RULE 处理SERIAL 列,以便两个表在ID 列中具有相同的值?

【问题讨论】:

  • 不清楚:您希望列相同与否?您的 CREATE TABLE 将复制所有行,因此所有列都是相同的。
  • 嗨@Laurenz Albe,我希望两张表中的值相同,但它们似乎使用相同的序列。当我创建初始表时,所有值都完全相同。但是,当我在父项中执行 INSERT 时,RULE 会在审计表中执行 INSERT。在此表中,序列列的值不同。两者似乎都从每个 INSERT 的序列中选择下一个值。
  • 您使用CREATE TABLE ... AS SELECT 创建的表将没有定义默认值。您应该编辑问题并告诉我们您如何使用序列来填充表格。
  • 感谢@LaurenzAlbe 的回复,我进行了编辑并为我的测试用例添加了所有步骤。

标签: postgresql triggers rules


【解决方案1】:

那行不通,因为规则不是这样运作的。如果您将nextval('someseq') 插入主表,则该规则将对审计表执行相同的操作,因此您将获得下一个序列值。

解决方案不是为此使用规则,而是使用触发器。

【讨论】:

    猜你喜欢
    • 2016-06-11
    • 1970-01-01
    • 2020-11-29
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多