[MySql] Wyzwalacz

0

Witam Państwa, mam za zadanie zrobić:
Napisać trigger zmieniający status kasety w zależności od tego czy jest
wypożyczenie czy zwrot do wypożyczalni kasety
Status -> tabela Kasety
DataZwrotu or DataWypozyczenia -> tabela Wypo

Mój skrypt wygląda tak:
CREATE TRIGGER wyzw ON Kasety
FOR INSERT
AS
DECLARE @status char(30),
@dataw smalldatetime,
@dataz smalldatetime

SELECT @status = STATUS

FROM KASETY as K join WYPO as w on w.IDKASETY=K.IDkasety
where STATUS in ('W' or 'K')
set @dataz= GETDATE()
BEGIN
END

Nie mam bladego pojęcia jak to poprawnie przerobić. Proszę o pomoc.

1

Zastanów się. Robisz wyzwalacz na ON INSERT do tabeli Kasety. Czy ktoś może wypożyczyć kasetę, której JESZCZE NIE MASZ, bo dopiero ją wstawiasz...
Wyzwalacz powinieneś mieć na inną tabelę i inną akcję (konkretnie dwie akcje)..

0

rozwijąjąc post @Marcin.Miga
potrzebujesz trigger na tabeli, nazwijmy ją "wypozyczenia", wywoływany przy insert, update i być może delete

0
grzegorz_so napisał(a):

rozwijąjąc post @Marcin.Miga
potrzebujesz trigger na tabeli, nazwijmy ją "wypozyczenia", wywoływany przy insert, update i być może delete

Okej rozumiem. Pozniej deklaruje te 3 slowniki co w pierwszym poście . Select robię pod Status jak wyżej, tylko nie mam bladego pojęcia jak dać warunek:
if DataW=null to statusfilmu='Wolny'
if DataW=2017-11-01 and DataZ=null to statusfilmu='Zajety'

0

Wyzwalacz powinienes miec na tabele Wypozyczenia i na dwie akcje: INSERT i UPDATE (DELETE raczej nie powinno sie przydarzyc).
Przy akcji INSERT i UPDATE masz obiekt NEW, ktory zawiera nowe wartosci dla rekordu, a przy UPDATE masz dodatkowo OLD, ktory zawiera stare wartosci.
I teraz musisz zrobic cos takiego:

UPDATE kasety SET statusfilmu=case when NEW.DataW IS NOT NULL AND NEW.DataZ IS NULL then 'Zajety' Else 'Wolny' end WHERE IDKasety=NEW.IDKasety
0

Zapomniałem dodać... Do tego nie potrzebujesz triggera. Nie potrzebujesz nawet pola Status. Wystarczy "ładne" view :)

0

create trigger Zmiana
on Wypo
after update,insert
as
DECLARE @status char(1),
@dataw smalldatetime,
@dataz smalldatetime
UPDATE kasety SET status=CASE WHEN New.DataW IS NOT NULL AND New.DataZ IS NULL THEN 'Z' ELSE 'W' END WHERE IDKasety=NEW.IDKasety

Spisałem coś takiego, wywala oczywiście, nie kumam czaczy.

0

wywala, bo jeśli tak wygląda cały trigger to masz błąd w składni

0

Z deklaracją New.DataZ, New.DataW, New.IdKasety dzieje się to samo. Nie wiem czego brakuje.

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