1

我是 Postgresql 的新手,所以这个问题对你们来说可能很愚蠢!我想在触发器函数中使用引用的表,但有些函数似乎无法访问引用的别名 ( new_table):

CREATE FUNCTION Function_Name()
RETURNS TRIGGER AS
$$
BEGIN
    SELECT tbl.some_field INTO new_table.other_field
    from some_table as tbl;
    return null;
END;
$$ LANGUAGE PLPGSQL;

我有这个错误:

"new_table.other_field" is not a known variable 

这是触发代码:

CREATE TRIGGER Trigger_Name 
AFTER INSERT
ON Table_Name
REFERENCING NEW TABLE AS new_table
FOR EACH ROW
EXECUTE FUNCTION Function_Name();

函数代码应该先执行然后触发器的,那么函数如何访问触发器定义中稍后引用的别名?

以及如何访问函数中引用的表别名?

注意:在我的示例中,我尝试使用别名,因此当我使用NEW代替 new_table时,函数已成功创建!

4

1 回答 1

0

问题是我想NEW使用别名在表中设置数据,但是要做到这一点,我应该使用原始名称NEW而不是引用的别名new_table..

引用的别名new_table可用于仅从中获取数据,例如 in FROM CLAUSEjoins并且WHERE CLAUSE不会更改引用表中的数据。


更新:

这是我为测试所做的示例:

create table test_table2(
    id int primary key,
    name varchar(255)
    )

create table test_table(
    id int primary key,
    name varchar(255)
    )

create or replace function F_test_table()
returns trigger as $$
begin
    insert into test_table2(id, name)
    select id, name from new_table;
    return null;
end;
$$ LANGUAGE PLPGSQL;

drop trigger if exists tr_test_table ON test_table;
create trigger tr_test_table
AFTER INSERT
ON test_table
REFERENCING NEW TABLE AS new_table
for each row    ------- row level trigger ---------
EXECUTE FUNCTION F_test_table();


insert into test_table
values(1, '11111')

select * from test_table2

请注意,触发器将数据插入 test_table2

于 2019-02-13T10:52:38.903 回答