如何创建一个 Postgres 11 触发器函数,在插入或更新表"a"时在表'b'中插入一个新行?



我在RDS上运行Postgres 11。
我试图创建一个简单的触发函数插入记录到表'test_alias'每当一行插入到表'test_values'

我有以下表格:

CREATE TABLE the_schema.test_values (
id INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
created_at TIMESTAMP WITH TIME ZONE DEFAULT now(), 
value_1 TEXT NOT NULL, 
value_2 TEXT NOT NULL,
value_quantity INTEGER NOT NULL
);
CREATE TABLE the_schema.test_alias (
id INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
created_at TIMESTAMP WITH TIME ZONE DEFAULT now(), 
value_1_copy TEXT NOT NULL, 
value_2_copy TEXT NOT NULL,
value_quantity_copy INTEGER NOT NULL
);

我的触发函数是这样的:

CREATE OR REPLACE FUNCTION the_schema.populate_test_alias()
RETURNS TRIGGER AS
$BODY$
BEGIN
IF NEW.the_schema.test_values THEN 
INSERT INTO the_schema.test_alias (value_1_copy, value_2_copy, value_quantity_copy)
VALUES (NEW.value_1, NEW.value_2, NEW.value_quantity);
END IF;
return null;
END; 
$BODY$ LANGUAGE plpgsql;

这里是触发器:

CREATE TRIGGER TRG_TEST_ALIAS 
AFTER INSERT OR UPDATE ON the_schema.test_values
FOR EACH ROW 
execute procedure the_schema.populate_test_alias();

当插入时:

INSERT INTO the_schema.test_values (value_1, value_2, value_quantity)
VALUES ('abc', 'xyz', 1);

我得到这个错误:

ERROR:  missing FROM-clause entry for table "the_schema"
LINE 1: SELECT NEW.the_schema.test_values

我也尝试过使用默认模式的等效设置,它仍然错误(尽管是不同的错误):

ERROR:  record "new" has no field "test_values"
CONTEXT:  SQL statement "SELECT NEW.test_values"
PL/pgSQL function populate_test_alias() line 3 at IF

在我看来,我使用NEW关键字的方式一定有错误,但据我所知,我在函数中使用它的方式与我提到的几个例子(在线/SO和硬拷贝)相同,我无法弄清楚。

所有的指导是非常感谢!


类似问题的例子供参考,包括官方文档的链接(我也读过,但显然不理解我应该):[https://stackoverflow.com/questions/11001118/postgres-trigger-after-insert-accessing-new]

NEW引用插入或更新的行。因此,NEW.只对字段标识符有意义。

value_1, value_2value_quantity也有NOT NULL约束,这意味着您不需要对它们进行测试。

所以你可以省略整个条件:

CREATE OR REPLACE FUNCTION the_schema.populate_test_alias()
RETURNS TRIGGER AS
$BODY$
BEGIN
--IF NEW.the_schema.test_values THEN 
INSERT INTO the_schema.test_alias (value_1_copy, value_2_copy, value_quantity_copy)
VALUES (NEW.value_1, NEW.value_2, NEW.value_quantity);
--END IF;
return null;
END; 
$BODY$ LANGUAGE plpgsql;

最新更新