Re: [TRIGGER] Returning values from BEFORE UPDATE trigger, without using them

Поиск
Список
Период
Сортировка
От Torsten Zühlsdorff
Тема Re: [TRIGGER] Returning values from BEFORE UPDATE trigger, without using them
Дата
Msg-id 4C4D3C23.2090804@meisterderspiele.de
обсуждение исходный текст
Ответ на [TRIGGER] Returning values from BEFORE UPDATE trigger, without using them  (Torsten Zühlsdorff <foo@meisterderspiele.de>)
Список pgsql-sql
Hey Dmitriy,

thanks for your reply.

> I think, its would be better to use rule on update instead of the trigger
> in such case as you.

I've played the whole weekend with the rule-system, but it didn't work 
for my case. I have a dynamic trigger, which takes cares about revision 
of rows for every table, it is called from. It looks like that:

CREATE OR REPLACE FUNCTION versionizeContent()
RETURNS TRIGGER
AS $$
BEGIN
  /* add new version in central register and insert new row */  NEW.revision := addContentRevision (OLD.content_id,
OLD.revision,
 
sessval('user_id')::int));
  EXECUTE 'INSERT INTO ' || quote_ident(TG_TABLE_NAME) ||          ' SELECT (' || QUOTE_LITERAL(NEW) || '::' || 
quote_ident(TG_TABLE_NAME) ||').*' ;
  RETURN NULL;

END;
$$ LANGUAGE 'plpgsql' VOLATILE;

Even if i drop the dynamic INSERT-Part and write it for every relation, 
i wasn't able to figured out how to manipulate the NEW-Record.

The best i tried so far was:
CREATE RULE "versionize"
AS ON UPDATE
TO templates
DO INSTEAD
(  SELECT addContentRevision (OLD.content_id, OLD.revision, 
sessval('user_id')::int) INTO NEW.revision;  INSERT INTO templates SELECT NEW.* RETURNING *;
);

But an Updates ends with the ERROR:
"ERROR:  schema "*NEW*" does not exist"

Has anyone a hint how to manipulate the NEW record within an RULE?

Thanks,
Torsten



В списке pgsql-sql по дате отправления:

Предыдущее
От: Joshua Tolley
Дата:
Сообщение: Re: howto delete using a join ?
Следующее
От: Enrique Palacios
Дата:
Сообщение: Returning only alphanumeric values from a query