[英]Porting PostgreSQL trigger to SQL Server 2008
我必须移植PostgreSQL触发器,但是由于我对此没有太多经验,所以我不知道如何更改某些部分。 原始触发器是:
CREATE TRIGGER aerolinea_tr
AFTER UPDATE
ON public.aerolinea FOR EACH ROW
EXECUTE PROCEDURE public."actualizaWarehoseTemplate"();
DECLARE
mviews RECORD;
BEGIN
IF (TG_OP = 'UPDATE') THEN
FOR mviews IN SELECT DISTINCT template.idtemplate
FROM template
INNER JOIN vueloaerolinea ON (template.idvueloaerolinea = vueloaerolinea.idvueloaerolinea)
WHERE vueloaerolinea.codigolinea = old.codigolinea
LOOP
UPDATE detalletemplate SET idwarehose = new.idwarehouse WHERE detalletemplate.idtemplate = mviews.idtemplate;
END LOOP;
END IF;
RETURN old;
END;
我所做的是:
CREATE TRIGGER aerolinea_tr
ON aerolinea
AFTER UPDATE
AS
BEGIN
-- if no row affected, the trigger ends.
IF @@ROWCOUNT = 0
BEGIN
RETURN;
END;
IF EXISTS(SELECT * FROM inserted)
BEGIN
IF EXISTS(SELECT * FROM deleted)
BEGIN
--Update code goes here.
END
END
END;
但是我找不到SQL Server的RECORD的等效项,也不知道该怎么做。
看来您需要使用游标 。 您可以尝试这样的操作-它不完整,因为我不知道aerolinea表的表模式,但是尽管如此,它应该使您朝正确的方向前进:
DECLARE @idtemplate INT //Assuming this is an int
DECLARE @mviews CURSOR
DECLARE @newidwarehouse INT
SELECT @newidwarehouse = idwarehouse FROM INSERTED
SET @mviews = CURSOR FOR
SELECT DISTINCT template.idtemplate
FROM template
INNER JOIN vueloaerolinea ON (template.idvueloaerolinea = vueloaerolinea.idvueloaerolinea)
INNER JOIN DELETED ON DELETED.codigolinea = vueloaerolinea.codigolinea
OPEN @mviews
FETCH NEXT
FROM @mviews INTO @idtemplate
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE detalletemplate
SET idwarehose = @newidwarehouse
WHERE detalletemplate.idtemplate = @idtemplate
FETCH NEXT
FROM @mviews INTO @idtemplate
END
CLOSE @mviews
DEALLOCATE @mviews
顺便说一句,您无需在检查更新时检查插入和删除。 您可以只检查已删除:
IF EXISTS (SELECT * FROM DELETED)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.