Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Trigger before delete
nono91
post
Post #1





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 26.10.2014

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


Cześć , przed usunięciem rekordu chcę aby trigger wstawił w jedną tabelę pewien rekord, a z innej usunął. Jak zrobię jedną z tych czynności to działa, lecz jak chcę dwie na raz pojawia się problem , ponieważ nie mogę utworzyć dwóch triggerów before delete. A gdy próbuję w jednym triggerze wykonać obie operacje , to niestety wyskakuje błąd o błędniej składni.
  1. CREATE TRIGGER `delete`
  2. BEFORE DELETE ON `articles`
  3. FOR EACH ROW
  4. BEGIN
  5. DELETE FROM articlesHistory WHERE OLD.id = id ;
  6.  
  7. INSERT INTO articlesremoved
  8. SELECT a.*, NOW()
  9. FROM articles a
  10. WHERE id = OLD.id;
  11.  
  12. END
  13.  
  14.  
  15.  
Go to the top of the page
+Quote Post
kartin
post
Post #2





Grupa: Zarejestrowani
Postów: 246
Pomógł: 79
Dołączył: 25.05.2010

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


Jeśli masz kod dokładnie taki jak powyżej, to średnik oznacza koniec zapytania, a trigger jednak w tym miejscu się nie kończy. Musisz ustawić sobie inny znak końca zapytania np.:
  1. DELIMITER //
  2.  
  3. CREATE TRIGGER `delete` AFTER DELETE ON articles
  4. FOR EACH ROW
  5. BEGIN
  6. DELETE FROM articlesHistory WHERE id = OLD.id;
  7.  
  8. INSERT INTO articlesremoved
  9. VALUES (OLD.kolumna1, OLD.kolumna2, OLD.kolumna3, NOW())
  10. END //
  11.  
  12. DELIMITER ;

Poza tym w DELETE powinno być WHERE id = OLD.id a wyzwalacz raczej powinien być wykonywany dopiero po modyfikacji danych - AFTER DELETE. Jeśli będzie wykonywany przed to może się zdarzyć, że kasowanie nie powiedzie się to trigger i tak zostanie wywołany. Wydaje się, że to jest tutaj niepożądane.

Ten post edytował kartin 6.01.2015, 12:21:47


--------------------
Jeśli ten post pomógł to kliknij przycisk po lewej stronie.
Nie pomagam przez PW, GG, e-mail, faks, telegram, znaki dymne, ...
Go to the top of the page
+Quote Post
nono91
post
Post #3





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 26.10.2014

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


Dzięki za odpowiedź. Zapisało bez błędów , ale albo coś źle jest skonstruowane albo tak nie da się zrobić. A mianowicie mam 2 tabele articles i articleshistory. W articlesHistory mam klucz obcy z articles.
Relacja jest 1 - wielu (articles-articlesHistory)
Dlatego też przez usunięciem rekordu z articles chcę uruchomić wyzwalacz by najpierw usunął wszystkie rekordy z tabeli articlesHistory o kluczu obcym taki jaki jest usuwany z tabeli articles. Ale niestety wyskakuje błąd pokazujący constraint o kluczu obcym. Co robię źle ?
Oczywiście zmieniłem w kodzie wyżej na BEFORE DELETE z powodu jaki przed chwilą podałem.

Ten post edytował nono91 6.01.2015, 16:18:21
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


To po kiego wałka używasz do tego Triggerów? Przecież to się załatwia Kluczami obcymi właśnie i ON DELETE CASCADE
Go to the top of the page
+Quote Post
nono91
post
Post #5





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 26.10.2014

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


.... rzeczywiście , robiłem tak wcześniej i nie działało ale była tego inna przyczyna i potem próbowałem to zrobić triggerem. Dzięki wielkie.
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 Aktualny czas: 19.08.2025 - 19:26