Witam serdecznie,
mam jeden mały problem. Mam TRIGGERa, który monitoruje następujące sytuacje:
1)gdy zmienione zostaną dane w tab. employess to zapisze zmiany w tab emp_monit -- nie umiem zapisać który to rekord został zmieniony :(
2)gdy zostanie dodany wiersz do tab. employess i zapisuje zmiany w tab emp_monit i który rekord został zmieniony -- to mi działa :)
3)gdy zostanie usunięty wiersz z tab. employess i zapisuje zmiany w tab emp_monit -- z tym juz sonie poradze jak zrobie upload
Umiem zrobić kto zmieniał dane, w jakim czasie i jaką operacje wykonał, ale brakuje mi zapisu który rekord w tabeli zmienił się. Proszę o jakąś wskazówkę ...
tabela employess przedstawia się:
CREATE TABLE employess (
id NUMBER(4) NOT NULL PRIMARY KEY,
first_name VARCHAR2(30),
last_name VARCHAR2(30),
email VARCHAR2(40),
phone NUMBER(12),
jobs_id NUMBER(4),
salary NUMBER(4),
departments_name VARCHAR2(30)
);
ALTER TABLE employess
ADD FOREIGN KEY (departments_name)
REFERENCES departments(name);
ALTER TABLE employess
ADD FOREIGN KEY (jobs_id)
REFERENCES jobs(id);
Zmiany 1),2) i 3) są zapisywane do tabeli
CREATE OR REPLACE TYPE tab_VARRAY IS VARRAY(3) OF VARCHAR2(50);
/
CREATE TABLE emp_monit (
id NUMBER(4) primary key,
user_name VARCHAR2(30),
oper_date TIMESTAMP, -- czas operacji
oper_type VARCHAR2(1),
oper_comment tab_VARRAY -- jakie rekordy zmienił
);
TRIGGER tak wygląda:
CREATE TYPE tab_VARRAY AS VARRAY(3) OF VARCHAR2(50);
/
show err
CREATE OR REPLACE TRIGGER emp_x
AFTER INSERT OR DELETE OR UPDATE
ON employess
FOR EACH ROW
DECLARE
v_oper VARCHAR2(1);
TYPE tab_VARRAY IS VARRAY(3) OF VARCHAR2(50);
tab_VAR tab_VARRAY := tab_VARRAY(NULL,NULL,NULL);
i number(5);
BEGIN
IF INSERTING THEN v_oper := 'I';
ELSIF UPDATING THEN v_oper := 'U';
ELSIF DELETING THEN v_oper := 'D';
END IF;
if :new.id IS NOT NULL THEN tab_VAR(1):=('id'); end if;-- tu mi zapisuje jak insert into .. i że dodałam ten rekord do tab.emp_monit
if :new.first_name IS NOT NULL THEN tab_VAR(2):=('first_name'); end if;-- działa jak wyżej :)
if :new.last_name IS NOT NULL THEN tab_VAR(3):=('last_name'); end if; -- działa jak wyżej :)
INSERT INTO emp_monit VALUES (:new.id, user, systimestamp, v_oper, tab_VARRAY(tab_VAR(1),tab_VAR(2),tab_VAR(3)));
END;
/
show err
Uprawnienia mam nadane, bo mi usuwa, dodaje i zmienia dane na innych tabelach tego samego użytkownika. Tylko stoję z tym upload . Próbowałam tak:
- if :new.id IS NOT NULL or :new.id != :old.id THEN tab_VAR(1):=('id'); end if
- ELSIF UPDATING and :new.id != :old.id THEN v_oper := 'U' and tab_VAR(1):=('id');
ale nie działa. Proszę uprzejmie o jakąś wskazówkę ... jak zapisać, który jest rekord z tab. employess został zmieniany do tabeli emp_monit