Autor | Zpráva | ||
---|---|---|---|
trigger Profil * |
#1 · Zasláno: 3. 7. 2014, 15:18:55
Prosim, lze takto natavit trigger:
CREATE TRIGGER [UpdateTable] AFTER UPDATE ON table WHEN 1=1 BEGIN UPDATE table SET datumu=DATETIME("NOW", "localtime") WHERE id=new.id AND (col1<>new.col1 OR col2<>new.col2); END vypadá, že nefunguje Dik za radu |
||
Jozin Profil |
#2 · Zasláno: 3. 7. 2014, 19:33:27
Zdravím, takto rozhodně ne, to co jsi napsal je nekonečná rekurze, při updatu tabulky "table" (což je btw klíčové slovo, takže jej rozhodně musíš napsat takto: `table`) se updatuje ta samá tabulka, která vyvolá opet tento trigger... Nicméně ani tak nefunguje, jelikož v těle triggeru vidím "new.id", "new.col1", "new.col2", které nemá jak databáze vědět kde se vzala.
Doufám, že jsem nepsal nějaké blbosti, protože sqllite jsem ještě nepoužíval, Jožin. P.S.: jen poznámka, pokud nechceš specifikovat podmínku, tak ji nepiš WHEN není povinné. |
||
juriad Profil |
#3 · Zasláno: 3. 7. 2014, 19:51:24
Posloupnost příkazů, která funguje:
drop table log; drop trigger update_log; create table log ( id integer primary key autoincrement, a integer, b integer, d datetime ); create trigger update_log after update on log when new.a <> old.a or new.b <> old.b begin update log set d=datetime("now", "localtime") where id=new.id; end; insert into log (a, b) values (1, 2); insert into log (a, b) values (2, 3); insert into log (a, b) values (3, 4); update log set a=4 where id = 2; select * from log; Jozin: 1) new a old jsou virtuální tabulky obsahující hodnoty aktuálně zpracovávaného záznamu 2) ta podmínka when tam musí být právě pro případ, aby se trigger nezacyklil. Všimni si, že update volaný z triggeru podmínce nikdy nevyhoví. |
||
Jozin Profil |
#4 · Zasláno: 4. 7. 2014, 10:39:56
Ta podmínka je splněna vzdy 1=1 je vždy true. Za to s new se tedy omlouvám, každopádně to končí na tom when.
|
||
trigger Profil * |
#5 · Zasláno: 4. 7. 2014, 16:06:56 · Upravil/a: trigger
a co takhle?
CREATE TRIGGER [UpdateTable] AFTER UPDATE ON table WHEN (new.col1<>new.col1) OR (old.col2<>new.col2) BEGIN UPDATE table SET datumu=DATETIME("NOW", "localtime") WHERE id=new.id; END tzn. jestliže u daného řádku změním col1 nebo col2, změní se u něho datumu na aktuální tak to totiž chci jo, už vidím, že juriad něco takového poradil |
||
Časová prodleva: 10 let
|
0