Wykrywanie zmian w tabelach sql

0

Czy istnieje jakis sposob/narzedzie do wykrywania zmian w tabelach bazy danych(i jak to zrobic) ?
interesowalo by mnie zeby pokazywal ktore pole z czego i na co sie zmienilo

dzialam na sql 2000

0

Co rozumiesz przez zmiany? Strukture? Dane?

0

logi, wyzwalacz, porównywanie kopii (ostateczność)

0

zmiane danych, chce wiedziec co sie zmienilo w jakiej tabeli w jakiej kolumnie

zainstalwoalem sobie trialowa wersje "quest change director", jest tam narzędzie zwane "change tracker" ustawiam sobie baze daje "sledz zmiany" ale program nic nie wykrywa, zmienialem dane w bazie kilkoma programami i cisza, dziala to komus? moze jakis blad robie.

0

a co ma monitorowanie katalogów do zmian w bazie??

0

jakich katalogow? :| chodzi ci o ten program? to nie jest change directory ;) z teego co wyczytalem na stronie producenta robi on dokladnie co bym chial, czyli sledzi zmiany miedzy innymi w tabelach bazy danych.

Ps. Lamerskie pytanie ;-) , gdzie sa logi ze zmian w sql 2000? :P bo w katalogu log mam tylko logi z bledow

0

No to sobie napisz triggery i bedziesz mial wszystko zrobione tak jak sam chcesz. Powinien wystarczyc jeden trigger (w porywach 3) na kazda tabele.

0

co do logów to musisz sobie poszukać w książce jak je włączyć i używać- z tego co mi wiadomo możesz logować każdą zmianę w bazie

co do tego narzędzia, to pewnie najpierw trzeba bazę skonfigurować - poczytaj faq/opis/helpa do tego

0

zapomnialem napisac ze dopiero zaczynam zabawe z sql [glowa] glupio sie przyznac ze nie mam pojecia jak to zrobic z trigerami, jest jakis prosty przyklad sledzenia zmian na konkretna tabele? bo jesli to skomplikowane bardziej to dam sobie na razie z tym spokoj i was nie mecze ;)

0

Prosty przyklad, z glowy

Zakladasz nowa tabele Log z polami np. typ zmiany, kolumna zmieniana, stara wartosc, nowa wartosc, data zmiany, uzytkownik zmieniajacy.

create trigger LogZmianTabeliA on TabelaA
for insert
as
begin
declare @dateChanged datetime
set @dateChanged = gettime()
declare @newValue varchar(50)
select @newValue = cast(kolumna1 as varchar(50)) from inserted
insert into Log (changeType, columnChanged, oldValue, newValue, dateChange, user) values ('ins', 'kol1', NULL, @newValue, @dateChanged, USER_NAME())
select @newValue = cast(kolumna2 as varchar(50)) from inserted
...
end

Powyzszy kod ma kilka powaznych wad, wiec jest raczej w celu przykladu. Po pierwsze wartosci moga po skonwertowaniu miec wiecej znakow niz 50 (np. artykul w gazecie online). Po drugie mozna przegladac kolumny petla, wiec kod bedzie bardziej ogolny. Po trzecie zakladam, ze wstawiany jest jeden wiersz (a moze byc kilka - wtedy trigger sie wywali). Jezeli tabel masz malo lub monitorowanych pol bedzie kilka mozesz zrobic kilka tabel, ktore beda uwzglednialy typ i dlugosc zapamietywanych wartosci, itp. Zalezy co tak dokladnie chcesz monitorowac i zapamietywac.

0

Ja jestem zwolennikiem cieni do tabel. Co prawda sporo miejsca się marnuje ale wygoda jest duża. Zakładasz sobie taką samą tabele jak ta którą chcesz modyfikować + dodatkowa kolumna na ID. I teraz w triggerze (ON UPDATE) na monitorowanej tabeli dajesz insert'a do cienia. Później masz wszystko jak na dłoni. Jak masz w tabelce pole kto modyfikował i kiedy to już w ogóle wypas, jak nie masz to dodaj chociaż do tej z cieniem (ale wygodniej mieć tu i tu).

Minus - redundancja.
Plusy - np jak wyświetlasz potem gdzieś te dane, to wystarczy podmienić tabele na cień i bez modyfikacji przeglądasz sobie historię (bo cały interfejs "pasuje"). Generalnie wszystko jest czytelne. Aha trzeba zadbać o jeszcze taką jedną rzecz, żeby nie robić UPDATE'ów na tabeli, jak się faktycznie nic nie zmienia. Można to zrobić albo z poziomu interfejsu, jeśli jakiś jest, albo od biedy w triggerze sprawdzać IF OLD.ID <> NEW.ID OR OLD.COŚTAM <> NEW.COŚTAM ... ale ja tak nie lubie.

0

wielkie dzieki za pomoc, udalo mi sie tez wydumac jak uzywac tego programu o ktorym pisalem i jest naprawde dobry :)
Pozdrawiam

0

Podpinam się do tematu. Jak można zrobić żeby każda zmiana jakiegoś pola w bazie powodowała uruchomienie skryptu php dodającego do pliku te zmiane?

0

W MSSQL ostatnio zrobiłem mechanizm, który po insert/update/delete z tabeli uruchamia DLL napisaną w C#, która rozsyła sygnał na UDP. Stacje klienckie natomiast nasłuchują na UDP i jak pojawi się sygnał z serwera to coś tam się w stacji klienckiej dzieje. Podobny mechanizm mam na PostgreSQL ale tam użyłem pythona.

1 użytkowników online, w tym zalogowanych: 0, gości: 1