Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Control de errores en procedimiento almacenado

Estas en el tema de Control de errores en procedimiento almacenado en el foro de SQL Server en Foros del Web. Tengo un procedimiento almacenado (he quitado todo el código porque son miles de líneas y no son necesarias para la duda): [PHP] @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código ...
  #1 (permalink)  
Antiguo 01/10/2012, 10:35
 
Fecha de Ingreso: julio-2003
Ubicación: España
Mensajes: 723
Antigüedad: 21 años, 3 meses
Puntos: 0
Control de errores en procedimiento almacenado

Tengo un procedimiento almacenado (he quitado todo el código porque son miles de líneas y no son necesarias para la duda):

[PHP]
Código SQL:
Ver original
  1. ON [dbo].[TABLA]
  2. FOR DELETE
  3. AS
  4. BEGIN TRY
  5. BEGIN TRANSACTION
  6.     DECLARE @VARIABLE1 VARCHAR(10)
  7. --BLABLABLA
  8.  
  9. COMMIT TRANSACTION
  10.  
  11. END TRY
  12. BEGIN CATCH
  13.     IF XACT_STATE() <> 0
  14.         BEGIN
  15.             ROLLBACK TRANSACTION;
  16.         END
  17.  
  18.     INSERT INTO LogGeneral (Evento,Tag) VALUES (ERROR_PROCEDURE() + ' ' + ERROR_MESSAGE(),'ErrorProcAlm')
  19. END CATCH

Lo que quiero es que si se produce un error me lo guarde en una tabla, para ello uso un TRY...CATH.

Como puede verse uso una trasacción.

El problema es que la trasacción crea conflictos con otras transacciones y no me queda otra que quitarla.

SI QUITO LA TRANSACCIÓN CUANDO SE PRODUCE UN ERROR NO ME INSERTA NADA EN LA TABLA DONDE GUARDO LOS ERRORES!

¿Alguien sabe porqué?
¿Se os ocurre otra manera de anotar los errores?

Saludos y gracias.
__________________
Solo nosotros podemos decidir qué hacer con el tiempo que se nos ha dado. (Gandalf)

Última edición por gnzsoloyo; 17/01/2014 a las 06:21
  #2 (permalink)  
Antiguo 01/10/2012, 11:07
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Control de errores en procedimiento almacenado

yo tengo mis procesos con este schema:

Código SQL:
Ver original
  1. ALTER PROCEDURE
  2. AS                            
  3. BEGIN                            
  4.  SET NOCOUNT ON                        
  5.                            
  6.   BEGIN try                            
  7.                            
  8.   END try                            
  9.                            
  10.   BEGIN catch
  11.       INSERT INTO TABLE                          
  12.       SELECT                            
  13.       ERROR_NUMBER() AS ErrorNumber,                            
  14.       ERROR_SEVERITY() AS ErrorSeverity,                            
  15.     ERROR_STATE() AS ErrorState,                            
  16.       ERROR_PROCEDURE() AS ErrorProcedure,                            
  17.       ERROR_LINE() AS ErrorLine,                            
  18.       ERROR_MESSAGE() AS ErrorMessage;                            
  19.   END catch                                                
  20. END

y no uso transacciones :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 01/10/2012, 11:43
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: Control de errores en procedimiento almacenado

Libras: El problema que yo veo en el planteamiento de DjNelson, es que es en un TRIGGER, donde quiere implementar el BEGIN TRAN, COMMIT TRAN
__________________
MCTS Isaias Islas
  #4 (permalink)  
Antiguo 01/10/2012, 12:17
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Control de errores en procedimiento almacenado

Cita:
Iniciado por iislas Ver Mensaje
Libras: El problema que yo veo en el planteamiento de DjNelson, es que es en un TRIGGER, donde quiere implementar el BEGIN TRAN, COMMIT TRAN
Por eso puse en mi respuesta alter procedure jejejeje, no pos si quiere manejar un begin tran en un trigger ps asi como??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 01/10/2012, 14:44
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: Control de errores en procedimiento almacenado

Pues es lo que yo digo....jajaja (saludos)
__________________
MCTS Isaias Islas
  #6 (permalink)  
Antiguo 02/10/2012, 10:51
 
Fecha de Ingreso: julio-2003
Ubicación: España
Mensajes: 723
Antigüedad: 21 años, 3 meses
Puntos: 0
Respuesta: Control de errores en procedimiento almacenado

Me he liado al escribir el código, la definición debería corresponderse con un procedimiento almacenado, es decir ALTER PROCEDURE...

El problema es que este procedimiento lo ejecuta un trigger...

Saludos.
__________________
Solo nosotros podemos decidir qué hacer con el tiempo que se nos ha dado. (Gandalf)
  #7 (permalink)  
Antiguo 02/10/2012, 10:53
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: Control de errores en procedimiento almacenado

NINGUN TRIGGER, debe ejecutar un PROCEDIMIENTO
__________________
MCTS Isaias Islas
  #8 (permalink)  
Antiguo 02/10/2012, 14:16
 
Fecha de Ingreso: julio-2003
Ubicación: España
Mensajes: 723
Antigüedad: 21 años, 3 meses
Puntos: 0
Respuesta: Control de errores en procedimiento almacenado

El tema es más complicado de lo que parece y no quería extenderme demasiado para centrarnos en el problema...

Cuando salta el trigger mete un mensaje en una cola y es la cola la que ejecuta el procedimiento.

Me volveré a explicar ya que creo que no lo he hecho correctamente:

Lo que quiero es que cuando se produzca un error se guarde en la BBDD.

Para ello uso un TRY... CATCH pero al saltar el error no me graba nada en la BBDD, entonces decidí usar una trasacción y así funciona... el problema es que la trasacción me genera problemas con otros procedimientos y no tengo más remedio que quitarla...

Entonces volvemos al problema inicial: ¿Como anoto el error en la BBDD SIN USAR UNA TRANSACCIÓN?

Saludos.
__________________
Solo nosotros podemos decidir qué hacer con el tiempo que se nos ha dado. (Gandalf)
  #9 (permalink)  
Antiguo 02/10/2012, 15:27
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Control de errores en procedimiento almacenado

y el ejemplo que te di?? lo usaste o no???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #10 (permalink)  
Antiguo 02/10/2012, 15:36
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: Control de errores en procedimiento almacenado

Si no abres una transaccion, corres el riesgo de generar interbloqueos, ¿ya lo consideraste?
__________________
MCTS Isaias Islas

Etiquetas: control, errores, procedimiento, tabla, trigger, almacenar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:43.