[MSSQL] TRIGGER

0

Witam, mam problem z napisaniem triggera w T-SQL. Po wprowadzeniu publikacji do tabeli Publikacje (idpublikacja, tytul, data, idosoba) trigger ma zliczac publikacje i aktualizowac ich ilosc dla danego autora w tabeli osoba (idosoba, imie, nazwisko, liczbapublikacji). Moj obecny trigger aktualizuje wartosci dla wszystkich osob i nie wiem jak to poprawnie wyspecyfikowac .

CREATE TRIGGER LPLP
ON PUBLIKACJE
FOR INSERT, UPDATE, DELETE 
AS
DECLARE @ILE INT
SELECT @ILE = COUNT (*) FROM PUBLIKACJE GROUP BY IDOSOBA
UPDATE OSOBA SET LP = @ILE
2
alter TRIGGER LPLP
ON PUBLIKACJE
FOR INSERT, UPDATE, DELETE
AS
UPDATE 
    osoba
set
    lp = i.lp
from
    osoba
    inner join (select
                     idosoba
                     ,count(*) lp
                form
                    publikacje
                where
                    idosoba in (select idosoba from inserted union all select idosoba from deleted)
                group by
                    osoba) i on i.idosoba=osoba.idosoba
0

Niestety kod nie działa mi, pomimo poprawienia literówek. Dodam,że zakładamy ,iż dopisywany będzie zawsze jeden rekord do tabeli publikacje.

0

Nigdy nie zakladaj, że będzie dodawany jeden rekord.

Czy to zapytanie bez where też nie działa?

0

Jest to uproszczenie na potrzeby zadania :) Niestety dalej nie działa.

0

To może precyzyjniej co nie działa? nic nie aktualizuje?

0

W ogóle nie tworzy/aktualizuje się trigger, najprawdopodobniej coś ze składnią inner join.

0

Ale jak puścisz poza triggerem:

UPDATE 
    osoba
set
    lp = i.lp
from
    osoba
    inner join (select
                     idosoba
                     ,count(*) lp
                form
                    publikacje
                group by
                    osoba) i on i.idosoba=osoba.idosoba

to zmienia czy nie?

0

Msg 156, Level 15, State 1, Line 13
Incorrect syntax near the keyword 'on'.

0

zmien form na from

0

było zmienione w momencie próby

0

podaj ddl-e

0

jeszcze ist błąd w group by, poprawnie całość:

UPDATE 
    osoba
set
    lp = i.lp
from
    osoba
    inner join (select
                     idosoba
                     ,count(*) lp
                from
                    publikacje
                group by
                    idosoba) i on i.idosoba=osoba.idosoba
0

W tej wersji wszystko działa poprawnie. Bardzo dziękuje za pomoc.

CREATE TRIGGER LPLP
ON PUBLIKACJE
FOR INSERT, UPDATE, DELETE
AS
UPDATE 
    osoba
set
    lp = i.lp
from
    osoba
    inner join (select
                     idosoba
                     ,count(*) lp
                from
                    publikacje
                group by
                    idosoba) i on i.idosoba=osoba.idosoba
0

Tylko, że to robi update całej tabel a nie tylko zmienianych rekordów...

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