Funzionamento di try... catch in SqlSrv 2005

mercoledì 06 dicembre 2006 - 15.18

fcaravello Profilo | Newbie

Buongiorno a tutti,
Sto migrando una base dati da Oracle a SqlServer, avvalendomi del programma SSMA.
In ambiente Oracle, ho una tabella (in seguito T1) con un trigger after insert, che inserisce dei record di notifica in una seconda tabella (T2). L'eventuale Key violation (duplicazione di chiave) del record sulla T2 viene gestito intercettando l'errore con un costrutto "when others..." in modo da filtrare l'errore e far terminare correttamente la transazione.
SSMA ha tradotto il tutto con un blocco try... catch di SqlServer2005.
Purtroppo però il funzionamento non è quello sperato, in quanto SqlSrv anche se intercetta l'eccezione, "rollbacka" comunque la transazione, impedendone così di fatto la gestione da parte del programma Delphi che ha eseguito l'insert su T1.

Di seguito riporto il sorgente dei trigger Oracle e SqlServer.

Grazie per l'aiuto.

ORACLE
----------

CREATE OR REPLACE TRIGGER TI_MACCHINE
AFTER INSERT
ON MACCHINE
FOR each ROW
DECLARE numrows INTEGER;
STRINGA_MAC_CENTRI VARCHAR2(64) ;
BEGIN

............

/* MACCHINE_AGGIORNA_POSTA_I */
STRINGA_MAC_CENTRI:= ('****#****#'||:NEW.PARTE_DI) ;
INSERT INTO POSTA_PROCEDURE(CODICE_PROCEDURA, ID_COMANDO, STRINGA_PARAMETRO, DATA_ORA,
MITTENTE, DESCRIZIONE)
VALUES('LANCIO', 3, STRINGA_MAC_CENTRI, SYSDATE,
'MACCHINE', 'AGGIUNTA DI UNA MACCHINA SOTTO UN CENTRO');
EXCEPTION
WHEN OTHERS THEN
numrows:= SQLCODE;
IF (numrows = -1)
THEN
numrows:= 0;
ELSE
raise;
END IF;

.........

END;

SQLSERVER 2005
---------------------

CREATE
TRIGGER [TI_MACCHINE] ON [dbo].[MACCHINE]
AFTER INSERT
AS
/* begin of trigger implementation */
SET NOCOUNT ON

...............

BEGIN TRY

/* MACCHINE_AGGIORNA_POSTA_I */

SET @STRINGA_MAC_CENTRI = ('****#****#' + isnull(@column_new_value$2, ''))

INSERT INTO dbo.POSTA_PROCEDURE
(
dbo.POSTA_PROCEDURE.CODICE_PROCEDURA,
dbo.POSTA_PROCEDURE.ID_COMANDO,
dbo.POSTA_PROCEDURE.STRINGA_PARAMETRO,
dbo.POSTA_PROCEDURE.DATA_ORA,
dbo.POSTA_PROCEDURE.MITTENTE,
dbo.POSTA_PROCEDURE.DESCRIZIONE
)
VALUES
(
'LANCIO',
3,
@STRINGA_MAC_CENTRI,
getdate(),
'MACCHINE',
'AGGIUNTA DI UNA MACCHINA SOTTO UN CENTRO'
)

END TRY

BEGIN CATCH

DECLARE
@ErrorMessage nvarchar(4000),
@ErrorNumber int,
@ErrorSeverity int,
@ErrorState int,
@ExceptionIdentifier nvarchar(4000)

SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorNumber = ERROR_NUMBER(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE()

SELECT @ExceptionIdentifier = SYSDB.SSMA.db_error_get_oracle_exception_id(@ErrorMessage, @ErrorNumber)

BEGIN
SET @numrows = SYSDB.SSMA.DB_ERROR_SQLCODE(@ExceptionIdentifier)
IF (@numrows = -1)
SET @numrows = 0
ELSE
BEGIN
IF (@ExceptionIdentifier IS NOT NULL)
BEGIN
RAISERROR (59999, 16, 1, @ExceptionIdentifier)
END
ELSE
BEGIN
RAISERROR (@ErrorNumber, @ErrorSeverity, @ErrorState)
END
END
END

END CATCH
..................

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