Re: Quien es INSERTED/DELETED en POSTGRESQL..????? -->>NEW/OLD..???

From: Alvaro Herrera <alvherre(at)surnet(dot)cl>
To: Mario Cassanelli <mcassan(at)speedy(dot)com(dot)ar>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Quien es INSERTED/DELETED en POSTGRESQL..????? -->>NEW/OLD..???
Date: 2005-05-19 13:18:46
Message-ID: 20050519131846.GC7156@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On Thu, May 19, 2005 at 09:27:05AM -0300, Mario Cassanelli wrote:
> En SQLSERVER, en los triggers puedo usar INSERTED, en POSTGRESQL es NEW
> ahora si tengo que hacer un
>
> UPDATE E
> SET NIVEL=1
> FROM EMPLEADOS E INNER JOIN INSERTED I
> ON I.EMPID=E.EMPID
> LEFT OUTER JOIN EMPLEADOS AS M
> ON E.MGRID=M.EMPID

Ojo, que los triggers son conceptualmente diferentes en un aspecto: En
SQL Server, el trigger se dispara una vez para toda la ejecucion de la
sentencia (FOR EACH STATEMENT); por lo tanto INSERTED o DELETED son una
pseudo-tabla con todos los datos que fueron alterados en la sentencia.

En Postgres para hacer estas cosas necesitas usar triggers FOR EACH ROW,
es decir, que se disparan una vez para la modificacion de cada tupla.
Aca, NEW y OLD es _la_ tupla que estas modificando en ese momento, por
lo tanto no haces JOIN contra eso sino lo usas como si fuera un registro
que puedes modificar a mano, algo como

BEGIN
IF NEW.mgrid IS NULL THEN
NEW.lvl := 0
ELSE
NEW.lvl := NEW.lvl + 1
END IF;
END;

o una cosa por el estilo. Al insertar, NEW es el registro que estas
insertando, y OLD no esta definido. Al actualizar, NEW es el registro
despues de modificacion, y OLD es el registro anterior. Al eliminar,
NEW no esta definido y OLD es el registro que estas eliminando.

Otra cosa es que las constantes que son strings se rodean con ', no con
". Pero como el cuerpo de la funcion es un string rodeado con ', tienes
que poner los ' que aparezcan dentro duplicados, o sea

WHEN foo IS NULL THEN ''.''

Al retornar, el trigger debe retornar NEW, el cual sera usado como el
verdadero registro que se insertara. Para esto el trigger debe ser
BEFORE <accion>.

Nota, en Postgres tambien existen triggers FOR EACH STATEMENT pero esos
no reciben NEW, OLD, ni INSERTED ni nada.

HTH,

--
Alvaro Herrera (<alvherre[a]surnet.cl>)
Hi! I'm a .signature virus!
cp me into your .signature file to help me spread!

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Mario Cassanelli 2005-05-19 13:55:29 Re: Quien es INSERTED/DELETED en POSTGRESQL..?????-->>NEW/OLD..???
Previous Message Sergio Vizcaino 2005-05-19 13:12:10 RV: Recalculo