Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
Funzionamento di try... catch in SqlSrv 2005
mercoledì 06 dicembre 2006 - 15.18
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
fcaravello
Profilo
| Newbie
1
messaggi | Data Invio:
mer 6 dic 2006 - 15:18
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
..................
Torna su
Stanze Forum
Elenco Threads
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 !