2016-09-27 3 views
1

Я пытаюсь создать триггер через pgadmin, чтобы иметь рассчитанный столбец.Создание триггера в postgres

мне нужно сделать: с = а/б

Я создал функцию UpdateC, которая содержит следующий код:

UPDATE table_name 
SET c = a/b 
WHERE id = @id 

, и я объявил @id в качестве параметра.

Тогда я думал, что создам триггер и привяжу его к этой функции, но я узнал, что мне нужно связать его с функцией триггера, а не с функцией.

Теперь я пытаюсь создать функцию триггера с точно такой же SQL, как описано выше, но я получаю следующую ошибку:

syntax error at or near "UPDATE"

вкладке определения, я должен был выбрать язык, так что я выбрал «plpgsql» (другие варианты: «c» и «internal»).

Любая помощь будет глубоко оценена!

ответ

5

Вы должны создать триггер BEFORE, а не UPDATE, но изменить строку до ее написания.

Для получения более подробной информации см. the doocumentation.

Вот доказательство концепции:

CREATE TABLE t (
    id integer PRIMARY KEY, 
    a double precision, 
    b double precision, 
    c double precision 
); 

CREATE OR REPLACE FUNCTION t_trig() RETURNS trigger 
    LANGUAGE plpgsql AS 
$$BEGIN 
    NEW.c = NEW.a/NEW.b; 
    RETURN NEW; 
END;$$; 

CREATE TRIGGER t_trig BEFORE INSERT OR UPDATE ON t FOR EACH ROW 
    EXECUTE PROCEDURE t_trig(); 

INSERT INTO t (id, a, b) VALUES (1, 42, 7); 
INSERT 0 1 
test=> SELECT * FROM t; 
┌────┬────┬───┬───┐ 
│ id │ a │ b │ c │ 
├────┼────┼───┼───┤ 
│ 1 │ 42 │ 7 │ 6 │ 
└────┴────┴───┴───┘ 
(1 row)