0

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に相当するものが見つからず、その部分の実行方法がわかりません。

4

1 に答える 1

0

カーソルを使用する必要があるようです。次のようなことを試すことができます。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)
于 2013-01-08T05:06:21.410 に答える