Newsgroup: it.comp.software.database
Titolo: ms sql server - trigger

Salve a tutti,
secondo voi è possibile che un trigger composto da due distinte query di 
inserimento, durante l'esecuzione venga interrotto da un altro trigger?
Per esempio:
trig1 su tabella A
    	insert 1.1
    	insert 1.2
trig2 su tabella B
    	insert 2.1
    	insert 2.2
in pratica potrebbe succedere che le operazioni vengano eseguite in 
quest'ordine?
- insert 1.1
- insert 2.1
- insert 2.2
- insert 1.2
Grazie.
BJ

salve

SQL Server consente di modificare l'impostazione relativa ai nested triggers
in modo da evitare la ricorsione in tal senso.. ad esempio, con impostazione
attivata come da default, il seguente
SET NOCOUNT ON
CREATE TABLE dbo.a1 (
 ID int
 )
CREATE TABLE dbo.a2 (
 ID int
 )
GO
CREATE TRIGGER tr_a1 ON dbo.a1 FOR INSERT
AS BEGIN
 INSERT INTO dbo.a2 SELECT * FROM inserted
END
GO
CREATE TRIGGER tr_a2 ON dbo.a2 FOR INSERT
AS BEGIN
 INSERT INTO dbo.a1 SELECT * FROM inserted
END
GO
DROP TABLE dbo.a2,dbo.a1
eseguendo
CREATE PROCEDURE dbo.usp_insA1 as
 INSERT INTO dbo.a1 VALUES (1)
causera' l'eccezione
Server: Msg 217, Level 16, State 1, Procedure tr_a1, Line 3
[Microsoft][ODBC SQL Server Driver][SQL Server]Maximum stored procedure,
function, trigger, or view nesting level exceeded (limit 32).
ed in effetti, debugguando la procedura vedrai che le chiamate ai trigger
saranno reciproche (in questo caso fallira' l'esecuzione causa la
circolarita perpetua), mentre disabilitando l'impostazione relativa ai
nested triggers verra' eseguito solo
tr_a1 ON dbo.a1
l'impostazione e' modificabile anche via sp_configure
saluti
-- 
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz/DbaMgr.shtm
 
http://italy.mvps.org
DbaMgr2k ver 0.11.1  -  DbaMgr ver 0.57.0
(my vb6+sql-dmo little try to provide MS MSDE 1.0 and MSDE 2000 a visual
interface)
--------- remove DMO to reply

 triggers in modo da evitare la ricorsione in tal senso.. 
Intanto grazie per aver risposto, ma purtroppo non mi sono espresso molto 
bene: io ho due 2 tabelle indipendenti e per ognuna ho un trigger 
(inserimento, cancellazione e modifica) che va a scrivere delle 
informazioni sia in una terza tabella (comune ai 2 trigger), sia in 
un'ulteriore tabella specifica per trigger.
Erroneamente pensavo che le operazioni all'interno del trigger venissero 
eseguite in blocco mentre in realta se un utente esegue un'operazione sulla 
tabella 1 ed un altro operatore, contemporaneamente, esegue un operazione 
nella tabella 2, i due trigger vengono eseguiti in "parallelo", cioè il 
primo trigger può essere interrotto durante l'esecuzione dal secondo 
trigger e viceversa.
Dato che ho la necessità che i due trigger non si interrompano a vicenda, 
per ora ho trovato come soluzione quella di effettuare una "select top 1 * 
from tabella3" tra le prime operazioni in ciascuno dei trigger (e dopo aver 
eseguito "SET TRANSACTION ISOLATION LEVEL serializable"); non mi sembra il 
massimo come soluzione, ma per ora sembra funzionare. Esiste una soluzione 
migliore per ottenere il risultato voluto? 
Grazie.
BJ

 Grazie.
cosi' facendo chiaramente distruggi la possibilita' di concorrenza insite
nel server...
non capisco pero' per quale motivo impedisci la parallelizzazione di
esecuzione... l'eventuale posizionamento delle righe all'interno delle
tabelle (come anche all'interno del set di risultati eventualmente
desiderato) e' sicuramente ininfluente in quanto comunque l'ordinamento
deriva da un'operazione di tipo cursore definito appunto nell'espressione di
ORDER BY...


 saluti
A dire il vero l'applicazione è "nata male" e volevo trovare una soluzione 
limitando i danni... la soluzione dei lock ha funzionato solamente in 
ambiente di test, nella pratica si è rivelata un vero e proprio distastro, 
quindi dovro' comunque rivedere il tutto. 
Saluti.
BJ