Triggery

0

Witajcie
Dostałem ostatnio takie zadanie żeby stworzyć bazę danych która pomagałaby w zarządzaniu laboratoriami komputerowymi. Jedną z funkcji jaką musi posiadać ta baza jest sprawdzanie braku konfliktów między zajęciami. Zabrałem się już za to i napisałem trigger który nie działa:( , modyfikowałem go na wszystkie przychodzące mi do głowy sposoby i żadnych pozytywnych rezultatów. Ogólnie sprawa wygląda tak że po kliknięciu Execute trigger powstaje i coś nawet robi tylko, że przez to coś już nie da się dopisać żadnej rezerwacji (sali), a powinno być tak, że nie da się dopisać tylko tych rezerwacji które się czasem i miejscem pokrywają z poprzednimi. Dodam jeszcze, że za czas odpowiadają kolumny Godz_rozp i Godz_zak, a z miejsce kolumna Sala, które to znajdują się w tabeli Rezerwacje.

Jestem bardzo niedoświadczony w SQL i pewnie stąd wszystkie problemy. Zamieszczę tu poniżej kod tego triggera i proszę was o pomoc może uda wam się odkryć na czym polega z nim problem.

Create trigger [dbo].[CzyRezerwacjaJestOk]
on [dbo].[Rezerwacje]
after insert
as
Declare @NewTime time(7), @NewEndTime time(7), @Newday varchar(50), @NewSala int
select @NewTime=inserted.Godz_rozp from inserted
select @NewEndTime=inserted.Godz_zak from inserted
select @Newday=inserted.Dzien_tygodnia from inserted
select @NewSala=inserted.Sala_nr from inserted
if @NewSala = (Select Sala_nr from dbo.Rezerwacje)
begin
if @NewTime>=(select Godz_rozp from dbo.Rezerwacje where Dzien_tygodnia = @Newday) and @NewTime<(select Godz_zak from dbo.Rezerwacje where Dzien_tygodnia = @Newday)
begin raiserror ('Termin jest zajęty!',9,1) end;
if @NewEndTime>(select Godz_rozp from dbo.Rezerwacje where Dzien_tygodnia = @Newday) and @NewEndTime<=(select Godz_zak from dbo.Rezerwacje where Dzien_tygodnia = @Newday)
begin raiserror ('Termin jest zajęty!',9,1) end;
end;

0

Ja nie wiem czy dobrze rozumiem Twój problem, ale wydaje mi się, że tego typu zadanie powinno się rozwiązać za pomocą procedury a nie triggera. Bo jeśli używasz triggera, to powinien być on typu INSTEAD OF, a nie AFTER, bo ten ostatni powoduje, że trigger się wykona po zakończeniu (w tym przypadku) INSERT. A procedura sprawdzałaby to wszystko i jeśli wszystko się zgadza, to wtedy wykonywałaby INSERT, a jak nie, to albo komunikat, albo po prostu by nic nie dodała (w zależności od tego jakby została napisana).
Jeśli jednak upierasz się przy triggerze, to raczej musiałby to być INSTEAD OF i wtedy Twój tigger by się wykonał zamiast INSERT, a jeśli zależałoby Ci na dopisaniu czegoś do bazy to należało by na ten czas (w środku triggera) wyłączyć go na chwilę (komenda wygląda mniej więcej tak DISABLE TRIGGER [nazwa]) potem wstawić coś do bazy w normalny sposób i na nowo włączyć trigger (wybierając ENABLE), żeby kolejne próby dodania były prawidłowo obsługiwane.

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