2017-06-28 2 views
-1

Ich versuche, einen Trigger zu erstellen, der alle neuen und alten Spalten oder jede Zeile aktualisiert, eingefügte prüft. Hier ist die TabelleAudit-Trail mit Oracle-Trigger erstellen

ID NUMBER(10,0) No  1 
ENTITY_ID NUMBER(10,0) No  2 
LOCATION_ID NUMBER(10,0) Yes  3 
NAME VARCHAR2(128 CHAR) No  4 
CREATED_BY VARCHAR2(255 CHAR) No 'unknown' 5 
UPDATED_BY VARCHAR2(255 CHAR) No 'unknown' 6 
TS_CREATED TIMESTAMP(6) No "SYSTIMESTAMP 
    " 7 

Ich bin mir nicht sicher, wie man den Auslöser schreibt.

CREATE OR REPLACE TRIGGER audit_security_zones 
    BEFORE DELETE OR INSERT OR UPDATE ON security_zones 
    FOR EACH ROW 
DECLARE 

BEGIN 

END; 

Ich möchte auch Client-ID senbt aus der Anwendung verwenden. Hier ist meine Audit-Trail-Tabelle.

ID NUMBER(10,0) No  1 
ACTION VARCHAR2(20 BYTE) Yes  2 
TABLE_ID VARCHAR2(100 BYTE) Yes  3 
OLD_VALUE VARCHAR2(1000 BYTE) Yes  4 
NEW_VALUE VARCHAR2(1000 BYTE) Yes  5 
USERNAME VARCHAR2(100 BYTE) Yes  6 
TS_UPDATED TIMESTAMP(6) No systimestamp 7 

Ist dies ein guter Weg, dies zu tun? Ich werde dann eine Ansicht für den Benutzer basierend auf jeder Tabelle rendern, um ihnen zu zeigen, was sich geändert hat.

UPDATE

Ich versuche, etwas ähnlich der folgenden

CREATE OR REPLACE TRIGGER audit_security_zones 
    BEFORE DELETE OR INSERT OR UPDATE ON security_zones 
    FOR EACH ROW 
DECLARE 
    var_action CHAR(1); 
BEGIN 
    IF INSERTING THEN var_action := 'INSERT'; 
    ELSIF UPDATING THEN var_action := 'UPDATE'; 
    ELSE    var_action := 'DELETE'; 
    END IF; 

    /* loop eahc column in the update or insert or delete statement executed */ 
    for each col in stmt/row{ 
    INSERT INTO audit_table 
    (
    ACTION, 
    TABLE_ID, 
    OLD_VALUE, 
    NEW_VALUE, 
    USERNAME, 
    TS_CREATED 
    ) VALUES (
    var_action, 
    :OLD.ID, 
    :OLD.columnVALUE, 
    :new.COLUMNVALUE, 
    ociidentifier, 
    systimestamp 
    ) 
    } 
END; 

UPDATE2

CREATE OR REPLACE TRIGGER audit_security_zones 
    BEFORE DELETE OR INSERT OR UPDATE ON security_zones 
    FOR EACH ROW 
DECLARE 
    var_action CHAR(6); 
BEGIN 
    IF INSERTING THEN var_action := 'INSERT'; 
    ELSIF UPDATING THEN var_action := 'UPDATE'; 
    ELSE    var_action := 'DELETE'; 
    END IF; 

    IF var_action = 'DELETE' THEN 
     INSERT INTO audit_table 
     (
      ACTION, 
      USERNAME, 
      ID, 
      O_ENTITY_ID, 
      O_LOCATION_ID, 
      O_NAME, 
      O_CREATED_BY, 
      O_UPDATED_BY, 
      O_TS_CREATED    
     ) VALUES (
      var_action, 
      USERNAME, 
      :OLD.ID, 
      :OLD.ENTITY_ID, 
      :OLD.LOCATION_ID, 
      :OLD.NAME, 
      :OLD.CREATED_BY, 
      :OLD.UPDATED_BY, 
      :OLD.TS_CREATED   
     ); 
    ELSEIF var_action = 'INSERT' THEN 
     INSERT INTO audit_table 
     (
      ACTION, 
      USERNAME, 
      ID,   
      N_ENTITY_ID, 
      N_LOCATION_ID, 
      N_NAME, 
      N_CREATED_BY, 
      N_UPDATED_BY 
      N_TS_CREATED 
     ) VALUES (
      var_action, 
      USERNAME, 
      :NEW.ID,    
      :NEW.ENTITY_ID, 
      :NEW.LOCATION_ID, 
      :NEW.NAME, 
      :NEW.CREATED_BY, 
      :NEW.UPDATED_BY, 
      :NEW.TS_CREATED 
     ); 
    ELSEIF var_action = 'UPDATE' THEN 
     INSERT INTO audit_table 
     (
      ACTION, 
      USERNAME, 
      ID, 
      O_ENTITY_ID, 
      O_LOCATION_ID, 
      O_NAME, 
      O_CREATED_BY, 
      O_UPDATED_BY, 
      O_TS_CREATED, 
      N_ENTITY_ID, 
      N_LOCATION_ID, 
      N_NAME, 
      N_CREATED_BY, 
      N_UPDATED_BY 
      N_TS_CREATED 
     ) VALUES (
      var_action, 
      USERNAME, 
      :OLD.ID, 
      :OLD.ENTITY_ID, 
      :OLD.LOCATION_ID, 
      :OLD.NAME, 
      :OLD.CREATED_BY, 
      :OLD.UPDATED_BY, 
      :OLD.TS_CREATED, 
      :NEW.ENTITY_ID, 
      :NEW.LOCATION_ID, 
      :NEW.NAME, 
      :NEW.CREATED_BY, 
      :NEW.UPDATED_BY, 
      :NEW.TS_CREATED 
     ); 
    END IF; 
END; 

I

die folgenden Fehler erhalten zu erreichen
Error(31,9): PLS-00103: Encountered the symbol "VAR_ACTION" when expecting one of the following:  := . (@ % ; 
Error(42,4): PLS-00103: Encountered the symbol "N_TS_CREATED" when expecting one of the following:  .) , @ The symbol "." was substituted for "N_TS_CREATED" to continue. 
Error(54,12): PLS-00103: Encountered the symbol "VAR_ACTION" when expecting one of the following:  := . (@ % ; 
Error(71,4): PLS-00103: Encountered the symbol "N_TS_CREATED" when expecting one of the following:  .) , @ The symbol "." was substituted for "N_TS_CREATED" to continue. 
Error(90,4): PLS-00103: Encountered the symbol ";" when expecting one of the following:  if 

UPDATE3

CREATE OR REPLACE TRIGGER audit_security_zones 
    BEFORE DELETE OR INSERT OR UPDATE ON security_zones 
    FOR EACH ROW 
DECLARE 
    var_action CHAR(6); 
BEGIN 
    IF INSERTING THEN var_action := 'INSERT'; 
    ELSIF UPDATING THEN var_action := 'UPDATE'; 
    ELSE    var_action := 'DELETE'; 
    END IF; 

    IF var_action = 'DELETE' THEN 
     INSERT INTO audit_table 
     (
      ACTION, 
      USERNAME, 
      ID, 
      O_ENTITY_ID, 
      O_LOCATION_ID, 
      O_NAME, 
      O_CREATED_BY, 
      O_UPDATED_BY, 
      O_TS_CREATED    
     ) VALUES (
      var_action, 
      USERNAME, 
      :OLD.ID, 
      :OLD.ENTITY_ID, 
      :OLD.LOCATION_ID, 
      :OLD.NAME, 
      :OLD.CREATED_BY, 
      :OLD.UPDATED_BY, 
      :OLD.TS_CREATED   
     ); 
    ELSE IF var_action = 'INSERT' THEN 
     INSERT INTO audit_table 
     (
      ACTION, 
      USERNAME, 
      ID,   
      N_ENTITY_ID, 
      N_LOCATION_ID, 
      N_NAME, 
      N_CREATED_BY, 
      N_UPDATED_BY, 
      N_TS_CREATED 
     ) VALUES (
      var_action, 
      USERNAME, 
      :NEW.ID,    
      :NEW.ENTITY_ID, 
      :NEW.LOCATION_ID, 
      :NEW.NAME, 
      :NEW.CREATED_BY, 
      :NEW.UPDATED_BY, 
      :NEW.TS_CREATED 
     ); 
    ELSE IF var_action = 'UPDATE' THEN 
     INSERT INTO audit_table 
     (
      ACTION, 
      USERNAME, 
      ID, 
      O_ENTITY_ID, 
      O_LOCATION_ID, 
      O_NAME, 
      O_CREATED_BY, 
      O_UPDATED_BY, 
      O_TS_CREATED, 
      N_ENTITY_ID, 
      N_LOCATION_ID, 
      N_NAME, 
      N_CREATED_BY, 
      N_UPDATED_BY, 
      N_TS_CREATED 
     ) VALUES (
      var_action, 
      USERNAME, 
      :OLD.ID, 
      :OLD.ENTITY_ID, 
      :OLD.LOCATION_ID, 
      :OLD.NAME, 
      :OLD.CREATED_BY, 
      :OLD.UPDATED_BY, 
      :OLD.TS_CREATED, 
      :NEW.ENTITY_ID, 
      :NEW.LOCATION_ID, 
      :NEW.NAME, 
      :NEW.CREATED_BY, 
      :NEW.UPDATED_BY, 
      :NEW.TS_CREATED 
     ); 
    END IF; 
END; 

Fehler i jetzt bekommen, ist

Error(90,4): PLS-00103: Encountered the symbol ";" when expecting one of the following:  if 

Update4

CREATE OR REPLACE TRIGGER audit_security_zones 
    BEFORE DELETE OR INSERT OR UPDATE ON security_zones 
    FOR EACH ROW 
DECLARE 
    var_action CHAR(6); 
BEGIN 
    IF INSERTING THEN var_action := 'INSERT'; 
    ELSIF UPDATING THEN var_action := 'UPDATE'; 
    ELSE    var_action := 'DELETE'; 
    END IF; 

    IF var_action = 'DELETE' THEN 
     INSERT INTO audit_table 
     (
      ACTION, 
      USERNAME, 
      ID, 
      O_ENTITY_ID, 
      O_LOCATION_ID, 
      O_NAME, 
      O_CREATED_BY, 
      O_UPDATED_BY, 
      O_TS_CREATED    
     ) VALUES (
      var_action, 
      'test', 
      :OLD.ID, 
      :OLD.ENTITY_ID, 
      :OLD.LOCATION_ID, 
      :OLD.NAME, 
      :OLD.CREATED_BY, 
      :OLD.UPDATED_BY, 
      :OLD.TS_CREATED   
     ); 
    ELSIF var_action = 'INSERT' THEN 
     INSERT INTO audit_table 
     (
      ACTION, 
      USERNAME, 
      ID,   
      N_ENTITY_ID, 
      N_LOCATION_ID, 
      N_NAME, 
      N_CREATED_BY, 
      N_UPDATED_BY, 
      N_TS_CREATED 
     ) VALUES (
      var_action, 
      'test', 
      :NEW.ID,    
      :NEW.ENTITY_ID, 
      :NEW.LOCATION_ID, 
      :NEW.NAME, 
      :NEW.CREATED_BY, 
      :NEW.UPDATED_BY, 
      :NEW.TS_CREATED 
     ); 
    ELSIF var_action = 'UPDATE' THEN 
     INSERT INTO audit_table 
     (
      ACTION, 
      USERNAME, 
      ID, 
      O_ENTITY_ID, 
      O_LOCATION_ID, 
      O_NAME, 
      O_CREATED_BY, 
      O_UPDATED_BY, 
      O_TS_CREATED, 
      N_ENTITY_ID, 
      N_LOCATION_ID, 
      N_NAME, 
      N_CREATED_BY, 
      N_UPDATED_BY, 
      N_TS_CREATED 
     ) VALUES (
      var_action, 
      'test', 
      :OLD.ID, 
      :OLD.ENTITY_ID, 
      :OLD.LOCATION_ID, 
      :OLD.NAME, 
      :OLD.CREATED_BY, 
      :OLD.UPDATED_BY, 
      :OLD.TS_CREATED, 
      :NEW.ENTITY_ID, 
      :NEW.LOCATION_ID, 
      :NEW.NAME, 
      :NEW.CREATED_BY, 
      :NEW.UPDATED_BY, 
      :NEW.TS_CREATED 
     ); 
    END IF; 
END; 

neuer Fehler i erhalten

012.351.
Error(9,3): PL/SQL: SQL Statement ignored 
Error(19,4): PL/SQL: ORA-00904: "O_TS_CREATED": invalid identifier 
Error(32,3): PL/SQL: SQL Statement ignored 
Error(42,4): PL/SQL: ORA-00904: "N_TS_CREATED": invalid identifier 
Error(55,9): PL/SQL: SQL Statement ignored 
Error(71,4): PL/SQL: ORA-00904: "N_TS_CREATED": invalid identifier 
+0

Siehe [diese Antwort] (https://stackoverflow.com/questions/20020020/basic-oracle-trigger-audit-table) für ein Beispiel eines Audit-Triggers. –

+0

Ich habe meine Frage – shorif2000

+1

aktualisiert Alles, was ich in UPDATE2 falsch sehen kann, ist ein fehlendes Komma in der letzten INSERT zwischen N_UPDATED_BY und N_TS_CREATED –

Antwort

1

Sie können nicht „Schleife“ durch das alte und neue Werte, müssen Sie explizit dh jedes Referenz

INSERT INTO audit_table 
    (
    ACTION, 
    TABLE_ID, 
    OLD_VALUE, 
    NEW_VALUE, 
    USERNAME, 
    TS_CREATED 
    ) VALUES (
    var_action, 
    :OLD.ID, 
    :OLD.column1VALUE, 
    :new.COLUMN1VALUE, 
    ociidentifier, 
    systimestamp 
    ); 
INSERT INTO audit_table 
    (
    ACTION, 
    TABLE_ID, 
    OLD_VALUE, 
    NEW_VALUE, 
    USERNAME, 
    TS_CREATED 
    ) VALUES (
    var_action, 
    :OLD.ID, 
    :OLD.column2VALUE, 
    :new.COLUMN2VALUE, 
    ociidentifier, 
    systimestamp 
    ); 
... etc. 

Sie können eventuell durch das Schreiben einer Prozedur den Code etwas vereinfachen, die INSERT-Anweisung wickeln und das oft anstelle der INSERT-Anweisung selbst aufrufen.

+0

Bitte siehe update2 – shorif2000