2016-09-26 4 views
0

Некоторые из моих моделей данных имеют отношения, которые должны быть обновлены при изменении их дочерних элементов, таких как многоточечная локация, которая представляет собой коллекцию многих детей с точками, которые необходимо обновить если ребенок перемещается. Множество таких отношений существует, и я хотел бы обработать сохранение целостности этих отношений в одной процедуре триггера +, которая запускает следующую процедуру при обновлении соответствующих полей в отношении затронутых отношений родителя.Как выполнить запрос условно в процедуре plpgsql

Как форматировать эти запросы и условными таким образом, что он выполняет следующие действия:

CREATE TABLE parents (
    id BIGSERIAL PRIMARY KEY, 
    caption TEXT, 
    title TEXT, 
    tags CHARACTER VARYING(32)[] DEFAULT '{}', 
    rating SMALLINT DEFAULT 0 
) 
CREATE TABLE children (
    id BIGSERIAL PRIMARY KEY, 
    tags CHARACTER VARYING(32)[] DEFAULT '{}', 
    rating SMALLINT DEFAULT 0 
) 
CREATE TABLE parent_children (
    parent_id BIGINT, 
    child_id BIGINT 
) 

CREATE OR REPLACE FUNCTION child_updated_func() RETURNS TRIGGER AS $$ 
    BEGIN 
     IF (OLD.tags != NEW.tags) 
      UPDATE parents 
      SET tags = tags || NEW.tags 
      WHERE 
       parent_children.child_id = NEW.id 
       AND parents.id = parent_children.parent_id; 
     IF (OLD.rating != NEW.rating) 
      UPDATE parents 
      SET rating = MAX(parent_children.rating) 
      FROM parent_children 
      WHERE 
       parent_children.child_id = NEW.id 
       AND parents.id = parent_children.parent_id; 
     RETURN NEW; 
    END 
$$ LANGUAGE plpgsql; 

CREATE TRIGGER child_updated 
    AFTER UPDATE ON children 
    FOR EACH ROW 
    EXECUTE PROCEDURE child_updated_func(); 
+0

Пожалуйста [править] Ваш вопрос добавить 'создать таблицу 'операторов для рассматриваемых таблиц. [_Formatted_] (http://stackoverflow.com/editing-help#code) ** текст **, пожалуйста, [без скриншотов] (http://meta.stackoverflow.com/questions/285551/why-may-i -not-upload-images-of-code-on-so-when-ask-a-question/285557 # 285557) –

ответ

1

Вы, вероятно, хотите что-то вроде этого:

CREATE OR REPLACE FUNCTION func() RETURNS TRIGGER AS $$ 
    BEGIN 
     IF (OLD.tags != NEW.tags) THEN 
      UPDATE parents 
      SET tags = tags || NEW.tags 
      WHERE 
       parent_children.child_id = NEW.id 
       AND parents.id = parent_children.parent_id; 
     END IF; 
     IF (OLD.rating != NEW.rating) 
      UPDATE parents 
      SET rating = MAX(parent_children.rating) 
      FROM parent_children 
      WHERE 
       parent_children.child_id = NEW.id 
       AND parents.id = parent_children.parent_id; 
     END IF; 
     RETURN NEW; 
    END 
$$ LANGUAGE plpgsql; 
+0

Это именно то, что я хотел, спасибо! И эти запросы выполняются последовательно, правильно? – terpak

+1

@terpak Да, они есть. – redneb

+0

также просто хэдз-ап на случай, если вы хотите обновить свой ответ, я удалил псевдокод в пользу наличия всей информации sql там, согласно запросу a_horse_with_no_name. Еще раз спасибо! – terpak