Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Trigger Oparty Na Warunkach
Forum PHP.pl > Forum > Bazy danych
ins@ne
Wprawdzie trigger ma dzialac po Oraclem, ale chodzi mi tu o sama idee SQLa - pod samego Oracla jakos to juz sobie pozniej najwyzej dopasuje (o ile bedzie to konieczne). Mam tabele z opisanymi aplikacjami i druga ze statystykami dla tych aplikacji. Teraz za kazdym razem gdy w tej tabeli z aplikacjami zajdzie insert albo update to odpowiednie zmiany musza byc naniesione na tabele ze statystykami. W takim "pół-sql'u" by to wygladalo mniej wiecej tak:
  1. CREATE TRIGGER moj_trigger
  2. after INSERT ON aplikacje
  3. // tu instrukcje dla pierwszego warunku
  4. INSERT INTO statystyki(app_id, app_name) VALUES (aplikacje.app_id, aplikacje.app_name) OR UPDATE ON aplikacje.app_name
  5. // tu instrukcje dla drugiego warunku
  6. UPDATE statystyki(app_name) VALUES (aplikacje.app_name)

Nie chodzi mi tu juz o same konkretne warunki (bo wiadomo, ze tam musze sprecyzowac, ktory wiersz ma przepisac itd. ale chodzi mi o to czy mozna napisac taki warunek, ze jesli jest to insert to ma wykonac jedno, a jesli update to co innego. Problem polega na tym, ze nie mam dostepu do tej bazy i musze to pisac "na sucho" wiec nie moge sobie testowac sad.gif...
zalew
dajesz jeden trigger na update, drugi na insert. wszystko.
ins@ne
No takie rozwiazanie tez wchodzilo w gre - chcialem po prostu wiedziec czy da sie to zrobic w jednym triggerze...
zalew
owszem, da sie tak jak mowisz

  1. begin IF inserting then
  2. ....
  3. elseif updating then
  4. ...
  5. else
  6. ...
  7. end IF;
  8. end


opisane mam to nawet w ksiazce wlasnie do oracla..
z tym, ze wiesz.. nie wiem jakie masz potrzeby, ale stosuje sie to raczej w wypadku, kiedy sa bardzo drobne roznice, i po prostu jakas wartosc chcesz uzaleznic od tego na jakiej instrukcji zostaje zapisana.. jesli masz zamiar dac kompletnie inne instrukcje to zrob po prostu 2 triggery, bedzie wygodniej
ins@ne
No wiec sprobowalem cos takiego:
  1. CREATE OR REPLACE TRIGGER pr_st_app_atonce
  2. after INSERT OR UPDATE ON pr_am_applications
  3. begin IF inserting then
  4. begin FOR each row
  5. INSERT INTO pr_st_apps(ap_oid, ap_name)
  6. VALUES (:new.ap_oid, :new.ap_name)
  7. end
  8. elseif updating then
  9. begin FOR each row
  10. UPDATE pr_st_apps SET ap_name = :new.ap_name
  11. WHERE pr_st_apps.ap_oid = :new.ap_oid
  12. end
  13. endif
  14. end;

no i przy dodaniu triggera wszystko jest ok, ale jak dodam cos do tabeli pr_am_applications to wywala blad, ze wyzwalacz jest niepoprawny i ponowne sprawdzenie poprawnosci nie udalo sie sad.gif... Gdzie tam jest blad?
Najpierw probowalem bez tych zagniezdzonych begin...end bo myslalem, ze moze to mu przeszkadza, ale nie... potem kombinowalem ze srednikami, ale gdziekolwiek je wsadzilem to byl blad przy dodaniu, a tresc w if...else jest skopiowana ze starych dzialajacych triggerow sad.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.