locked
triggerből a 'last updated row identity' megállapítása RRS feed

  • Question

  • Nos lehet túl naívnak tűnik a kérdés, de minekután életem elő triggerét írom remélem ez megbocsájtható.
    Szóval a tény:

    Van egy tábla benne 'id' mező (autoinc) meg van benne egy 'backdate' dátum mező. Szeretném ha dátum változtatás után végrehajtódna egy trigger, ami aztán meghív egy tároltat egy bemenő paraméterrel. NA EZ a paraméter lenne az aktuálisan UPDATE-elt sor id je.


    valami hasonló:

    ALTER TRIGGER ArchivableCheck ON tickets

    AFTER UPDATE

    AS
    BEGIN
       
        IF UPDATE(ticketWorkSheetBackDate)
        BEGIN
              EXEC MoveTicket @ticketID =   @@IDENTITY
        END

    END
    GO

    NAh a @@identity helyett kellene valami ami visszadja nekem a legutoljára updatelt sor id-jét  (csak szép magyarossssssssssssssssan Krisztián Big Smile )
    • Moved by Othorvath Saturday, January 16, 2010 2:44 PM (From:Altalanos SQL kerdesek)
    Thursday, January 24, 2008 11:56 AM

All replies

  •  

    set @id=scope_idenity() ,

     

    de nem biztos, hogy egy sort updatelnek, ugyhogy, helyette az inserted pseudo táblát ajánlom, vagy le kell kezelni a következőképpen:

     

    DECLARE @Cnt int

    SET @Cnt=@@RowCount

    IF @Cnt = 0 RETURN

    IF @Cnt > 1 GOTO errorhandler

     

    errorhandler:

    --itt lekezeljük, pl raiserror

     

    Az if UPDATE() csak azt mondja meg, hogy lett-e updatelve a mező, de ha ugyanazt rakod bele, akkor is azt fogja mondani, hogy volt update, úgyhogy ezért is az inserted táblát ajánlom.

     

    Egy sor esetén:

    declare @id

    SELECT @id=id

    FROM dbo.deleted as d

    JOIN inserted as i on d.id=i.id

    where d.ticketWorkSheetBackDate <> i.ticketWorkSheetBackDate

     

    if @id is not null

    exec procedure

     

    Ja és ha előzőleg lehetett null a mező, akkor is le kell kezelni

    akár így is lehet:

     

    where d.ticketWorkSheetBackDate <> i.ticketWorkSheetBackDate or (d.ticketWorkSheetBackDate is null and i.ticketWorkSheetBackDate is not null)

     

    Friday, January 25, 2008 7:54 AM
    Moderator
  • Amit Sáfár István írt jó, de csak egy sorra működik. A teljes trigger valahogy így kellene, hogy kinézzen:

    CREATE TRIGGER ArchivableCheck ON Tickets
    AFTER UPDATE
    AS 
    BEGIN
    DECLARE @ID int
    DECLARE C CURSOR FAST_FORWARD FOR
    SELECT I.ID FROM DELETED D INNER JOIN INSERTED I 
    	ON D.ID=I.ID
    WHERE 
    (D.TicketWorkSheetBackDate <> I.TicketWorkSheetBackDate)
    OR
    (D.TicketWorkSheetBackDate IS NULL AND I.TicketWorkSheetBackDate IS NOT NULL)
    
    OPEN C
    FETCH NEXT FROM C INTO @ID
    WHILE (@@FETCH_STATUS = 0)
    	BEGIN
    	EXEC MoveTicket @TicketID = @ID
    	FETCH NEXT FROM C INTO @ID
    	END
    
    CLOSE C
    DEALLOCATE C
    
    END

    m@te
    Thursday, May 28, 2009 9:18 AM