OK, svaka upornost treba da se nagradi
U MS SQL imas generalno dve opcije. Prva opcija prati promene na nivou kolone, a druga pravi kopiju izmenjenog ili obrisanog reda u nekoj _Hostory tabeli. Postoji i treca opcija, pracenje nekih vaznih kolona. Prve dve opcije su dva nacina zapisvanja istorije. Treca opcija zahteva potpuno razlicit pristup dizajnu baze jer se vise ne prate podaci nego same promene. Nije vise tabela sa podacima, nego tabela sa promenama. Komplikovano je pa cemo to ostaviti za neku drugu priliku.
Opcija 1:
Ako zelis pracenej ama bas svih promena na bilo kojoj tabeli, pogledaj ovaj clanak:
https://www.simple-talk.com/sq...q-no.5-pop-on-the-audit-trail/
Postoji jedna tabeal u koju se upisuju promene sa vise tabela, na nivou kolone. Tabela u koju se upisuje 'istorija' izgleda otprilike ovako: Tabela Audit: {ImeTAbeleKoajSePrati, PK_tabele_koja_se_prati, NazicvKolone, VrsataPromene, StaraVrednost, NovaVrednost, KojeOvoUradio, KadJeOvoUradjeno}
Zadrzi ime tabele 'Audit', iz prakticinih razloga.
Svaka tabela koju pratis treba da ima triger koji na INSERT, UPDATE, DELETE upisuje promenu u tabelu Audit. Sve sto treba da promenis u trigeru je ime tabele koju pratis. Triger radi ostalo. Ja na ovaj nacin partim promene u malim tabelama, koje se retko menjaju, ali promene mogu imati vazne posledice, pa je vazno znati sta se desavalo. Tabela Audit je prilicno nezgodna za pretrazivanje, pa ne koristim ovaj nacin za slucajeve kad se ocekuje mnogo promena i redovno pretrazivanje tabeel Audit. Resenje je ipak elegantno jer se svodi na cut/paste koda za triger (uz proemnu naziva tabele koaj s eprati).
Druga opciaj ti je da za svaku tabelu imas i history tabelu. Na primer, tabela People ima People_History tabelu. Sve kolone iz tabele People se nalaze i utabeli People_Hiostory. People_History treba da ima i dodate kolone:
ChangeType ('U','D'),
WhoDidIt (DEFAULT User_name),
HistoryTakenDate Datetime DEFAULT getDate()
RowCounre identity (1,1) PRIMARY KEY
Onda napises trigger za UPDATE i DELETE na tabeli People koji radi otprilike ovako:
Code:
DECLARE @ChangeType as varchar(1)
IF Exists (SELECT TOP 1 * FROM inserted)
begin
set @ChangeType='U' --- on UPDATE we have stuff in INSERETD
end
ELSE
begin
set @ChangeType='D' --- on DELETE nothing exists in INSERTED
end
INSERT INTO People_History
(ChangeType,col1,col2,..coln) -- col1,col2,..coln su kolone iz tabele People
SELECT
(ChangeType=@ChangeType,col1,col2,..coln)
FROM deleted AS S
Ovo lepo radi sve dok ne promenis tabelu People - dodas ili uklonis kolonu. Ako dodas kolonu u osnovnoj tabeli, a zaboravi da je dodas u Hostory tabeli, triger ce nastaviti da radi, ali se nece hvatati istorija za novu kolonu. Ako izbrses kolonu iz bazne tabele a ostavis je u history, triger ce da pukne pri prvoj promeni.
Na tabeli People_Hostuy treba da imas triger, za UPDATE i DELETE koji ima samo jednu nardebu -ROLLBACK koja sprecava brisanje i menjanje History tabele.
To je sva prica, u kratkim crtama.
Srecan rad