MS SQL 2016 - trigger modyfikowanie wartości kolumny po aktualizacji wiersza

0

Witam,
Chcę stworzyć trigger, który w momencie edytowania wartości w kolumnie OPIS_NAPRAWY zmieni wartość w danym wierszu w kolumnie SERWISANT na =CURRENT_USER.

Poniżej przesyłam wstępnie napisany kod, który niestety nie działa prawidłowo.
Proszę o pomoc.

use SERWIS
go
CREATE  TRIGGER serwisant_trigger
 ON naprawa
 AFTER update
 as
 if UPDATE (OPIS_NAPRAWY)
--referencing new as new old as old for each row

declare
@IDNAPRAWA int,
@OPIS_NAPRAWY_OLD char (40),
@OPIS_NAPRAWY_NEW char (40)

  -- sekcja declare
IF UPDATE (OPIS_NAPRAWY)
begin
	SELECT 
		@IDNAPRAWA = IDNAPRAWA,
		@OPIS_NAPRAWY_OLD=OPIS_NAPRAWY
		FROM DELETED
	SELECT @OPIS_NAPRAWY_NEW=OPIS_NAPRAWY
		FROM INSERTED


  if @OPIS_NAPRAWY_OLD != @OPIS_NAPRAWY_NEW  
      -- ZMIANA SERWISANTA
	  UPDATE NAPRAWA
		SET SERWISANT=CURRENT_USER
			WHERE IDNAPRAWA = @IDNAPRAWA

  end 
0
  1. nie obsługujesz NULLa przy podstawianiu wartości z DELETED i INSERTED
  2. nie możesz robić UPDATE na tabeli aktualinie modyfikowanej - popadłbyś w bezsensowne zapętlenie, bo dla tego UPDATE tez by się Trigger wykonywał...
  3. zamiast UPDATE podstaw nową wartość pod INSERTED.SERWISANT
    chyba ci to nie zadziała na AFTER, więc zmien triggera na BEFORE i powinno pójść...
1

@Marcin.Miga: nie można modyfikować tabeli inserted/deleted https://docs.microsoft.com/en-us/sql/relational-databases/triggers/use-the-inserted-and-deleted-tables
w sql server

Co do samego tematu to Twój trigger nie uwzględnia updateó na kilku rekordach jednocześnie, aby sprawdzić czy wartość się zmieniła musisz wykorzystać tabelę deleted i inserted, warto też dodać sprawdzenie czy w ogóle modyfikujesz interesujące cię pole:

CREATE  TRIGGER serwisant_trigger
    ON naprawa
    AFTER UPDATE
AS
BEGIN
    --NIE POKAZUJ ILOŚCI MODYFIKOWANYCH WIERSZY
    SET NOCOUNT ON
    IF UPDATE (OPIS_NAPRAWY)
    BEGIN
        -- ZMIANA SERWISANTA
        UPDATE
            NAPRAWA
        SET 
            SERWISANT=CURRENT_USER
        FROM
            NAPRAWA N
            INNER JOIN INSERTED I ON I.IDNAPRAWA=N.IDNAPRAWA
            INNER JOIN DELETED D ON D.IDNAPRAWA=N.IDNAPRAWA
        WHERE
            D.OPIS_NAPRAWY <> I.OPIS_NAPRAWY 
    END
END 

1 użytkowników online, w tym zalogowanych: 0, gości: 1