2011-07-18 30 views
11

tengo un disparador que se utiliza para realizar algunas tareas de auditoría cuando se realizan cambios en una tabla. Dentro de este disparador hay un bucle WHILE, y en el bucle hay un cursor que se declara, usa, cierra y luego se desasigna antes de la siguiente iteración del bucle.Un cursor con el nombre ya existe ... - SQL Server 2008

Cuando llamo a un procedimiento almacenado que cambia la tabla y, a su vez, hace que se ejecute el desencadenador, y lo hago desde Management Studio, todo funciona como se espera.

Sin embargo, cuando se llama a este procedimiento almacenado desde mi aplicación web Java, aparece un error: "Un cursor con el nombre ... ya existe".

¿Hay una razón por la cual este procedimiento almacenado funcionaría cuando yo haga de forma manual, y no funciona cuando se ejecuta desde la aplicación web?

+0

un disparador que tiene un cursor y un bucle while es un disparador que necesita ser reprogramado. – HLGEM

Respuesta

28

Parece que usted podría estar usando los cursores global, lo que podría causar problemas de este tipo.

Si tiene que usar los cursores:

Si es posible, utilizar los cursores locales en todo el código. p. declarar cursor utilizando la palabra clave "LOCAL", así:

DECLARE yourcursor CURSOR LOCAL ... 
+0

Esto corrigió mi problema con los cursores en una aplicación multiproceso. También se puede ajustar por defecto a local a través de las opciones de base de datos: http://msdn.microsoft.com/en-us/library/ms188124(v=sql.105).aspx – Christian

4

suena un poco como que está siendo llamado por múltiples hilos y por lo tanto ya existe cuando el segundo hilo intenta utilizar el nombre. Puede tratar de nombrar el cursor dinámicamente con un GUID en el nombre, etc. No recomendaría este enfoque.

que sugieren quitar el cursor de su código de disparo, si es posible en favor de un enfoque basado en el conjunto. La parte superior de usar un cursor dentro del gatillo debe ser bastante alta.

6

También puede probar este

IF CURSOR_STATUS('global', 'Cursorname') >= -1 
BEGIN 
    CLOSE Cursorname 
    DEALLOCATE Cursorname 
END 
Cuestiones relacionadas