我创建这些表: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));
我试图适应从代码:
到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
可能会有所帮助,如果指的是特定的列。 但是,如果我想引用特定表中的所有列,那该怎么办?
谢谢!
你不需要在Postgres中 - 至少在使用行级触发器时(你这样做,因为你有'每行'')。只需使用触发器中的'new'和'old'记录即可:http://www.postgresql.org/docs/current/static/plpgsql-trigger.html – 2015-02-24 07:00:06
您可以帮我提供更多信息@a_horse_with_no_name吗?我已经使用'new','old',但我不知道如何在Postgres中实现它们以引用表 – 2015-02-24 07:06:10
中的所有列就像任何列引用。 'new.column_name'。请阅读说明书,其中包含很多示例。请记住,你总是处理完全**一排行触发 – 2015-02-24 07:08:00