[英]SQL Server INSERTED table to 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));
我正在嘗試調整代碼:
到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
這個詞New
提到特定專欄時可以提供幫助。 但是如果我想引用特定表中的所有列呢?
謝謝!
我想說的是這樣的話:
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已經很久了 - 也許我是誤解了原始觸發器中的某些內容)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.