Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Trigger Oparty Na Warunkach
ins@ne
post 30.08.2004, 11:31:16
Post #1





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 10.07.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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...

Ten post edytował ins@ne 30.08.2004, 11:35:06


--------------------
"Jedyną pewną metodą unikania porażek jest nie mieć żadnych, nowych pomysłów."
Albert Einstein
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
zalew
post 30.08.2004, 13:55:39
Post #2





Grupa: Zarejestrowani
Postów: 407
Pomógł: 0
Dołączył: 24.10.2002
Skąd: warszawa

Ostrzeżenie: (0%)
-----


dajesz jeden trigger na update, drugi na insert. wszystko.


--------------------
Go to the top of the page
+Quote Post
ins@ne
post 30.08.2004, 14:01:13
Post #3





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 10.07.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


No takie rozwiazanie tez wchodzilo w gre - chcialem po prostu wiedziec czy da sie to zrobic w jednym triggerze...


--------------------
"Jedyną pewną metodą unikania porażek jest nie mieć żadnych, nowych pomysłów."
Albert Einstein
Go to the top of the page
+Quote Post
zalew
post 1.09.2004, 03:05:45
Post #4





Grupa: Zarejestrowani
Postów: 407
Pomógł: 0
Dołączył: 24.10.2002
Skąd: warszawa

Ostrzeżenie: (0%)
-----


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

Ten post edytował zalew 1.09.2004, 03:09:06


--------------------
Go to the top of the page
+Quote Post
ins@ne
post 1.09.2004, 09:44:26
Post #5





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 10.07.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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


--------------------
"Jedyną pewną metodą unikania porażek jest nie mieć żadnych, nowych pomysłów."
Albert Einstein
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 03:52