Cześć, tworzę przykładową bazę danych dla szkoły językowej, mam dwie tabele 'kursy' oraz 'zajęcia', w tabeli kursy są podstawowe informacje o kursie tzn. język, poziom, id kursu itd., natomiast w tabeli zajęcia zapisuje poszczególne dni i godziny zajęć w ramach poszczególnych kursów z tabeli 'kursy', kurs jest tutaj identyfikowany na podstawie id kursu jako klucza obcego z tabeli 'kursy'
, na tabeli zajęcia działa trigger który w momencie dodawania wpisów do 'zajecia' sprawdza np czy zajęcia nie nachodzą na siebie, lub czy lektorzy nie prowadzą w tym samym czasie różnych zajęć, gdy któryś z tych warunków jest nie spełniony funkcja wyzwalana przez trigger zwraca NULL i teraz do sedna problemu, najpierw dodaje kurs do tabeli 'kursy' a potem zajecia do tabeli 'zajecia' może się jednak okazać że zajęcia nie zostaną dodane z wyżej wymienionych powodów więc w tym momencie również dodanie kursu musi zostać cofnięte i tak trigger działa na pewno porawnie a kod zapytania z transakcją wygląda następująco :
BEGIN ;
INSERT INTO kursy(jezyk_id, poziom_id, liczba_miejsc, wolne_miejsca, cena, data_start, data_koniec)
VALUES(1, 1, 10, 10,1000,'2011-06-08', '2011-06-25');
INSERT INTO zajecia(kurs_id, lektor_id, dzien_id, godzina_start, godzina_koniec) VALUES(5, 1, 1,'07:00:00', '08:00:00') ;
COMMIT;
Dane zostały tak dobrane aby trigger zwrócił NULL ,problem w tym że transakcja kończy się COMMITem, a efektem tego jest dodanie wpisy do 'kursy' przy równoczesnym nie dodaniu 'zajec' gdyż uniemożliwia to funkcja wywołana przez trigger. Proszę o wszelkie sugestie, może nie dokońca rozumie działanie transakcji ?