1

Temat: Log dla tabeli?

Witam

Mam oto taki problem mam bazę danych w której jest tabela users zawiera ona użytkowników którzy są zalogowani do mojego serwera. Ta tabela zmienia się dynamicznie (czyli jeżeli ktoś się zalogował do systemu to automatycznie jest zapisywany w tej tabeli a gdy kończy pracę jest on automatycznie usuwany z tej tabeli).

Chcę aby postgres każdorazowo gdy nastąpi zmiana w tej tabeli zapisywał mi te zmiany (nową aktualną listę użytkowników) w jakimś pliku np. zmiany_000x.log (chodzi mi o tworzenie logu).

Jak zrobić coś takiego?

Pozdrawiam i liczę na odpowiedź smile

2

Odp: Log dla tabeli?

Pewne bedziesz potrzebowal triggera na tabeli users. Ale trigger bedzie musial wykorzystywac funkcje w jakims jezyku niezaufanym, bo jezyki zaufane raczej nie maja dostepu do systemu plikow. Latwiej bedzie zapisywac te zmiany w jakiejs tabeli (przy uzyciu triggera i np funkcji plpgsql) i okresowo zrzucac tabele do pliku. Czy to ci troche rozjasnilo sytuacje?

3

Odp: Log dla tabeli?

Trochę tak ale nie do końca. mniej więcej rozumiem jak to ma wyglądać. (Tworzę tabelę i okresowo np. co 5 minut zrzucam ją do pliku). Natomiast gorzej jest jeżeli chodzi o pierwszą część. Bo nie bardzo wiem jak się za to zabrać w postgresie sad

4

Odp: Log dla tabeli?

Cześć,

Zgadzam się z RSKI: najlepiej tabela i trigger, który będzie obsługiwał całość.

Ja proponowałbym następujące rozwiązanie:
Dwie tabele T_LOGI_NAG <- będą przechowywane nagłówki, tzn. godzina logu i ID tej tabeli
                  T_LOGI_TAB <- będzie przechowywać listę użytkowników zalogowanych na daną godzinę, będzie posiadać swój własny ID oraz ID z tabeli T_LOGI_NAG

będą potrzebne 2 sekwencje, dla każdej z tych tabel

oraz jeden lub dwa triggery na Twojej Tabelce USERS

Działeanie:
  użytkownik loguje się, wstawia się rekord do USERS odpala się trigger, który zapisuje datę do T_LOGI_NAG i aktualną listę userów do T_LOGI_TAB

  użytkownik się wylogowuje, usuwany jest rekord z USERS odpala się trigger, który zapisuje datę do T_LOGI_NAG i aktualną listę użytkowników do T_LOGI_TAB

czy coś takiego Ciebie satysfakcjonuje?
  jeśli tak, czy wiesz jak to zrobić?

pozdrawiam smile

5

Odp: Log dla tabeli?

Rozwiązanie rozumiem. Natomiast nieco brakuje mi umiejętności sad ... ewentualnie możecie mi polecić jakiś tutorial jak działa funkcja trigger lub ewentualnie jakąś dobrą książkę gdzie jest to jasno i płynie opisane (chodzi mi głównie o składnię polecenia dalej jakoś sobie poradzę ... chyba smile )

6

Odp: Log dla tabeli?

trigger to nie funkcja tylko wyzwalacz-cos co pozwala wykonac jakies operacje (wywolac jakas funkcje) pod wplywem innej operacji tzn. np:
robisz sobie jakas funkcje  F i chcesz zeby po wykonaniu np operacj insert na tabeli T ta funkcja zostala wykonana, aby to zrobic definiujesz trigger na tabeli T, mowisz ze trigger ma byc uruchamiany przez Insert i ma wykonywac funkcje F.
A najlepiej to sobie poczytaj manual na postgresql.org

7

Odp: Log dla tabeli?

Cześć,

pomyślałem sobie, że Tobie pomogę smile

z tego co napisałeś Twoja tabelka USERS funkcjonuje tak, że gdy ktoś się loguje jest dodawany rekord z jego loginem, gdy się wylogowuje jest usuwany rekord z jego loginem- czyli w danym momencie przechowuje loginy tylko zalogowanych. Dlatego wyobrażam sobie tą tabelkę mniej więcej tak, że posiada ona przynajmniej kolumnę LOGIN. Pozostałe kolumny mnie nie interesują. Przyjąłem, że LOGIN jest mniejszy równy rozmiarowi VARCHAR(100).

Oto moja propozycja dla Ciebie. Nie gwarantuje, że zadziałą od razu, bo pisałem ją w okienku notatnika. KOLEJNOŚĆ JEST ISTOTNA!!!


--Tworzenie tabelek
CREATE TABLE T_LOGI_NAG  (ID_LONA NUMERIC(16) NOT NULL, LOG_DATA DATE NOT NULL DEFAULT CURRENT_DATE) ;

CREATE TABLE T_LOGI_TAB  (ID_LOTA NUMERIC(16), ID_LONA NUMERIC(16) NOT NULL, LOGIN VARCHAR(100) NOT NULL) ;


--Tworzenie sekwencji
CREATE SEQUENCE S_LONA
INCREMENT BY 1
START WITH 1
MAXVALUE 999999999999999999
MINVALUE 1
;


CREATE SEQUENCE S_LOTA
INCREMENT BY 1
START WITH 1
MAXVALUE 999999999999999999
MINVALUE 1
;


--Tworzenie funkcji, ktora bedzie wywolywana przez triggera na tabeli USERS. Wlasnie ta funkcja odwala glowna robote!
CREATE OR REPLACE FUNCTION f_trg_user_afid()
  RETURNS opaque AS '
  DECLARE
     n_ID_LONA NUMERIC(16);
  BEGIN
    n_ID_LONA := nextval(''S_LONA'');

    INSERT INTO T_LOGI_NAG (ID_LONA) VALUES (n_ID_LONA);

    INSERT INTO T_LOGI_TAB (ID_LOTA, ID_LONA, LOGIN)
           SELECT nextval(''S_LOTA''), n_ID_LONA, LOGIN
             FROM USERS;

    RETURN NULL;
  END;
  ' LANGUAGE 'plpgsql';


--Tworzenie triggera (po polsku "wyzwalacza"), ktory wywoluje wczesniej zadeklarowana funkcje
CREATE TRIGGER trg_user_afid
  AFTER INSERT OR DELETE
  ON USERS
  FOR EACH ROW
  EXECUTE PROCEDURE f_trg_user_afid();


.OK, to tyle

pozdrawiam wink

8

Odp: Log dla tabeli?

Dziękuję smile
wziąłem w łapkę książkę PostgreSQL autorstwa Jeff Perkins-a ... ale na temat funkcji trigger było niewiele opisane (całej książki jeszcze nie przeczytałem) smile Więc dziękuję ... na razie to będzie wszystko ... ale przypuszczam że będę mieć jeszcze dużo innych problemów smile) ... w przyszłości

Dziękuję i Pozdrawiam smile