【发布时间】: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