Cześć,
pomyślałem sobie, że Tobie pomogę
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