SQL Server INSERTED表到PostgreSQL

时间:2015-02-24 06:57:32

标签: postgresql function triggers

我创建了这些表:

CREATE TABLE public.articulos 
( id integer PRIMARY KEY,
nombre varchar(100),
stock decimal(18,2));

CREATE TABLE public.movimientos
( transaccion integer,
fecha date DEFAULT current_date,
articulo_id integer, 
cantidad decimal(10,2),
tipo char(1) CHECK (tipo='E' OR tipo='S'),
FOREIGN KEY (articulo_id) REFERENCES public.articulos(id));

我正在尝试调整以下代码: SQL Server Trigger

To PostgreSQL:

CREATE FUNCTION inserta() RETURNS trigger AS $actualiza$
    BEGIN
        -- Actualizamos la fecha
        UPDATE public.articulos 
        SET stock=stock + T.parcial
        FROM public.articulos A
        INNER JOIN
        (SELECT articulo_id,
         SUM(CASE WHEN tipo='E' 
             THEN cantidad
             ELSE -cantidad 
         END)
    AS parcial FROM movimientos
    GROUP BY articulo_id
    )
    T ON A.id=T.articulo_id;
    RETURN NULL;
    END;
$actualiza$ LANGUAGE plpgsql;

CREATE TRIGGER movimientosinsert
AFTER INSERT
ON public.movimientos
FOR EACH ROW
EXECUTE PROCEDURE inserta();

我仍然没有得到的是SQL Server中的这两行:

AS parcial FROM INSERTED
SET stock=stock + T.parcial

这样当我运行类似的东西时:

INSERT INTO public.movimientos (transaccion,articulo_id,fecha,cantidad,tipo)
VALUES (1,1,current_date,100,'E'),
(2,2,current_date,25,'S');

触发器调用该函数,函数完成其工作。

任何帮助都要非常感谢,因为我已经找到了解决方案,但我刚刚发现了New&如果引用特定列,Old会有所帮助。 但是,如果我想引用特定表中的所有列呢?

谢谢!

1 个答案:

答案 0 :(得分:0)

我会这样说:

CREATE FUNCTION inserta() RETURNS trigger AS $actualiza$
BEGIN
  -- Actualizamos la fecha
  UPDATE public.articulos 
    SET stock = stock + case 
                          when new.tipo = 'E' then new.cantidad  
                          else -new.cantidad 
                        end
  where articulos.articulo_id = new.articulo_id;

  RETURN null;
END;
$actualiza$ LANGUAGE plpgsql;

当您使用行级触发器(SQL Server没有)时,您将始终只处理一行,因此不需要使用group by(尽管我使用SQL已经很久了服务器 - 也许我误解了原始触发器中的某些内容。