Vorlage: create table + trigger + sequence (Oracle)

Wenn ich die Wahl habe, erstelle ich eine Tabelle in Oracle-Datenbanken mit folgender Grundstruktur:

create table NEW_TABLE (
    id number not null 
  , my_column varchar2(200)
  , created_on date 
  , created_by varchar2(200)
  , updated_on date 
  , updated_by varchar2(200) 
);

create unique index NEW_TABLE_pk on NEW_TABLE (id asc);

alter table NEW_TABLE
add constraint NEW_TABLE_pk primary key (id)
using index NEW_TABLE_pk enable;


create sequence NEW_TABLE_seq increment by 1;


create or replace trigger NEW_TABLE_trg 
    before insert or update on NEW_TABLE
    for each row
declare
    v_user varchar2(200);
begin
    v_user := coalesce(
                sys_context('apex$session', 'app_user'), 
                sys_context('userenv', 'os_user'), 
                sys_context('userenv', 'session_user') );
    if inserting then
        if :new.id is null then
            :new.id := NEW_TABLE_seq.nextval; 
        end if;
       :new.created_on := sysdate;
       :new.created_by := v_user;
       :new.updated_on := sysdate;
       :new.updated_by := v_user;
    end if;
    if updating then
        :new.updated_on := sysdate;
        :new.updated_by := v_user;
    end if;
end; 
/

alter trigger NEW_TABLE_trg enable;

Außer Primärschlüssel und einer „normalen“ Datenspalte sind in dieser Struktur auch vier Auditspalten enthalten, die den Benutzer und den Zeitpunkt der initialen Erstellung und der letzten Änderungen enthalten. Gefüllt werden diese automatisch per Trigger.

Der Trigger versucht sich den Benutzernamen aus verschiedenen Ebenen zu holen: APEX-, Betriebssystem- oder Datenbank-User.

Natürlich hat man nicht immer die Wahl, dieses Vorgehen zu verwenden. Wenn Standards beim Kunden vor Ort etabliert sind, dann sollte man sich in diesen Fällen besser daran halten und Verbesserungsvorschläge nennen.

Habt ihr ebenfalls euer Template geschaffen? Was macht ihr dabei anders? Rückmeldungen gerne per Kommentar.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.