konto usunięte

Temat: Problem z triggerem

Witam!
Co tu mam źle? Sam trigger się tworzy, ale przy dodawaniu inserta dostaję błąd...:

Can't update table 'cms_sessions' in stored function/trigger because it is already used by statement which invoked this stored function/trigger

CREATE TRIGGER `delete_session_history` AFTER INSERT ON `cms_sessions`
FOR EACH ROW BEGIN

DELETE
FROM cms_sessions
WHERE last_activity<(UNIX_TIMESTAMP()-2592000);

END
Tomasz Zadora

Tomasz Zadora programuję

Temat: Problem z triggerem

Komunikat dość dobrze wyjaśnia jeden z uroków MySQL-a, to znaczy:

"Nie możesz zaktualizować tabeli 'cms_sessions' w procedurze/wyzwalaczu ponieważ jest ona już użyta przez komendę która wywołała tą procedurę/wyzwalacz"

Generalnie nie polecam robić jakiejkolwiek logiki po stronie MySQLa, tylko po stronie aplikacji a MySQL traktować jako prosty magazyn danych - do tego świetnie się nadaje. Zapomnij o triggerach procedurach - nie są np. wyzwalane przy kaskadowym kasowaniu rekordów i mają wiele innych ograniczeń. Jeżeli pracujesz z MySQL rób to wszystko po stronie aplikacji.

konto usunięte

Temat: Problem z triggerem

Dzięki. A jeśli przeniósłbym się na inną bazę? Teoretycznie.
Tomasz Zadora

Tomasz Zadora programuję

Temat: Problem z triggerem

Z darmowych to polecam PostgreSQL albo Firebird - tam nie ma tych ograniczeń, są to bazy bardziej zgodne ze standardem SQL-92 i można budować rozbudowaną logikę po stronie bazy - szczególnie w PostgreSQL.

Natomiast MySQL ma te zalety, że jest prosty i popularny, aczkolwiek ta prostota znika kiedy zaczynają się problemy, np.: duże wolumeny danych, wiele operacji zapisu/odczytu na raz, wtedy trzeba znać MySQL od podszewki aby sobie z tym poradzić.

konto usunięte

Temat: Problem z triggerem

Dzięki. Musze doczytać co to Firebird. W sumie liczyłem, że podasz jakieś nazwy i się nie zawiodłem :)

konto usunięte

Temat: Problem z triggerem

Wydaje mi się, że warto byłoby się zastanowić nad sensem tej operacji. Wygląda ta tak jakbyś chciał ograniczyć okno czasowe trzymanych informacji o sesji i przetwarzasz z poziomu każdego wiersza całą tabelę. Jeżeli masz np. 100 insertów na godzinę, to 100 razy będziesz wyszukiwał i usuwał rekordy... a co za tym idzie ingerował w cały mechanizm storowania... począwszy od indeksów a skończywszy na blokach.

Może warto byłoby zastanowić się, czy nie lepiej wepchnąć tą funkcjonalność w event odpalany z określonym interwałem czasowym?
http://dev.mysql.com/doc/refman/5.1/en/events.html
Plusem takiego rozwiązanie będzie to, że jeżeli pojawi się dużo rekordów do zrzucenia... bo od dawna
 w twoim przypadku:   (UNIX_TIMESTAMP()-2592000); 

nikt nie postawił nowej sesji, to RDBMS będzie miał co robić a użytkownik poczeka.

konto usunięte

Temat: Problem z triggerem

Dzięki :) Jeśli MySQL pozwala na coś w stylu crona, to jest to dużo lepsze rozwiązanie. Muszę poczytać. Dzięki za wskazanie drogi :)
Piotr Kwiatkowski

Piotr Kwiatkowski Specjalista d/s
reklamy, WPS-Group
s.c.

Temat: Problem z triggerem

Witam. Przepraszam, że piszę tutaj, ale problem mam trochę podobny.
Od pewnego czasu zastanawiam się jak wykonać ( najprościej jak to możliwe i najbezpieczniej ) połączenie kilku MySQL.

Użytkownik logujący się w sklepie automatycznie byłby zalogowany na forum i na aukcji. Opcja alternatywna jest taka, że użytkownik rejestrujący się np w sklepie mógłby na te same dane ( login i nick ) zalogować się na aukcji i na forum.

Oczywiście aukcja, sklep i forum mają osobne bazy danych.

Wyjściem byłby automatyczny import danych użytkownika lub też założenie osobnej bazy, w której przechowywane byłyby loginy. Pytanie jak to wykonać najbezpieczniej czy przez MySQL czy php. Przez php próbowałem, ale średnio to wyszło.

Z góry dzięki za rady i ewentualne linki ( jakby ktoś miał pod ręką ) bo przewertowałem wszystko co mogłem i jakoś nie ma nic.

Następna dyskusja:

problem z polskimi znakami




Wyślij zaproszenie do