PostgreSQL: back-up table 与 parent 的 ID 不同
PostgreSQL: back-up table has different ID from parent
我们在 PostgreSQL 中使用 DO ALSO RULEs
来创建审计(历史)tables。
我注意到,当我有一个 SERIAL
列时,值在 parent 和审计 table 之间“共享”(因此您不能使用JOIN
tables).
的值
我通过审核 tables 与 CREATE TABLE abc AS SELECT * FROM def...
如何确保 SERIAL
列在两个 table 之间具有相同的值?
编辑,这里是完整的测试用例
第 1 步 - 创建 parenttable(要审计/历史跟踪的那个)
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 步 - 创建审计 table
CREATE TABLE audit_testing_audit
AS SELECT 'INSERT' audit_Type, NOW() audit_time, a.*
FROM audit_testing_parent a
;
第 4 步 - 创建规则来审核 parent 的数据
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);
parent table 现在看起来像这样:
审核 table 如下所示:
注意 ID 列中的差异。
在parenttable所在的行int_col = 2
id = 2
但是在同一行审计table(int_col = 2
),id = 3
如何确保 RULE
处理 SERIAL
列,以便两个 table 在 ID 列中具有相同的值?
那是行不通的,因为那不是规则的运作方式。如果您将 nextval('someseq')
插入您的主 table,该规则将对审计 table 执行相同的操作,因此您将获得下一个序列值。
解决方案不是为此使用规则,而是使用触发器。
我们在 PostgreSQL 中使用 DO ALSO RULEs
来创建审计(历史)tables。
我注意到,当我有一个 SERIAL
列时,值在 parent 和审计 table 之间“共享”(因此您不能使用JOIN
tables).
我通过审核 tables 与 CREATE TABLE abc AS SELECT * FROM def...
如何确保 SERIAL
列在两个 table 之间具有相同的值?
编辑,这里是完整的测试用例
第 1 步 - 创建 parenttable(要审计/历史跟踪的那个)
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 步 - 创建审计 table
CREATE TABLE audit_testing_audit
AS SELECT 'INSERT' audit_Type, NOW() audit_time, a.*
FROM audit_testing_parent a
;
第 4 步 - 创建规则来审核 parent 的数据
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);
parent table 现在看起来像这样:
审核 table 如下所示:
注意 ID 列中的差异。
在parenttable所在的行int_col = 2
id = 2
但是在同一行审计table(int_col = 2
),id = 3
如何确保 RULE
处理 SERIAL
列,以便两个 table 在 ID 列中具有相同的值?
那是行不通的,因为那不是规则的运作方式。如果您将 nextval('someseq')
插入您的主 table,该规则将对审计 table 执行相同的操作,因此您将获得下一个序列值。
解决方案不是为此使用规则,而是使用触发器。