SQL 服务器已插入 table 到 PostgreSQL
SQL Server INSERTED table to PostgreSQL
我创建了这些 table:
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 服务器:
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
这两个词在引用特定列时可能会有所帮助。
但是,如果我想引用特定 table 中的所有列怎么办?
谢谢!
我会这样说:
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 服务器没有),您将始终只处理一行,因此无需使用 group by
(尽管它是我使用 SQL 服务器已经很久了 - 也许我误解了原始触发器中的某些内容。
我创建了这些 table:
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 服务器:
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
这两个词在引用特定列时可能会有所帮助。
但是,如果我想引用特定 table 中的所有列怎么办?
谢谢!
我会这样说:
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 服务器没有),您将始终只处理一行,因此无需使用 group by
(尽管它是我使用 SQL 服务器已经很久了 - 也许我误解了原始触发器中的某些内容。