Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Trigger i procedura składowana
Forum PHP.pl > Forum > Bazy danych > MySQL
busterek
Witajcie.
Mam taką tabelę:

fileID
userUD
uniqueFileID
originalFileName

Są w niej jeszcze inne pola, ale one są nieistotne. Po stronie aplikacji wykonuję następujące zapytanie dodające plik do bazy danych:

  1. INSERT INTO files (userID, originalFileName) VALUES ('$userID', '$originalFileName');


Chciałbym teraz po stronie bazy danych dokonać update tego rekordu, wykonując najpierw złączenia wartosci z pól fileID, userID oraz originalFileName, następnie wykonać na tym złączonym ciągu kodowanie SHA1 i tą wartość zapisać w polu uniqueFileID. Jak to zrobić?

Coś zrobiłem, ale nie działa. Poniżej kod triggera i procedury;

  1. DELIMITER $$
  2.  
  3. CREATE PROCEDURE `updateFiles`()
  4. BEGIN
  5. SELECT LAST_INSERT_ID() INTO @lastID FROM files;
  6. SELECT SHA1(CONCAT(fileID, userID, originalFileName)) INTO @UID FROM files WHERE fileID= @lastID;
  7. UPDATE files SET uniqueFileID= @UID WHERE fileID = @lastID;
  8. END
  9.  
  10. DELIMITER ;


  1. DELIMITER $$
  2. DROP TRIGGER IF EXISTS uniqueID
  3. $$
  4. CREATE TRIGGER uniqueID AFTER INSERT ON files
  5. FOR EACH ROW
  6. BEGIN
  7. CALL updateFiles();
  8. END;
  9. $$
  10. DELIMITER ;


Po wywołaniu INSERT dostaję błąd 1442. Jak to zrobić poprawnie?
mmmmmmm
  1. DELIMITER $$
  2. DROP TRIGGER IF EXISTS uniqueID
  3. $$
  4. CREATE TRIGGER uniqueID BEFORE INSERT ON files
  5. FOR EACH ROW
  6. BEGIN
  7. SET NEW.uniqueFileID=SHA1(CONCAT(NEW.fileID, NEW.userID, NEW.originalFileName));
  8. END;
  9. $$
  10. DELIMITER ;

busterek
Hmmm. Generalnie działa. Ale wynika mi z tego, że pole fileID nie mogę mieć ustawionego na auto_increment, tylko obsługiwać je ręcznie.A może się mylę?
mmmmmmm
A może byś sprawdził... W końcu to Twój problem...
busterek
Chodzi o to, że sprawdziłem. Wynik jest taki, że to NEW.fileID jest puste. Stąd moje pytanie.
mmmmmmm
Może dlatego, że to BEFORE. Musi byc BEFORE aby modyfikowa NEW (tak mi się wydaje). Ale myślałem, że już wtedy będzie miał ID... Cóż to MySQL (ja go nie lubię)....A na dodatek w triggerze nie możesz modyfikowac tabeli (UPDATE, DELETE, INSERT), która powoduje wywołanie triggera (niekoniecznie nawet tej, której trigger dotyczy). Takie są ograniczenia MySQL. Daltego na nim nie robię zaawansowanych aplikacji.
busterek
W sumie to żaden kłopot. Będę po prostu ręcznie wstawiał fileID z poziomu skryptu. Wtedy NEW.fileID powinno już być. Będę testował. Dzięki. Wielkie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.