我在 Postgres 中创建了一个过程,它将创建一个包含另外三个表的内容的表(SELECT 和 JOINS)。然后,将修改结果表,添加两个之前不存在的列,最后在同一个过程中,我创建了 3 个触发器,它们将应用于这三个表,因此,只要对任何一个表进行新的写入,相同的实体就会记录在新表中
我知道该过程本身是原子的,并且从其自身范围来看是事务性的,但该过程无法了解有关这三个表的任何信息。我担心在新表创建与触发器创建之间的时间内,可能会发生对现有表的一些写入,从而使新表不同步,新表不会记录这些写入。这不可能发生。
我的表创建/触发器创建过程如下:
CREATE OR REPLACE PROCEDURE myschema.table_creation()
LANGUAGE plpgsql
AS $procedure$
begin
create table newtable as
SELECT * FROM myschema.session a NATURAL JOIN (SELECT * FROM myschema.message b NATURAL left JOIN myschema.data) as d;
ALTER TABLE myschema.newtable ADD created_at timestamp;
ALTER TABLE myschema.newtable ADD source text;
CREATE TRIGGER mytrigger
after INSERT
ON myschema.session
FOR EACH ROW
EXECUTE PROCEDURE myschema.trigger_proc();
CREATE TRIGGER mytrigger
after INSERT
ON myschema.messages
FOR EACH ROW
EXECUTE PROCEDURE myschema.trigger_proc();
CREATE TRIGGER mytrigger
after INSERT
ON myschema.data
FOR EACH ROW
EXECUTE PROCEDURE myschema.trigger_proc();
end;
$procedure$
;
我如何锁定现有表中的写入以将其推迟到整个 table_creation 过程完成?否则,我将面临竞争条件,并且新表中的一些实体将丢失。我认为我当前状态下的过程没有任何针对写入的保护