extracted objects

This commit is contained in:
2025-12-17 13:02:12 +01:00
commit 7dd4ea08e1
195 changed files with 70591 additions and 0 deletions

View File

@@ -0,0 +1,31 @@
# ADD_COD_STEP
## Informazioni
- **Tabella**: TB_TIPI_MAT
- **Evento**: INSERT
- **Tipo**: BEFORE EACH ROW
- **Stato**: ENABLED
## Codice Sorgente
```sql
TRIGGER "APOLLINARECATERINGPROD"."ADD_COD_STEP"
BEFORE INSERT ON TB_TIPI_MAT
FOR EACH ROW
BEGIN
<<COLUMN_SEQUENCES>>
BEGIN
IF INSERTING AND :NEW.cod_step IS NULL THEN
select max(cod_step)+1
into :NEW.cod_step
from tb_tipi_mat
where cod_step not in (9999999, -1, 0);
END IF;
END COLUMN_SEQUENCES;
END;
```

View File

@@ -0,0 +1,28 @@
# ARTICOLI_DET_REGOLE_TRG
## Informazioni
- **Tabella**: ARTICOLI_DET_REGOLE
- **Evento**: INSERT
- **Tipo**: BEFORE EACH ROW
- **Stato**: ENABLED
## Codice Sorgente
```sql
TRIGGER "APOLLINARECATERINGPROD"."ARTICOLI_DET_REGOLE_TRG"
BEFORE INSERT ON ARTICOLI_DET_REGOLE
FOR EACH ROW
BEGIN
<<COLUMN_SEQUENCES>>
BEGIN
IF INSERTING AND :NEW.ID IS NULL THEN
SELECT ARTICOLI_DET_REGOLE_SEQ.NEXTVAL INTO :NEW.ID FROM SYS.DUAL;
END IF;
END COLUMN_SEQUENCES;
END;
```

View File

@@ -0,0 +1,21 @@
# BI_GL_SCHEMA_CHANGES
## Informazioni
- **Tabella**: GL_SCHEMA_CHANGES
- **Evento**: INSERT
- **Tipo**: BEFORE EACH ROW
- **Stato**: ENABLED
## Codice Sorgente
```sql
TRIGGER "APOLLINARECATERINGPROD"."BI_GL_SCHEMA_CHANGES"
before insert on gl_schema_changes
for each row
BEGIN
select gl_schema_changes_seq.nextval into :new.id from dual;
:NEW.VERSION_NAME := :NEW.VYEAR||'.'||:NEW.VMONTH||'.'||:NEW.VMAJOR||'.'||:NEW.VMINOR||:NEW.VTYPE;
end;
```

View File

@@ -0,0 +1,27 @@
# CLIENTI_TRG
## Informazioni
- **Tabella**: CLIENTI
- **Evento**: INSERT
- **Tipo**: BEFORE EACH ROW
- **Stato**: ENABLED
## Codice Sorgente
```sql
TRIGGER "APOLLINARECATERINGPROD"."CLIENTI_TRG"
BEFORE INSERT ON CLIENTI
FOR EACH ROW
BEGIN
<<COLUMN_SEQUENCES>>
BEGIN
IF INSERTING AND :NEW.ID IS NULL THEN
SELECT CLIENTI_SEQ2.NEXTVAL INTO :NEW.ID FROM SYS.DUAL;
END IF;
END COLUMN_SEQUENCES;
END;
```

View File

@@ -0,0 +1,22 @@
# EVENTI_ACCONTI_TRG
## Informazioni
- **Tabella**: EVENTI_ACCONTI
- **Evento**: INSERT
- **Tipo**: BEFORE EACH ROW
- **Stato**: ENABLED
## Codice Sorgente
```sql
TRIGGER "APOLLINARECATERINGPROD"."EVENTI_ACCONTI_TRG"
BEFORE INSERT ON EVENTI_ACCONTI
FOR EACH ROW
BEGIN
IF INSERTING AND :NEW.ID IS NULL THEN
SELECT EVENTI_ACCONTI_SEQ.NEXTVAL INTO :NEW.ID FROM SYS.DUAL;
END IF;
END;
```

View File

@@ -0,0 +1,42 @@
# EVENTI_AI_TRG
## Informazioni
- **Tabella**: EVENTI
- **Evento**: INSERT
- **Tipo**: AFTER EACH ROW
- **Stato**: ENABLED
## Codice Sorgente
```sql
TRIGGER "APOLLINARECATERINGPROD"."EVENTI_AI_TRG"
AFTER INSERT ON EVENTI
FOR EACH ROW
BEGIN
if inserting then
-- execute immediate 'alter trigger "APCB"."EVENTI_DET_OSPITI_TRG_AI" disable';
--default su righe ospiti
INSERT INTO eventi_det_ospiti (
id_evento,
cod_tipo_ospite,
numero,
note,
ordine
)
SELECT :NEW.ID, 5, 0, '', 2 FROM DUAL
UNION
SELECT :NEW.ID, 6, 0, '', 3 FROM DUAL
UNION
SELECT :NEW.ID, 7, 0, '', 4 FROM DUAL
UNION
SELECT :NEW.ID, 8, 0, '', 1 FROM DUAL;
end if;
END;
```

View File

@@ -0,0 +1,27 @@
# EVENTI_ALLEG_TRG
## Informazioni
- **Tabella**: EVENTI_ALLEG
- **Evento**: INSERT
- **Tipo**: BEFORE EACH ROW
- **Stato**: ENABLED
## Codice Sorgente
```sql
TRIGGER "APOLLINARECATERINGPROD"."EVENTI_ALLEG_TRG"
BEFORE INSERT ON EVENTI_ALLEG
FOR EACH ROW
BEGIN
<<COLUMN_SEQUENCES>>
BEGIN
IF INSERTING AND :NEW.ID IS NULL THEN
SELECT EVENTI_ALLEG_SEQ.NEXTVAL INTO :NEW.ID FROM SYS.DUAL;
END IF;
END COLUMN_SEQUENCES;
END;
```

View File

@@ -0,0 +1,22 @@
# EVENTI_ALTRICOSTI_TRG
## Informazioni
- **Tabella**: EVENTI_ALTRICOSTI
- **Evento**: INSERT
- **Tipo**: BEFORE EACH ROW
- **Stato**: ENABLED
## Codice Sorgente
```sql
TRIGGER "APOLLINARECATERINGPROD"."EVENTI_ALTRICOSTI_TRG"
BEFORE INSERT ON eventi_altricosti
FOR EACH ROW
BEGIN
IF INSERTING AND :NEW.ID IS NULL THEN
SELECT eventi_altricosti_seq.NEXTVAL INTO :NEW.ID FROM SYS.DUAL;
END IF;
END;
```

View File

@@ -0,0 +1,27 @@
# EVENTI_DET_DEGUST_TRG
## Informazioni
- **Tabella**: EVENTI_DET_DEGUST
- **Evento**: INSERT
- **Tipo**: BEFORE EACH ROW
- **Stato**: ENABLED
## Codice Sorgente
```sql
TRIGGER "APOLLINARECATERINGPROD"."EVENTI_DET_DEGUST_TRG"
BEFORE INSERT ON EVENTI_DET_DEGUST
FOR EACH ROW
BEGIN
<<COLUMN_SEQUENCES>>
BEGIN
IF INSERTING AND :NEW.ID IS NULL THEN
SELECT EVENTI_DET_DEGUST_SEQ.NEXTVAL INTO :NEW.ID FROM SYS.DUAL;
END IF;
END COLUMN_SEQUENCES;
END;
```

View File

@@ -0,0 +1,65 @@
# EVENTI_DET_OSPITI_TRG_AI
## Informazioni
- **Tabella**: EVENTI_DET_OSPITI
- **Evento**: UPDATE
- **Tipo**: AFTER EACH ROW
- **Stato**: ENABLED
## Codice Sorgente
```sql
TRIGGER "APOLLINARECATERINGPROD"."EVENTI_DET_OSPITI_TRG_AI"
--AFTER INSERT OR UPDATE OR DELETE ON EVENTI_DET_OSPITI
AFTER UPDATE ON EVENTI_DET_OSPITI
FOR EACH ROW
-- solo update, tutti i tipi ospiti vengono inseriti con l'inserimento della testata dell'evento con QTA def = 0
declare
v_cod_art varchar2(10);
v_coeff number;
v_ospiti number;
v_azione varchar2(10);
v_id_evento number;
v_count number;
BEGIN
v_azione := '';
v_id_evento := nvl(:NEW.ID_EVENTO,:OLD.ID_EVENTO);
--RAISE_APPLICATION_ERROR(-20001,'ididididididid: ' + to_char('hhhhhhhhhhh') );
if DELETING THEN
--RAISE_APPLICATION_ERROR(-20000, ':NEW.NUMERO' || :NEW.NUMERO || ':OLD.NUMERO' || :OLD.NUMERO);
v_azione := 'DELETE';
v_id_evento := :OLD.ID_EVENTO;
elsif INSERTING THEN
v_azione := 'INSERT';
v_id_evento := :NEW.ID_EVENTO;
END IF;
--/*
--Controllo esistenza id testata (caso default righe dett)
-- v_count := 0;
-- select count(*) into v_count
-- from eventi where id = :NEW.ID_EVENTO;
-- if v_count > 0 then
--RAISE_APPLICATION_ERROR(-20000,'id: ' + to_char(v_id_evento) + ' :NEW.NUMERO' || to_char(:NEW.NUMERO) || ' :OLD.NUMERO' || to_char(:OLD.NUMERO) + ' azione: ' + v_azione);
--Calcola la qta tot ospiti di Testata:
--EVENTI_AGGIORNA_N_OSPITI(v_id_evento,:NEW.NUMERO,:OLD.NUMERO,v_azione);
-- end if;
--*/
exception when others
then
RAISE_APPLICATION_ERROR(-20000, 'Errore: ' || SQLCODE || ' - ' || SUBSTR(SQLERRM, 1 , 64));
END;
```

View File

@@ -0,0 +1,32 @@
# EVENTI_DET_PREL_QTA_TOT_TRG
## Informazioni
- **Tabella**: EVENTI_DET_PREL
- **Evento**: UPDATE
- **Tipo**: BEFORE EACH ROW
- **Stato**: ENABLED
## Codice Sorgente
```sql
TRIGGER "APOLLINARECATERINGPROD"."EVENTI_DET_PREL_QTA_TOT_TRG"
BEFORE UPDATE ON EVENTI_DET_PREL
FOR EACH ROW
BEGIN
:NEW.QTA := :NEW.QTA_APE + :NEW.QTA_SEDU + :NEW.QTA_BUFDOL + :NEW.QTA_MAN_APE + :NEW.QTA_MAN_SEDU + :NEW.QTA_MAN_BUFDOL;
exception when others
then
RAISE_APPLICATION_ERROR(-20000, 'Errore in aggiornamento QTA da prelevare: ' || SQLCODE || ' - ' || SUBSTR(SQLERRM, 1 , 64));
return;
END;
```

View File

@@ -0,0 +1,23 @@
# EVENTI_DET_PREL_TRG
## Informazioni
- **Tabella**: EVENTI_DET_PREL
- **Evento**: INSERT
- **Tipo**: BEFORE EACH ROW
- **Stato**: ENABLED
## Codice Sorgente
```sql
TRIGGER "APOLLINARECATERINGPROD"."EVENTI_DET_PREL_TRG"
before INSERT ON EVENTI_DET_PREL
FOR EACH ROW
declare
BEGIN
IF INSERTING THEN
SELECT EVENTI_DET_PREL_SEQ.NEXTVAL INTO :NEW.ID FROM SYS.DUAL;
END IF;
END;
```

View File

@@ -0,0 +1,49 @@
# EVENTI_DET_RIS_TRG
## Informazioni
- **Tabella**: EVENTI_DET_RIS
- **Evento**: INSERT
- **Tipo**: BEFORE EACH ROW
- **Stato**: ENABLED
## Codice Sorgente
```sql
TRIGGER "APOLLINARECATERINGPROD"."EVENTI_DET_RIS_TRG"
BEFORE INSERT ON EVENTI_DET_RIS
FOR EACH ROW
DECLARE
v_costo_orario number;
v_costo_prestazione number;
BEGIN
<<COLUMN_SEQUENCES>>
BEGIN
IF INSERTING AND :NEW.ID IS NULL THEN
SELECT EVENTI_DET_RIS_SEQ.NEXTVAL INTO :NEW.ID FROM SYS.DUAL;
END IF;
END COLUMN_SEQUENCES;
/*
--default su costo
begin
select nvl(costo_orario,0), nvl(costo_prestazione,0)
into v_costo_orario, v_costo_prestazione
from risorse r
where r.id = :NEW.ID_RISORSA;
:NEW.COSTO := :NEW.ORE_LAV * v_costo_orario;
exception when others
then RAISE_APPLICATION_ERROR(-20000, 'Errore: Inserimento costo risorsa');
end;
*/
END;
```

View File

@@ -0,0 +1,34 @@
# EVENTI_TRG
## Informazioni
- **Tabella**: EVENTI
- **Evento**: INSERT
- **Tipo**: BEFORE EACH ROW
- **Stato**: ENABLED
## Codice Sorgente
```sql
TRIGGER "EVENTI_TRG"
BEFORE INSERT ON EVENTI
FOR EACH ROW
BEGIN
IF INSERTING THEN
SELECT EVENTI_SEQ.NEXTVAL INTO :NEW.ID FROM SYS.DUAL;
END IF;
if inserting or updating then
--aggiornamento data_doc (data redazione)
:NEW.DATA_DOC := sysdate;
end if;
if inserting THEN
:NEW.STATO := nvl(:NEW.STATO, 100);
IF nvl(:NEW.vers_number, 0) = 0 THEN
:NEW.vers_token := DBMS_RANDOM.STRING ('A' , DBMS_RANDOM.VALUE (64, 255));
END IF;
end if;
END;
```

View File

@@ -0,0 +1,27 @@
# LOCATION_TRG
## Informazioni
- **Tabella**: LOCATION
- **Evento**: INSERT
- **Tipo**: BEFORE EACH ROW
- **Stato**: ENABLED
## Codice Sorgente
```sql
TRIGGER "APOLLINARECATERINGPROD"."LOCATION_TRG"
BEFORE INSERT ON LOCATION
FOR EACH ROW
BEGIN
<<COLUMN_SEQUENCES>>
BEGIN
IF INSERTING AND :NEW.ID IS NULL THEN
SELECT LOCATION_SEQ.NEXTVAL INTO :NEW.ID FROM SYS.DUAL;
END IF;
END COLUMN_SEQUENCES;
END;
```

View File

@@ -0,0 +1,33 @@
# ON_DELETE_REORDER
## Informazioni
- **Tabella**: TB_TIPI_MAT
- **Evento**: DELETE
- **Tipo**: AFTER EACH ROW
- **Stato**: DISABLED
## Codice Sorgente
```sql
TRIGGER "APOLLINARECATERINGPROD"."ON_DELETE_REORDER"
after DELETE ON TB_TIPI_MAT
FOR EACH ROW
BEGIN
FOR TP IN (
SELECT COD_TIPO, COD_STEP - 1 AS COD_STEP_NEW
FROM TB_TIPI_MAT T
WHERE COD_STEP > :OLD.COD_STEP
AND COD_STEP NOT IN (-2, -1, 0, 9999999)
)LOOP
UPDATE TB_TIPI_MAT
SET COD_STEP = TP.COD_STEP_NEW
WHERE COD_TIPO = TP.COD_TIPO;
END LOOP;
END;
```

173
docs/triggers/README.md Normal file
View File

@@ -0,0 +1,173 @@
# Triggers Database
Questa cartella contiene la documentazione di tutti i 19 triggers del database (esclusi quelli di sistema APEX).
## Triggers Generazione ID
Questi triggers generano automaticamente gli ID tramite sequence.
| Trigger | Tabella | Sequence | Evento |
|---------|---------|----------|--------|
| [EVENTI_TRG](EVENTI_TRG.md) | EVENTI | EVENTI_SEQ | BEFORE INSERT |
| [EVENTI_DET_PREL_TRG](EVENTI_DET_PREL_TRG.md) | EVENTI_DET_PREL | EVENTI_DET_PREL_SEQ | BEFORE INSERT |
| [EVENTI_DET_RIS_TRG](EVENTI_DET_RIS_TRG.md) | EVENTI_DET_RIS | EVENTI_DET_RIS_SEQ | BEFORE INSERT |
| [EVENTI_DET_DEGUST_TRG](EVENTI_DET_DEGUST_TRG.md) | EVENTI_DET_DEGUST | EVENTI_DET_DEGUST_SEQ | BEFORE INSERT |
| [EVENTI_ACCONTI_TRG](EVENTI_ACCONTI_TRG.md) | EVENTI_ACCONTI | EVENTI_ACCONTI_SEQ | BEFORE INSERT |
| [EVENTI_ALTRICOSTI_TRG](EVENTI_ALTRICOSTI_TRG.md) | EVENTI_ALTRICOSTI | EVENTI_ALTRICOSTI_SEQ | BEFORE INSERT |
| [EVENTI_ALLEG_TRG](EVENTI_ALLEG_TRG.md) | EVENTI_ALLEG | EVENTI_ALLEG_SEQ | BEFORE INSERT |
| [CLIENTI_TRG](CLIENTI_TRG.md) | CLIENTI | CLIENTI_SEQ2 | BEFORE INSERT |
| [LOCATION_TRG](LOCATION_TRG.md) | LOCATION | LOCATION_SEQ | BEFORE INSERT |
| [RISORSE_TRG](RISORSE_TRG.md) | RISORSE | RISORSE_SEQ | BEFORE INSERT |
| [ARTICOLI_DET_REGOLE_TRG](ARTICOLI_DET_REGOLE_TRG.md) | ARTICOLI_DET_REGOLE | ARTICOLI_DET_REGOLE_SEQ | BEFORE INSERT |
| [TB_TIPI_PASTO_TRG](TB_TIPI_PASTO_TRG.md) | TB_TIPI_PASTO | TB_TIPI_PASTO_SEQ | BEFORE INSERT |
## Triggers Business Logic
| Trigger | Tabella | Descrizione |
|---------|---------|-------------|
| [EVENTI_TRG](EVENTI_TRG.md) | EVENTI | Inizializza STATO=100, DATA_DOC, VERS_TOKEN |
| [EVENTI_AI_TRG](EVENTI_AI_TRG.md) | EVENTI | Crea 4 record ospiti default (AFTER INSERT) |
| [EVENTI_DET_OSPITI_TRG_AI](EVENTI_DET_OSPITI_TRG_AI.md) | EVENTI_DET_OSPITI | Gestione aggiornamento ospiti |
| [EVENTI_DET_PREL_QTA_TOT_TRG](EVENTI_DET_PREL_QTA_TOT_TRG.md) | EVENTI_DET_PREL | Calcola QTA totale su UPDATE |
## Triggers Ordinamento
| Trigger | Tabella | Descrizione |
|---------|---------|-------------|
| [ADD_COD_STEP](ADD_COD_STEP.md) | TB_TIPI_MAT | Assegna COD_STEP progressivo |
| [ON_DELETE_REORDER](ON_DELETE_REORDER.md) | TB_TIPI_MAT | Riordina COD_STEP dopo DELETE |
## Triggers Sistema
| Trigger | Tabella | Descrizione |
|---------|---------|-------------|
| [BI_GL_SCHEMA_CHANGES](BI_GL_SCHEMA_CHANGES.md) | GL_SCHEMA_CHANGES | Log modifiche schema |
| [XLIB_LOGS_BI_TRG](XLIB_LOGS_BI_TRG.md) | XLIB_LOGS | Timestamp log |
## Dettaglio Triggers Critici
### EVENTI_TRG
```sql
BEFORE INSERT ON EVENTI FOR EACH ROW
```
**Logica:**
1. Genera ID da sequence
2. Imposta `DATA_DOC = SYSDATE`
3. Se INSERT:
- `STATO = NVL(:NEW.STATO, 100)`
- Se `VERS_NUMBER = 0`: genera `VERS_TOKEN` random
### EVENTI_AI_TRG
```sql
AFTER INSERT ON EVENTI FOR EACH ROW
```
**Logica:**
Inserisce automaticamente i 4 tipi ospiti:
- COD_TIPO_OSPITE = 8 (Adulti), ORDINE = 1
- COD_TIPO_OSPITE = 5 (Kinder), ORDINE = 2
- COD_TIPO_OSPITE = 6 (Baby), ORDINE = 3
- COD_TIPO_OSPITE = 7 (Staff), ORDINE = 4
### EVENTI_DET_PREL_QTA_TOT_TRG
```sql
BEFORE UPDATE ON EVENTI_DET_PREL FOR EACH ROW
```
**Logica:**
```sql
:NEW.QTA := :NEW.QTA_APE + :NEW.QTA_SEDU + :NEW.QTA_BUFDOL
+ :NEW.QTA_MAN_APE + :NEW.QTA_MAN_SEDU + :NEW.QTA_MAN_BUFDOL
```
## Migrazione .NET
### Sostituzione Sequence → Identity
```csharp
// Entity Framework Configuration
modelBuilder.Entity<Evento>()
.Property(e => e.Id)
.UseIdentityColumn();
```
### Sostituzione Trigger → SaveChanges Interceptor
```csharp
public class EventiSaveChangesInterceptor : SaveChangesInterceptor
{
public override ValueTask<InterceptionResult<int>> SavingChangesAsync(
DbContextEventData eventData,
InterceptionResult<int> result,
CancellationToken cancellationToken = default)
{
var context = eventData.Context;
foreach (var entry in context.ChangeTracker.Entries<Evento>())
{
if (entry.State == EntityState.Added)
{
// Logica EVENTI_TRG
entry.Entity.Stato ??= 100;
entry.Entity.DataDoc = DateTime.Now;
if (entry.Entity.VersNumber == 0)
{
entry.Entity.VersToken = GenerateRandomToken();
}
}
else if (entry.State == EntityState.Modified)
{
entry.Entity.DataDoc = DateTime.Now;
}
}
// Logica EVENTI_DET_PREL_QTA_TOT_TRG
foreach (var entry in context.ChangeTracker.Entries<EventiDetPrel>())
{
if (entry.State == EntityState.Modified || entry.State == EntityState.Added)
{
entry.Entity.Qta = entry.Entity.CalcolaQuantitaTotale();
}
}
return base.SavingChangesAsync(eventData, result, cancellationToken);
}
}
```
### Creazione Ospiti Default
```csharp
public override async Task<int> SaveChangesAsync(CancellationToken ct = default)
{
var newEvents = ChangeTracker.Entries<Evento>()
.Where(e => e.State == EntityState.Added)
.Select(e => e.Entity)
.ToList();
var result = await base.SaveChangesAsync(ct);
// Logica EVENTI_AI_TRG
foreach (var evento in newEvents)
{
var tipiOspiti = new[] { (8, 1), (5, 2), (6, 3), (7, 4) };
foreach (var (tipo, ordine) in tipiOspiti)
{
EventiDetOspiti.Add(new EventiDetOspiti
{
IdEvento = evento.Id,
CodTipoOspite = tipo.ToString(),
Numero = 0,
Ordine = ordine
});
}
await base.SaveChangesAsync(ct);
}
return result;
}
```

View File

@@ -0,0 +1,27 @@
# RISORSE_TRG
## Informazioni
- **Tabella**: RISORSE
- **Evento**: INSERT
- **Tipo**: BEFORE EACH ROW
- **Stato**: ENABLED
## Codice Sorgente
```sql
TRIGGER "APOLLINARECATERINGPROD"."RISORSE_TRG"
BEFORE INSERT ON RISORSE
FOR EACH ROW
BEGIN
<<COLUMN_SEQUENCES>>
BEGIN
IF INSERTING AND :NEW.ID IS NULL THEN
SELECT RISORSE_SEQ.NEXTVAL INTO :NEW.ID FROM SYS.DUAL;
END IF;
END COLUMN_SEQUENCES;
END;
```

View File

@@ -0,0 +1,21 @@
# TB_TIPI_PASTO_TRG
## Informazioni
- **Tabella**: TB_TIPI_PASTO
- **Evento**: INSERT
- **Tipo**: BEFORE EACH ROW
- **Stato**: ENABLED
## Codice Sorgente
```sql
TRIGGER TB_TIPI_PASTO_TRG
BEFORE INSERT ON TB_TIPI_PASTO
FOR EACH ROW
BEGIN
IF INSERTING AND :NEW.ID IS NULL THEN
SELECT TB_TIPI_PASTO_SEQ.NEXTVAL INTO :NEW.ID FROM SYS.DUAL;
END IF;
END;
```

View File

@@ -0,0 +1,28 @@
# XLIB_LOGS_BI_TRG
## Informazioni
- **Tabella**: XLIB_LOGS
- **Evento**: INSERT
- **Tipo**: BEFORE EACH ROW
- **Stato**: ENABLED
## Codice Sorgente
```sql
TRIGGER "APOLLINARECATERINGPROD"."XLIB_LOGS_BI_TRG"
BEFORE INSERT
ON XLIB_LOGS
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
IF :NEW.log_id IS NULL
THEN
SELECT XLIB_SEQ.NEXTVAL
INTO :NEW.log_id
FROM DUAL;
END IF;
END;
```