Koliko sam razumeo ti imas neke vrednosti npr:
stanje = func(a, b, c), gde su a,b,c pretpostavljam neki agregati (npr a = sum(svih promena) from transakcije) iz razlicitih tabela. To je efektivno referential integrity pravilo koje nema direktnu podrsku u SQL-u.
Prvo i najprostije (ali i najlosije) resenje ti je da u stored proceduru i/ili select komandu ubacis nested querije (npr slicno ovom):
Code:
SELECT Id, Ime, (SELECT SUM(ulaz) from Tran t where t.ArtikalId = a.Id) as stanje from Artikal a where a.Name = @imeartikla;
Losa strana je sto queri progresivno postaje sve sporiji sporiji kako se Tran tabela uvecava. Drugo, svaki select ce ti baciti shared lockove na sve redove iz Trans koji ucestvuju u agregatu, sto privremeno blokira insert/update komande nad Tran tabelom bez potrebe.
Drugo resenje je upotreba trigera. Znaci zakacis insert/update trigere na tabele koje ucestvuju u a, b, c i na svaki insert/update sracunas stanje i ubacis u Artikal u polja koja pominjes. Ovde samo moras da pazis da trigeri uvek idu istim redosledom u sracunavanju i da koriste table lock hintove u selectima koji racunaju agregate (da bi sprecio drugi triger da umesa prste u racunanje). Iako efektivno i sad lokujes Trans tabelu, to sad radis samo kad dolazi do promene a ne svaki put kad se povuce stanje. Isto vodi racuna da se trigeri ne pozivaju za svaki pojedinacni update, ako se u tabeli jednom komandom modifikuje vise redova, samo jedan trigger ce se opaliti (a inserted i delted implicitne tabele ce imati vise redova, po jedan za svaku promenu). Velika vecina problema koje sam videosa trigerima je sto su developeri pravili trigere kao da se samo jedan red menja/dodaje.
Ono sto sasvim sigurno ne bi trebao da radis je da obezbedjujes referential integrity kroz externe alate (u sta spada i tvoja aplikacija). TO pravi velike probleme sa skalabilnoscu sistema (npr ako se na istu bazu nakaci poseban program koji npr vodi proizvodni proces i vuce materijale iz magacina, i taj program nema pojma da ti vestacki odrzavas stanja van samog SQLa).