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!
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 |