ссылка на новую таблицу как на new_table, невидимую для функции триггера Postgresql - PullRequest
0 голосов
/ 13 февраля 2019

Я новичок в 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 , функция создается успешно!

1 Ответ

0 голосов
/ 13 февраля 2019

Проблема заключалась в том, что я пытаюсь установить данные в таблице NEW с использованием псевдонима, однако для этого я должен использовать исходное имя NEW, а не ссылочный псевдоним new_table ..

Ссылочный псевдоним new_table может использоваться только для получения данных, как в FROM CLAUSE, joins и 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

...