lunedì 14 gennaio 2013

Sql Trigger

Di seguito la versione SQL del trigger per l'assegnazione del registro iva nel campo CIG all'inserimento e variazione di un record di TESDOCUM.

CREATE  trigger TESDOCUM_TRG1 on TESDOCUM for INSERT, update
as
update TESDOCUM SET CIG=(select MAX(REGISTRIVA)  
                         from CAUSCONT
                         where CAUSCONTAB=CODICE
                           and NUMERO = ( select NUMERO FROM inserted) )
where NUMERO = ( select NUMERO FROM inserted)

venerdì 11 gennaio 2013

Oracle Trigger

Ieri mi sono trovato a dover fare un trigger su Oracle da zero e ho avuto qualche difficoltà sintattica e concettuale.

Dopo aver scritto il mio trigger e compilato correttamente, durante l'uso veniva generato un errore : 
ORA-04098: trigger name is invalid and failed re-validation. 
Poichè il trigger era compilato correttamente sono dovuto ricorrere al comando "show errors trigger trigger_name;" per avere ulteriori chiarimenti sull'errore.

Una volta risolto il primo problema questo era il corpo del trigger :
update TESDOCUM SET CIG=(select MAX(REGISTRIVA)  
                         from CAUSCONT
                         where CAUSCONTAB=CODICE

                           and NUMERO=:new.NUMERO)
where NUMERO=:new.NUMERO

Eseguendo il trigger sono incorso nell'errore
ORA-04091: table AM is mutating, trigger/function may not see it
Era un problema concettuale. Non si può cambiare utilizzare o modificare un record del database mentre lo stesso record è oggetto di trigger.
I database danno accesso ai dati in lettura/scrittura con degli alias.

Alla fine il trigger è il seguente:
create or replace trigger tesdocum_trg1
 before insert or update
on TESDOCUM
REFERENCING new AS new
FOR EACH ROW
WHEN (NEW.CAUSCONTAB IS NOT NULL)
begin

select MAX(REGISTRIVA) into :new.CIG
  from CAUSCONT
 where :new.CAUSCONTAB=CODICE;


end tesdocum_trg1;

martedì 8 gennaio 2013

Variabili di configurazione database DB2

Dopo l'installazione di DB2 è necessario modificare dei valori di configurazione
I seguenti valori sono per le versioni di DB2 antecedenti alla 9


db2 update dbm cfg using QUERY_HEAP_SZ 1000 

db2 update db cfg for DITTA1 using APPLHEAPSZ 512
db2 update db cfg for DITTA1 using PCKCACHESZ 128 
db2 update db cfg for DITTA1 using BUFFPAGE 1024 
db2 update db cfg for DITTA1 using NUM_IOCLEANERS 3 
db2 update db cfg for DITTA1 using NUM_IOSERVERS 9 
db2 update db cfg for DITTA1 using LOCKLIST 150 
db2 update db cfg for DITTA1 using MAXAPPLS  
db2 update db cfg for DITTA1 using AVG_APPLS   
db2 update db cfg for DITTA1 using LOGFILSIZ 256 
db2 update db cfg for DITTA1 using LOGPRIMARY  
db2 update db cfg for DITTA1 using LOGSECOND  


I seguenti valori sono per le versioni di DB2 uguali o superiori alla 9


db2 update dbm cfg using QUERY_HEAP_SZ 1000 

db2 update db cfg for DITTA1 using APPLHEAPSZ 2048
db2 update db cfg for DITTA1 using APPL_MEMORY 40016
db2 update db cfg for DITTA1 using BUFFPAGE 16384
db2 update db cfg for DITTA1 using DBHEAP 600
db2 update db cfg for DITTA1 using NUM_IOCLEANERS 3 
db2 update db cfg for DITTA1 using NUM_IOSERVERS 9 
db2 update db cfg for DITTA1 using LOCKLIST 300
db2 update db cfg for DITTA1 using SORTHEAP 1024
db2 update db cfg for DITTA1 using AVG_APPLS   
db2 update db cfg for DITTA1 using LOGFILSIZ 256 
db2 update db cfg for DITTA1 using LOGPRIMARY  
db2 update db cfg for DITTA1 using LOGSECOND  
db2 update db cfg for DITTA1 using PCKCACHESZ 128 
db2 update db cfg for DITTA1 using MAXAPPLS