Trigger wywołujący procedure

0

Witam,
Z racji ograniczeń triggera w związku z tworzeniem nowych tabel zastanawiam się czy jest możliwość takiego rozwiązania..

Tworzę trigger, który wywołuje w sobie procedure, która otrzymuje jako parametr datę z operacji triggera..

 
DELIMITER //
CREATE TRIGGER createTableWyniki AFTER INSERT ON zawodynazwa 
  FOR EACH ROW 
  BEGIN
  #SET @data = (SELECT YEAR(dataZawody) FROM zawodynazwa WHERE dataZawody = NEW.dataZawody);
  CALL procCreateTableWyniki(NEW.dataZawody);
END//
DELIMITER ;

a procedura ma za zadanie utworzyć nową tabele, która w nazwie tabeli ma mieć przekazany wcześniej rok, coś na wzór - wyniki_2013
(tylko tutaj chyba trzeba skorzystać z polecenia PREPARE do utworzenia tej zmiennej tablicowej ? Dokładnie nie wiem jak to może/powinno wyglądać..)

 
DELIMITER //
CREATE PROCEDURE procCreateTableWyniki(IN dataORG CHAR(10))
BEGIN
    SET @dataMOD = (SELECT YEAR(dataZawody) FROM zawodynazwa WHERE dataZawody = dataORG);      #tutaj z daty '2013-01-01' chce dalej wyciągnąć tylko rok '2013'
    SET @wynikiTab = CONCAT('wyniki_',@dataMOD); 
    SET @sql = CONCAT('CREATE TABLE ',@wynikiTab,' (idWynik int(50) NOT NULL AUTO_INCREMENT)');
    
    IF NOT EXISTS (SELECT * FROM lata WHERE rok = @dataMOD) THEN
       PREPARE s1 from @sql;
       EXECUTE s1;
    END IF;
END//
DELIMITER ;

EDIT:
Po prawie dwóch godzinach myślenia nad kodem mam taki komunikat:
"Dynamic SQL is not allowed in stored function or trigger"

Co w przygotowanym poniżej kodzie może wywoływać taki komunikat? I jak sobie z tym poradzić?
Czy może trigger nie może wywoływać procedury?

Wszelka pomoc/sugestie mile widzane :)
(ps. proszę tylko o nie komentowania tego rozwiązania w stylu - "tak się nie robi, że tabela ma nazwe wyniki_2012, wyniki_2013.." bo ja o tym wiem.. ale to jest jak już wspominałem bardziej udowodnienie tego "że się da".

0

w wyzwalaczu nie możesz tworzyć tabeli

0

No właśnie znalazłem już kiedyś informacje na ten temat, dlatego postanowiłem w triggerze wywoływać procedure w której jest tworzona tabela.. ale tak też nie można?
To jak w takim przypadku się to rozwiązuje? Samą procedurą wykonywaną z poziomu aplikacji? (i w procedurze będzie wykonywany insert a ponim utworzenie tabeli?)

0

ale to nie ma znaczenia czy to bezpośrednio jest wyzwalacz czy procedura uruchomiona z tego wyzwalacza. Ważne jest, co uruchamia proces tworzenia/modyfikacji/usunięcia tabeli. W takim wypadku nie tworzy się tabel dla każdego roku oddzielnie - to się robi tworząc jedną tabelę, którą się partycjonuje w celu przyśpieszenia operacji na niej

0

Ok, dzięki za wyjaśnienie.. (ja niestety się za bardzo na tym nie znam ale muszę to wykonać..).

A możesz mi jeszcze powiedzieć, czy te partycjonowanie tabeli stosuje się na przykład wtedy gdy tabela jest wielkości 1 mln rekordów i działa to w miare płynnie, np. gdy chce się wyciągnąć informacje (wyniki) z jakiegoś konkretnego roku ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1