silverglider je napisao(la):
Ne, onaj moj primer ne bi preskakao brojeve. Zasto ? Zato sto je trigger/event definisan u samoj bazi podataka, a ne na klijent datasetu. Znaci, kada radis client/server setup, na klijent masini radis samo sa subsetom koji je "donesen" na lokalni disk, nacesce kao rezultat nekog sql upita. Sve promene koje na njemu radis se rade na tzv. "change logu", ukljucujuci te sve insert, edit, append, post/cancel operacije. Tek kada zatvaras transakciju sa commit, change log izmene se primenjuju na samoj bazi na serveru. Ili se change log izmene odbacuju sa rollback zatvaranjem transakcije. Tek kada se uradi taj insert na datasetu u "pravoj" bazi na serveru, okine se trigger i popuni polje.
Evo odradio sam elementarni primer sa ovim triggerom ctp; (primer je u priligu). Jadnostavna tabela DOKUMENT sa tri polja, PK (prim_kljuc), RED_BR i neko VARCHAR polje (nije bitno). Dva generatora, jedan je vezan za prim_kljuc, a drugi upotrebljen za ovaj trigger za RED_BR. Na formi su IB elementi za DB, baza, transakcija, IBDataSet, DataSource i DBgrid za prikaz. Dugmetima OPEN, NOVI, POST pokrecem odgovarajuce elementarne akcije IBDataSeta. Transakcija je otvorena na pocetku (na form_create), a potvrdjujem je ili odbacujem na dugmeta COMMIT, ROLLBACK. Kolko ja vidim, na svaki NOVI (append) kreira se automatski prim_kljuc (kako je definisano u IBDataSet-u), a na svaki POST odmah se kreira vrednost RED_BR, sto ce reci da se TRIGGER izvrasava kad god klijent u svojoj aplikaciji ubacuje u DataSet-u novi slog! Ako u medjuvremenu 'zavirim' u pravu bazu na IB Serveru, vidim da jos uvek nema nikakvih novih slogova u 'pravoj' tabeli. Tek kad u aplikaciji potvrdim transakciju, novi redovi se prebacuju na Server bazu (ili se ne prebacuju ako odbacim transakciju).
Zakljucak: iventi u triggerima
BEFORE/AFTER - DELETE/INSERT/UPDATE se odnose na desavanja u klijentskim DataSetovima. Kako meni izgleda, iako su definisani na serveru, klijentska aplikacija ima 'svest' o triggerima, jos dok barata sa lokalnim DataSet-ovima, kao sto ima 'svest' i o NOT NULL poljima, kljucevima, CONSTRAINT-ima i sl. Ili meni nista nije jasno
*************************
Drugo, u mojoj pravoj aplikaciji RED_BR jeste neki prirodan kljuc. Radi se o nekoj vrsti knjige upisnika, tako da je RED_BR ujedno i identifikator dokumenta koji se upisuje i u dokument (znas ono kad ti u opstini izda resenje gde pise br 1234/03), sto znaci da se mora pamtiti u bazi, a i valjalo bi da ide po redu. U pravu si da je onda akcija brisanja slogova vrlo kriticna - trebalo bi je posebno kontrolisati iz programa...ali recimo da je to posebna tema, da ne sirimo sad...