Jeśli mam trigger
before the update
na stole, jak mogę zgłosić błąd, który uniemożliwia aktualizację w tym stole?
174
Oto jeden hack, który może zadziałać. Nie jest czysty, ale wygląda na to, że może działać:
Zasadniczo po prostu spróbuj zaktualizować kolumnę, która nie istnieje.
Począwszy od MySQL 5.5, możesz użyć
SIGNAL
składni, aby zgłosić wyjątek :Stan 45000 jest ogólnym stanem reprezentującym „nieobsługiwany wyjątek zdefiniowany przez użytkownika”.
Oto bardziej kompletny przykład tego podejścia:
źródło
Niestety odpowiedź udzielona przez @RuiDC nie działa w wersjach MySQL starszych niż 5.5, ponieważ nie ma implementacji SIGNAL dla procedur składowanych.
Rozwiązaniem, które znalazłem, jest zasymulowanie sygnału
table_name doesn't exist
powodującego błąd, umieszczającego dostosowany komunikat o błędzie do plikutable_name
.Hack można zaimplementować za pomocą wyzwalaczy lub procedury składowanej. Poniżej opiszę obie opcje na przykładzie @RuiDC.
Korzystanie z wyzwalaczy
Korzystanie z procedury składowanej
Procedury składowane pozwalają na użycie dynamicznego sql, co umożliwia hermetyzację funkcjonalności generowania błędów w jednej procedurze. Kontrapunktem jest to, że powinniśmy kontrolować metody wstawiania / aktualizowania aplikacji, więc używają one tylko naszej procedury składowanej (bez nadawania bezpośrednich uprawnień do INSERT / UPDATE).
źródło
Poniższa procedura jest (w mysql5) sposobem na zgłaszanie niestandardowych błędów i rejestrowanie ich w tym samym czasie:
źródło
źródło
Inna (hack) metoda (jeśli z jakiegoś powodu nie korzystasz z 5.5+), której możesz użyć:
Jeśli masz wymagane pole, w wyzwalaczu ustaw je na nieprawidłową wartość, na przykład NULL. To zadziała zarówno dla INSERT, jak i UPDATE. Zwróć uwagę, że jeśli NULL jest prawidłową wartością dla wymaganego pola (z jakiegoś szalonego powodu), to podejście nie zadziała.
Jeśli korzystasz z wersji 5.5+, możesz użyć stanu sygnału opisanego w innych odpowiedziach:
źródło
źródło