2015-02-24 101 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