2013-09-02 3 views
1

У меня есть таблица «сообщений». И для каждой строки INSERT я должен ВСТАВИТЬ несколько копий этой строки в одной и той же таблице «сообщения» (для массовой рассылки). Я запускаю его (например, для одного экземпляра).plpgsql: расширение новой строки в функции триггера

CREATE OR REPLACE FUNCTION some_trigger() 
    RETURNS trigger AS 
$BODY$ 
DECLARE 
BEGIN 
INSERT INTO messages (some_field) VALUES (NEW.some_value_copy) 
RETURN NEW; 
END 
$BODY$ 
    LANGUAGE plpgsql; 
CREATE TRIGGER some_tg BEFORE INSERT ON messages FOR EACH ROW EXECUTE PROCEDURE some_trigger(); 

Как я могу продлить НОВО для INSERT INTO messages (some_field) VALUES (NEW.some_value),(NEW.some_value_copy)? ТНХ

+2

вы говорите, что вы хотите * дублировать * каждую строку, вставленную в таблицу? Что такое PostgreSQL-версия? Что вы пытаетесь достичь с этим? –

+0

Да, более точным было бы хорошо –

+0

Да, я пытаюсь дублировать его. веры. 9.2. На самом деле строки немного разные. Каждая строка - это образец сообщения, принадлежащего пользователю. – GeraldIstar

ответ

1

До сих пор не знаю вашу схему, так что трудно помочь, но я думаю, что вы могли бы сделать что-то близкое к этому:

CREATE OR REPLACE FUNCTION ins_messages() 
    RETURNS trigger AS 
$BODY$ 
DECLARE 
BEGIN 
if NEW.usr is not null then 
    return NEW; -- making actual insert 
end if; 
if NEW.sender <> '-1' then 
    insert into messages (message, usr, sender, receiver) 
    values 
    (NEW.message, NEW.sender, NEW.sender, NEW.receiver), 
    (NEW.message, NEW.receiver, NEW.sender, NEW.receiver); 
else 
    insert into messages (message, usr, sender, receiver) 
    select NEW.message, name, NEW.sender, name 
    from users; 
end if; 
return null; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

=> sql fiddle demo

+0

Это сделает рекурсию) Более того - если я хочу добавить 100 строк?) – GeraldIstar

+0

Обновление решения для 100 строк :) нужно проверить о рекурсии –

+0

Количество строк динамически изменяется) – GeraldIstar

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