2016-10-04 1 views
0

Я хочу создать триггер для операции Insert и процедуру, которая печатает вставленное значение.Как напечатать новое значение с помощью триггера Postgres

CREATE TRIGGER added_product_info_trigger 
BEFORE INSERT 
ON products 
EXECUTE PROCEDURE added_product_info(); 

И моя процедура

CREATE OR REPLACE FUNCTION added_product_info() 
RETURNS trigger 
AS 
$$ 
    (Select p.productname, s.companyname from products as p, suppliers as s 
    where p.supplierid = s.supplierid) 
$$ LANGUAGE SQL; 

Как я могу напечатать мое вставленное значение?

+0

'рейза notice': https: // w ww.postgresql.org/docs/current/static/plpgsql-errors-and-messages.html#PLPGSQL-STATEMENTS-RAISE –

ответ

2

Функции Sql не могут возвращаться trigger. Вероятно, вы хотели написать функцию plpgsql.

Функция триггера не может сгенерировать какой-либо результат (например, результаты запроса select). Вы можете использовать raise notice передать некоторые результаты в клиентской программе:

create or replace function added_product_info() 
returns trigger as $$ 
declare 
    company text; 
begin 
    select companyname 
    from suppliers 
    where supplierid = new.supplierid 
    into company; 
    raise notice 'inserted: "%" supplied by "%"', new.productname, company; 
    return new; 
end; 
$$ language plpgsql; 

Запись new видна в функции запуска только если триггер объявлен for each row (по умолчанию for each statement при записи new и old не доступны):

create trigger added_product_info_trigger 
before insert on products 
for each row 
execute procedure added_product_info(); 

Если триггер before insert for each row он должен вернуть new.

Обратите внимание, что клиент должен быть готов получить и обработать уведомление. При выполнении запроса в стандартной Psql программы оболочки, вы будете получать:

insert into products values ('some product', 1); 
NOTICE: inserted: "some product" supplied by "company" 
INSERT 0 1 

Read:

Смежные вопросы