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

Sql 如何创建Postgres 11触发器函数,在表';中插入新行;b';插入或更新表';a';?,sql,postgresql,triggers,amazon-rds,sql-function,Sql,Postgresql,Triggers,Amazon Rds,Sql Function,我正在RDS上运行Postgres 11。 我试图创建一个简单的触发器函数,以便在“test\u values”表中插入行时将记录插入到“test\u alias”表中 我有以下表格: CREATE TABLE the_schema.test_values ( id INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY, created_at TIMESTAMP WITH TIME ZONE DEFAULT now()

我正在RDS上运行Postgres 11。
我试图创建一个简单的触发器函数,以便在“test\u values”表中插入行时将记录插入到“test\u alias”表中

我有以下表格:

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

我还尝试了使用默认模式的等效设置,但仍然有错误(尽管有不同的错误):

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

非常感谢您的指导


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

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

而且
value\u 1、value\u 2
value\u quantity
具有
notnull
约束,这意味着您无需对它们进行测试

因此,您可以删除整个条件:

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;

如果是NEW.the_schema.test_值,那么
应该测试什么?新引用插入的行。好问题!我从一个教程中复制了它,但现在您提到了它,它确实看起来是多余的--让我尝试一下,不使用其中的条件--编辑:删除
if
语句后,我得到以下错误:
error:record“new”没有字段“test\u values”上下文:SQL语句“SELECT new.test\u values”PL/pgSQL函数在IF
处填充第3行的测试别名,删除整行,如果很明显,则删除结尾。很好,成功了!谢谢你的帮助,我真的很感激!
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;