Disabilitare trigger Oracle

lunedì 18 giugno 2012 - 11.03
Tag Elenco Tags  C#  |  .NET 3.5  |  Oracle 11g

volperubbia Profilo | Senior Member

Ciao a tutti,
è possibile dall'interno di un trigger definito su una tabella A
disabilitare un trigger di una tabella B?
In pratica nel primo trigger di A dovrei fare un update sulla tabella B,
ma senza far partire eventuali trigger presenti su B. Qualche idea?

Grazie per l'attenzione,
Davide

alx_81 Profilo | Guru

>Ciao a tutti,
Ciao

>è possibile dall'interno di un trigger definito su una tabella A
>disabilitare un trigger di una tabella B?
>In pratica nel primo trigger di A dovrei fare un update sulla
>tabella B, ma senza far partire eventuali trigger presenti su B. Qualche idea?
siccome ALTER TABLE dovrebbe essere supportato anche da Oracle all'interno di un trigger, direi che si può fare.
In SQL Server si fa, quindi credo che Oracle supporti l'operazione.


>Grazie per l'attenzione,
di nulla!

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

volperubbia Profilo | Senior Member

Ciao Alessandro,
in Oracle per disabilitare tutti i triggers di una tabella si può fare:

EXECUTE IMMEDIATE 'ALTER TABLE tbl_mame DISABLE ALL TRIGGERS';
...
EXECUTE IMMEDIATE 'ALTER TABLE tbl_mame ENABLE ALL TRIGGERS';
EXCEPTION WHEN OTHERS THEN EXECUTE IMMEDIATE 'ALTER TABLE tbl_mame ENABLE ALL TRIGGERS';

Queste righe le accetta ad esempio in una stored procedure, ma non nel corpo di un trigger, lo compila ma poi da errore in escuzione.

Per ora ho risolto con una "variabile globale":

CREATE OR REPLACE PACKAGE my_package AS
ENABLE_TRIGGER BOOLEAN := TRUE;
END;

my_package.ENABLE_TRIGGER := FALSE;
...;
my_package.ENABLE_TRIGGER := TRUE;
EXCEPTION WHEN OTHERS THEN my_package.ENABLE_TRIGGER := TRUE;

Funziona, ma non è una soluzione finale, appunto perchè globale.

Davide

micto27 Profilo | Senior Member

>Ciao a tutti,
>è possibile dall'interno di un trigger definito su una tabella
>A
>disabilitare un trigger di una tabella B?
>In pratica nel primo trigger di A dovrei fare un update sulla
>tabella B,
>ma senza far partire eventuali trigger presenti su B. Qualche
>idea?

Ciao,
lo statement di UPDATE eseguito nel trigger della tabella A è riconoscibile in qualche modo?
Ad esempio, se l'UPDATE attivato dal trigger tabella A modificasse solo una specifica colonna (o solo alcune colonne),
nel trigger della tabella B potresti valutare tale condizione ed eventualmente "saltare" la logica propria del trigger stesso.
Al limite potresti sfruttare questa possibilità creandoti una colonna funzionale a tale scopo.

Supponi che le condizioni di update non siano facilmente distinguibili,
potresti aggiungere una colonna (es. SKIP_TRIGGER NUMBER(1))

nel trigger della tabella A allo statement UPDATE TABELLE_B SET A=.., B=.., .... potresti aggiungere , SKIP_TRIGGER = SKIP_TRIGGER * -1 ...
e nel trigger della tabella B potresti valutare se la colonna SKIP_TRIGGER è fra quelle modificate

IF NOT UPDATING('SKIP_TRIGGER') THEN
... logica del trigger B
END IF;

Ciao, Michele
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5