Errore trigger in MSSQL2000

venerdì 13 febbraio 2009 - 15.47

gcaramia Profilo | Newbie

Salve
In un DataBase MSSQLServer 2000
Avendo bisogno di tenere traccia delle cancellazioni effettuate dagli utenti su una tabella, ho creato un trigger abbinato alla cancellazione di un record. Tale trigger inserisce un campo ('codice') del record cancellato in una tabella di RecordsCancellati.
Riporto il codice del trigger qui di seguito:
-------------------------------
CREATE TRIGGER articolidelete ON dbo.ARTICOLI
FOR DELETE
AS
DECLARE @vcodice CHAR(20)
SELECT @vcodice = codice FROM deleted
INSERT INTO RecordsCancellati (codice) VALUES (@vcodice)
-------------------------------

La tabella Articoli è relazionata con altre tabelle.
Il software applicativo (del quale non possiedo i sorgenti ma solo l'eseguibile), in corrispondenza alla richiesta di cancellazione, fa partire sicuramente una transazione per la cancellazione dei records relazionati e del record stesso ma poi si pianta visualizzando il seguente errore:

"No user transaction is currently in progress.
Alla richiesta ROLLBACK TRANSACTION non è associata un'istruzione BEGIN TRANSACTION corrispondente."

Ovviamente se elimino il trigger tutto funziona perfettamente.

Qualcuno sa indicarmi, per favore, come modificare il trigger in modo che non generi tale inconveniente.
Oppure, come posso ottenere, anche in modo diverso il risultato che ho descritto ?



lbenaglia Profilo | Guru

>Riporto il codice del trigger qui di seguito:
>-------------------------------
>CREATE TRIGGER articolidelete ON dbo.ARTICOLI
>FOR DELETE
>AS
>DECLARE @vcodice CHAR(20)
>SELECT @vcodice = codice FROM deleted
>INSERT INTO RecordsCancellati (codice) VALUES (@vcodice)
>-------------------------------
>
>La tabella Articoli è relazionata con altre tabelle.
>Il software applicativo (del quale non possiedo i sorgenti ma
>solo l'eseguibile), in corrispondenza alla richiesta di cancellazione,
>fa partire sicuramente una transazione per la cancellazione dei
>records relazionati e del record stesso ma poi si pianta visualizzando
>il seguente errore:
>
>"No user transaction is currently in progress.
>Alla richiesta ROLLBACK TRANSACTION non è associata un'istruzione
>BEGIN TRANSACTION corrispondente."
>
>Ovviamente se elimino il trigger tutto funziona perfettamente.

Ciao Giovanni,

Non capisco come quel trigger possa generare l'errore riportato.
Ad ogni modo ti propongo una versione che contempli la cancellazione di più righe in un'unica transazione:

CREATE TRIGGER dbo.trD_Articoli ON dbo.ARTICOLI FOR DELETE AS INSERT dbo.RecordsCancellati(Codice) SELECT Codice FROM DELETED;

Se anche questo trigger scatena l'eccezione, ti suggerisco di eseguire una sessione di Profiler per capire che cosa fa l'applicazione quando elimini un articolo.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

gcaramia Profilo | Newbie

Grazie del consiglio.
Il problema risiedeva nella tabella 'RecordsCancellati. Il campo "id" l'avevo settato come non accettare null ma avevo dimenticato di impostarlo autoincrement.
Così quando il trigger si accingeva ad inserire un nuovo record andava in crisi in quanto id non poteva accettare null.

saluti
giovanni

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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5