Wałkowanie triggerów

0

Witam

wykonuję taki trigger :

CREATE TRIGGER T_BI_Name BEFORE INSERT ON tabela 
    FOR EACH ROW BEGIN
    SET NEW.UserName = CONCAT("user",  '_', NEW.IDuser);
    END;

i bardzo by mi zależało aby otrzymać przed wstawieniem to ID, które przechwytuje gdzieś w locie, można to wykonać ?

0

Jakie Id? W jakim locie?
Jeśli masz kolumnę auto_increment to jej wartość dla triggera before będzie zero. Zrób trigger na after. :)

0

ok, niech będzie PO, ale i tutaj mam kłopoty :

Error Code : 1442
Can't update table 'mojaTabela' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

CREATE TRIGGER T_AI_name AFTER INSERT ON childTable
    FOR EACH ROW BEGIN
    UPDATE mojaTabela 
    SET Name = CONCAT("U", NEW.ID_fk, DATE_FORMAT(NOW(),'%e%c%y'))
    WHERE ID= NEW.ID_fk;    
    END;

Już we wcześniejszych postach pisałem o tym, nie czuję tych triggerów. Potrzebuje ID, nie mogę zrobić tego PRZED - bo nie - no to robię PO- też nie, bo jakiś błąd :/

Wywołując procedurę z triggera, też nie mogę wykonać- to samo polecenie :

CALL GenerateMyName(NEW.ID);
0

W MySQL nie da się zrobić triggera, który modyfikuje tabelę na której jest zapięty ten właśnie trigger.
Rozwiązanie:

  • użyj innego SZBD, który to umożliwia
  • w transakcji najpierw wykonaj insert, pobierz wstawione id, zaktualizuj kolumnę name stworzoną wartością, zakończ transakcję - wada, musisz dopuścić null w kolumnie name lub robić insert z jakąś defaultową wartością
  • inaczej zorganizuj nadawanie nazwy, generuj ją po stronie kodu (bo pytanie czy taka nazwa z ID i aktualnej daty w ogóle ma biznesowy sens)
0
massther napisał(a)
  • inaczej zorganizuj nadawanie nazwy, generuj ją po stronie kodu (bo pytanie czy taka nazwa z ID i aktualnej daty w ogóle ma biznesowy sens)

a jak zrobisz unikalną nazwę ?, tak sobie wymyśliłem, potrzebowałem czegoś unikalnego, nie chcę walić do nazwy UUID lub czegokolwiek innego.

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