Скопируйте значение поля последней строки в другую таблицу столбцов с триггером - PullRequest
0 голосов
/ 07 ноября 2018

Я работаю в PostgreSQL, используя триггер. У меня есть 2 таблицы здесь, invoice_items и счет-фактура. В таблицу 'invoice' данные вставляются из системы, затем таблица 'invoice_items' заполняется с помощью триггера, чтобы получить значения из вставленных данных таблицы 'invoice'. Каждая вставка из системной системы состоит из двух строк, подобных этой:

таблица «накладная»:

id       invoice_date     statement  amount
 1        2018-10-03       Insert      5
 2        2018-10-03       Update      6

затем таблица 'invoice_items' после триггера вставляет данные счета:

id         total     statement
 1           5         Insert
 2           6         Update

Триггер:

create trigger do_fetch
    after insert
    on invoices
    for each row
    execute procedure insert_amount();

функция insert_amount ():

create function insert_amount()
  returns trigger
language plpgsql
as $$
BEGIN
  INSERT INTO invoice_items (total, statement) VALUES (new.amount, new.statement);
return null;
END;

$$;

Но я просто хочу получить последние вставленные данные «счетов-фактур», чтобы вызвать «invoice_items» для достижения такого результата:

id       invoice_date     statement  amount
 1        2018-10-03       Insert      5
 2        2018-10-03       Update      6



id         total     statement
 1           6         Update

Я попытался изменить триггер на это:

create constraint trigger do_fetch
        after insert
        on invoices
        deferrable
        for each row
        execute procedure insert_amount();

но я все еще вставляю 2 строки в таблицу 'invoice_items' - не только последняя строка, какая-либо подсказка? Спасибо

1 Ответ

0 голосов
/ 08 ноября 2018

Вот пример - вам просто нужно настроить sql с нужными именами таблиц и столбцов:

test=# create table bla1(ts timestamp, content text);
CREATE TABLE
test=*# create table bla1_log(ts timestamp, content text);
CREATE TABLE
test=*# create or replace function trg_bla1() returns trigger as $$begin insert into 
bla1_log values (new.ts, new.content); return new; end; $$language plpgsql;
CREATE FUNCTION
test=*# create trigger trg1 after insert on bla1 for each row when (NEW.content = 
'Update') execute procedure trg_bla1();
CREATE TRIGGER
test=*# insert into bla1 values (now(), 'bla');
INSERT 0 1
test=*# commit;
COMMIT
test=# insert into bla1 values (now(), 'Insert');
INSERT 0 1
test=*# commit;
COMMIT
test=# insert into bla1 values (now(), 'Update');
INSERT 0 1
test=*# select * from bla1;

тс | содержание

---------------------------- + ---------

2018-11-08 12: 32: 28.803439 | л

2018-11-08 12: 33: 30.355516 | Вставить

2018-11-08 12: 33: 38.451548 | Обновление

(3 ряда)

 test=*# select * from bla1_log ;

тс | содержание

---------------------------- + ---------

2018-11-08 12: 33: 38.451548 | Обновление

(1 строка)

 test=*#

EDIT:

Из-за вашего отсутствия ответов и попыток скорректировать ваш код в соответствии с моим ответом, я не уверен, стоит ли это даже моего времени - но вот что должно сработать для вас ..

 create table invoice(id serial, invoice_date text, statement text, amount integer);


 create table invoice_items(id serial, total integer, statement text);


 create or replace function insert_amount() returns trigger as $$begin 
 insert into invoice_items values (id, total, statement); return new; end; 


 create trigger mytrigger after insert on invoice for each row when (NEW.statement = 'Update') execute procedure insert_amount();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...