2015-02-24 134 views
0

我创建这些表:SQL插入服务器表到PostgreSQL

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

到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(); 

我还是不要't get是如何从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可能会有所帮助,如果指的是特定的列。 但是,如果我想引用特定表中的所有列,那该怎么办?

谢谢!

+0

你不需要在Postgres中 - 至少在使用行级触发器时(你这样做,因为你有'每行'')。只需使用触发器中的'new'和'old'记录即可:http://www.postgresql.org/docs/current/static/plpgsql-trigger.html – 2015-02-24 07:00:06

+0

您可以帮我提供更多信息@a_horse_with_no_name吗?我已经使用'new','old',但我不知道如何在Postgres中实现它们以引用表 – 2015-02-24 07:06:10

+0

中的所有列就像任何列引用。 'new.column_name'。请阅读说明书,其中包含很多示例。请记住,你总是处理完全**一排行触发 – 2015-02-24 07:08:00

回答

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 Server的时间已经过去 - 可能我误解了原始触发器中的某些内容)。

+0

感谢您的快速和描述性的答案! – 2015-02-24 07:41:33