Autor Zpráva
trigger
Profil *
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
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
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
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 *
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

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0