trigger_aktualizujący tabele

0

Witam, moja baza danych, ma aktualizować stan produktów znajdujących się w magazynie po każdej przesyłce przychodzącej, napisałem takiego trigger'a po insercie, ale chyba coś naknociłem za wszelkie wskazówki będę wdzięczny

create trigger dbo.produkt on dbo.przychodzace after insert as
declare @ilosc_przyjazd int, @rodzaj_przyjazd int
select @ilosc_przyjazd=inserted.ilosc from inserted
select @rodzaj_przyjazd=inserted.id_produktu from inserted
update dbo.produkt set ilość=ilość + @ilosc_przyjazd where @rodzaj_przyjazd=ilość

chce żeby po insercie następował update w magazynie

Pozdrawiam,

0

Całkowicie skopane. Ani nie wiadomo, jaki SZBD, anie gdzie jest nazwa tabeli, a gdzie triggera (nazywają się tak samo??)...
Poza tym nie możesz zrobić SELECT @ilosc_przyjazd= ilosc FROM inserted, bo inserted może mieć wiele rekordów...

0

create trigger dbo.aktualizacja on dbo.przychodzace after insert as
declare @ilosc_przyjazd int, @rodzaj_przyjazd int
select @ilosc_przyjazd=inserted.ilosc from inserted
select @rodzaj_przyjazd=inserted.id_produktu from inserted
update dbo.produkt set ilość=ilość + @ilosc_przyjazd where @rodzaj_przyjazd=ilość

chodzi mi o ostatni dodany rekord czyli do tabeli dbo.przychadzace
wklepujemy instert into dbo.przychodzace values (1, 12, 150 ) gdzie 15 to ilość produktu, a 1 to jego identyfikator, dlatego wybrałem after, gdyż chce, żeby ten update był wykonywany po dołączeniu rekordu, sry rzeczywiście źle napisał nazwa triggera to dbo.aktualizacji, a tabela w której są wpisywane inserty to dbo.przychodzące, zaś tabela na której updatcie mi zależy to dbo.produkt

napisane to zostało w microsoft sql server 2008

0
CREATE TRIGGER aktualizacja ON przychodzace AFTER INSERT
 AS
  UPDATE produkt SET stan=stan+i.ilosc  FROM produkt p join inserted i  on i.id_produktu=p.id
 
0

Czyli nie trzeba deklarować żadnych zmiennych poprzez declare i bawić się w selecty?

0

Dzięki bardzo, musiałem się z tym przespać :D, analogicznie zrobiłem dla przesyłek wychodzących z magazynu

CREATE TRIGGER aktualizacjaa ON wysylka BEFORE INSERT
AS
declare @ilość int, @ilosc int
select @ilość=ilość from produkt
select @ilosc=ilosc FROM produkt p JOIN inserted w
ON w.id_produktu=p.id_produktu
if @ilość>@ilosc
begin
UPDATE produkt SET ilość=ilość-w.ilosc FROM produkt p JOIN inserted w
ON w.id_produktu=p.id_produktu
end
else
print 'za mało produktu'

Tu chyba nie dało rady zrobić bez deklarowania zmiennych bo mamy funkcje if

teraz wydaje mi się że powinno być to before, bo jeśli wrzucimy np ilość która niebędzie dostępna w naszym magazynie to i tak w wysyłkach pojawi się dany rekord, a tak jeśli sprawdza przed dodaniem to można dodać do else exit, albo jakiś inny blocker, który nie doda rekordu

0

W innych przykładach widziałem print danego tekstu,

CREATE TRIGGER aktualizacjaa ON wysylka AFTER INSERT
AS
declare @ilość int, @ilosc int
select @ilość=ilość from produkt
select @ilosc=ilosc FROM produkt p JOIN inserted w
ON w.id_produktu=p.id_produktu
if @ilość>@ilosc
begin
UPDATE produkt SET ilość=ilość-w.ilosc FROM produkt p JOIN inserted w
ON w.id_produktu=p.id_produktu
end
else
begin
PRINT 'za mało produktu'
rollback
end

mogę wprowadzić rollback? wycofuje transakcje

0

ale u mnie to niestety nie działa

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