2013-01-08 24 views
0

我必須移植一個PostgreSQL觸發器,但由於我沒有太多經驗,所以我不知道如何更改某些部分。原觸發是:將PostgreSQL觸發器移植到SQL Server 2008中

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的,我不知道該怎麼做的那部分。

+0

'detalletemplate'的更新如何與調用觸發器的更新相關聯? 「模板」或「vueloaerolinea」與定義觸發器的表相關的方式如何?我的意思是,你似乎沒有在觸發器的主體中引用'public.aerolinea'。我有點想到你的PostgreSQL觸發器的作用,只是試圖找出與觸發器的所有者表的關係。 –

回答

0

看起來您需要使用cursor。你可以嘗試這樣的事情 - 它不是完整的,因爲我不知道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) 
+0

我完全理解你做了什麼,但有一個問題。在detalletemplate和Inserted表之間沒有關係,它們有不同類型的主鍵,並且末尾的部分 'JOIN插入ON detalletemplate.Key = Inserted.Key' 不起作用。 –

+0

我更新了代碼。如果您有任何問題,請告訴我。祝你好運。 – sgeddes

+0

謝謝!它工作完美。只有一個問題,我聽說SQL SERVER上沒有'FOR EACH ROW',但是當多行更新時你的代碼似乎工作,這有什麼用? –