Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Blokowanie UPDATE w triggerze
Nexces
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 22.02.2008

Ostrzeżenie: (0%)
-----


Witam,
sprawa ma się następująco:
mam dwie tabele o identycznej strukturze:
  1. CREATE TABLE IF NOT EXISTS `trtest1` (
  2. `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `value` varchar(30) character SET utf8 collate utf8_polish_ci NOT NULL,
  4. `ser` int(11) UNSIGNED NOT NULL,
  5. `time` int(11) NOT NULL,
  6. `info` text character SET utf8 collate utf8_polish_ci,
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

różnią się tylko nazwą...
mam trigger'a który w momencie modyfikacji wiersza/wierszy z pierwszej tabeli poprzednie "wersje" przenosi do drugiej (śledzenie zmian swoiste)

pole `ser` które jest w tym przypadku numerem seryjnym nie może zostać w żasdnym przypadku zmodyfikwane...
pókico wyprodukowałem coś takiego:
  1. DELIMITER //
  2. CREATE TRIGGER `test`.`backup` BEFORE UPDATE ON `test`.`trtest1`
  3. FOR EACH ROW begin IF new.ser!=old.ser then
  4. SET new.info:=concat_ws('\n',
  5. old.info,
  6. '------------------------------------',
  7. NOW(),
  8. 'Próba modyfikacji numeru seryjnego!!',
  9. '------------------------------------\n'
  10. );
  11. SET new.ser:=old.ser;
  12. SET new.value:=old.value;
  13. SET new.time:=old.time;
  14. else
  15. INSERT INTO trtest2 (value,ser,time,info) SELECT value,ser,time,info FROM trtest1 WHERE id=NEW.id;
  16. SET new.time=UNIX_TIMESTAMP();
  17. end IF;
  18. end
  19. //
  20. DELIMITER ;


sprawuje się genialnie natomiast jest to app rozwijany ciągle i muszę mieć możliwość dość lekkiego dodawania kolejnych kolumn do tych tabel (w tej chwili jest raptem 20)...

zastanawiam się czy można tak opisać tego triggera, żeby:
po 1:
w przypadku próby zmiany numeru seryjnego zablokował akcję modyfikując tylko pole info
lub
przywrócił poprzednie wartości wszystkim kolumnom (w tej chwili jest tak to zrobione, jednak jest to o tyle niewygodne, że każde pole muszę osobno wpisać, a chcę tego uniknąć)

po 2:
wygodniejsze kopiowanie... znowuż w tej chwili muszę wszystkie pola wypisać, bo id jest auto_increment
insert into trtest2 select * from trtest2;
daje niezbyt przyjemny efekt w postaci dublowania klucza...

z góry dzięki za wszelkie propozycje (:
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 03:15