| 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: 12 let
|
|||
0