sprawa ma się następująco:
mam dwie tabele o identycznej strukturze:
CREATE TABLE IF NOT EXISTS `trtest1` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `value` varchar(30) character SET utf8 collate utf8_polish_ci NOT NULL, `ser` int(11) UNSIGNED NOT NULL, `time` int(11) NOT NULL, `info` text character SET utf8 collate utf8_polish_ci, PRIMARY KEY (`id`) ) 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:
DELIMITER // CREATE TRIGGER `test`.`backup` BEFORE UPDATE ON `test`.`trtest1` FOR EACH ROW begin IF new.ser!=old.ser then SET new.info:=concat_ws('\n', old.info, '------------------------------------', NOW(), 'Próba modyfikacji numeru seryjnego!!', '------------------------------------\n' ); SET new.ser:=old.ser; SET new.value:=old.value; SET new.time:=old.time; else INSERT INTO trtest2 (value,ser,time,info) SELECT value,ser,time,info FROM trtest1 WHERE id=NEW.id; SET new.time=UNIX_TIMESTAMP(); end IF; end // 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 (: