Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Trigger AFTER INSERT OR UPDATE OR DELETE, Błąd przy tworzeniu triggera
phpion
post 21.06.2008, 10:12:36
Post #1





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Witam ponownie smile.gif
Tym razem mam problem z utworzeniem triggera. Przewertowałem sporą część linków dotyczących tworzenia triggerów ale za Chiny nie mogę sobie poradzić z małą pierdołą. Chciałbym aby trigger był odpalany po wpisaniu, modyfikacji lub usunięciu danych z tabeli. W związku z czym napisałem:
  1. DELIMITER |
  2. CREATE TRIGGER update_category_items_t AFTER INSERT OR UPDATE OR DELETE ON card_category FOR EACH ROW
  3. BEGIN END|
  4. DELIMITER ;

co kończy się błędem:
Cytat
Script line: 21 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OR UPDATE OR DELETE ON card_category FOR EACH ROW
BEGIN

END' at line 1

O co chodzi? Próbowałem również magicznych konstrukcji (gdzieś znalazłem taki przykład) z:
  1. ... AFTER INSERT ON card_category OR UPDATE ON card_category ...

oraz:
  1. ... AFTER INSERT OR AFTER UPDATE OR AFTER DELETE ...

co również nie działa.

Moja wersja MySQL to 5.0.27.

Pozdrawiam,
pion

// EDIT:
Jest jeszcze ciekawsze zjawisko! Na razie chciałem utworzyć 3 osobne triggery, w związku z czym zrobiłem to tak:
  1. DROP TRIGGER update_category_items_tai;
  2. DROP TRIGGER update_category_items_tau; -- linia 19
  3. DROP TRIGGER update_category_items_tad; -- linia 20
  4.  
  5. DELIMITER |
  6. CREATE TRIGGER update_category_items_tai AFTER INSERT ON card_category FOR EACH ROW
  7. BEGIN CALL update_category_items (NEW.category_id);
  8. END|
  9.  
  10. CREATE TRIGGER update_category_items_tau AFTER UPDATE ON card_category FOR EACH ROW -- linia 28
  11. BEGIN CALL update_category_items (OLD.category_id);
  12. CALL update_category_items (NEW.category_id);
  13. END|
  14.  
  15. CREATE TRIGGER update_category_items_tad AFTER DELETE ON card_category FOR EACH ROW -- linia 34
  16. BEGIN CALL update_category_items (OLD.category_id);
  17. END|
  18. DELIMITER ;

Wywołaniem powyższego kodu skutkuje w:
Cytat
Script line: 19 Trigger does not exist
Script line: 20 Trigger does not exist
Script line: 28 Trigger already exists
Script line: 34 Trigger already exists

Nie rozumiem tu czegoś: dlaczego najpierw wypisywane jest, że trigger nie istnieje, a później, że już istnieje? W rezultacie zawsze dodawany jest tylko pierwszy trigger czyli update_category_items_tai.

Co robię źle? worriedsmiley.gif

Ten post edytował phpion 21.06.2008, 10:33:21
Go to the top of the page
+Quote Post
tommy4
post 21.06.2008, 11:22:35
Post #2





Grupa: Zarejestrowani
Postów: 288
Pomógł: 12
Dołączył: 2.12.2005

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


spotkałem się kiedyś z dziwnym też problemem, że w nazwie nie może być za dużo znaków '_'. Spróbuj nazwać triggery inaczej. To jedyne co przychodzi mi do głowy.

Bo z tego co widzę wszystkie 3 triggery:

update_category_items_tai
update_category_items_tau
update_category_items_tad

system widzi jako jeden.

Ten post edytował tommy4 21.06.2008, 11:30:38
Go to the top of the page
+Quote Post
phpion
post 21.06.2008, 17:27:16
Post #3





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Niestety nadal to samo :| Ogólnie to wielka kupa, że nie można dać po prostu AFTER INSERT OR UPDATE OR DELETE *... Może ktoś jeszcze będzie miał jakieś pomysły?

Cytat
Bo z tego co widzę wszystkie 3 triggery:

update_category_items_tai
update_category_items_tau
update_category_items_tad

system widzi jako jeden.

Dałem nazwy t1, r2, e3 i to samo...

* za http://www.brainbell.com/tutorials/MySQL/C...ng_Triggers.htm
Cytat
A single trigger cannot be associated with multiple events or multiple tables, so if you need a trigger to be executed for both INSERT and UPDATE operations, you'll need to define two triggers.


// EDIT:
Wygląda na to, że pozamiatane:
http://lists.mysql.com/commits/8316
Cytat
We don't allow creation of several triggers of the same type yet

W takim razie takie triggery to sobie można wsadzić...

Ten post edytował phpion 21.06.2008, 17:37:50
Go to the top of the page
+Quote Post
slawcio
post 23.06.2008, 19:26:59
Post #4





Grupa: Zarejestrowani
Postów: 10
Pomógł: 1
Dołączył: 23.06.2008
Skąd: lublin

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


siema
1. masz starą wersje mysql
2. triggery weszły bodajże od wersji 5.0.34
3. z tego co wiem nie da sie utworzyć triggera który jednoczesnie działa na insert, update i delete (ale tego nie jestem pewien)
4. pozdrawiam
Go to the top of the page
+Quote Post
phpion
post 23.06.2008, 20:03:46
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(slawcio @ 23.06.2008, 20:26:59 ) *
1. masz starą wersje mysql

No idealnie świeża to ona nie jest ale na serwerze i tak jest starsza.

Cytat(slawcio @ 23.06.2008, 20:26:59 ) *
2. triggery weszły bodajże od wersji 5.0.34

Nie, dostępne są od wersji 5.0.2.

Cytat(slawcio @ 23.06.2008, 20:26:59 ) *
3. z tego co wiem nie da sie utworzyć triggera który jednoczesnie działa na insert, update i delete (ale tego nie jestem pewien)

No właśnie się nie da. *

Cytat(slawcio @ 23.06.2008, 20:26:59 ) *
4. pozdrawiam

Ja również smile.gif

* finalnie projekt powstaje na PostgreSQL, w którym to nie ma najmniejszych problemów z triggerami.
Go to the top of the page
+Quote Post
slawcio
post 23.06.2008, 21:40:55
Post #6





Grupa: Zarejestrowani
Postów: 10
Pomógł: 1
Dołączył: 23.06.2008
Skąd: lublin

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


na 100 % masz za stara wersję MySQL, bo też długo spędziliśmy czasu zanim obczailiśmy dlaczego nam nie działa, a mieliśmy podobny problem...
... i jeszcze raz pozdrawiam
Go to the top of the page
+Quote Post
phpion
post 24.06.2008, 06:08:50
Post #7





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Ok, pewnie masz rację, ale (jak już pisałem) na serwerze i tak jest dostępna jeszcze starsza wersja (5.0.22) więc to i tak nie miałoby sensu. Co nie zmienia jednak faktu, że zachowanie:
Cytat
Script line: 19 Trigger does not exist
Script line: 20 Trigger does not exist
Script line: 28 Trigger already exists
Script line: 34 Trigger already exists

jest co najmniej niezrozumiałe...
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: 29.06.2025 - 00:53