Курсор с именем ... уже существует-SQL Server 2008

У меня есть триггер, который используется для выполнения некоторых задач аудита при внесении изменений в таблицы. Внутри этого триггера есть цикл WHILE, а в цикле есть курсор, который объявляется, используется, закрывается, а затем освобождается перед следующей итерацией цикла.

когда я вызываю хранимую процедуру, которая изменяет таблицу и, в свою очередь, вызывает запуск триггера, и я делаю это из среды Management Studio, все работает так, как ожидалось.

однако, когда этот хранимая процедура вызывается из моего веб-приложения Java, я получаю сообщение об ошибке: "курсор с именем ... уже существовать."

есть ли причина, по которой эта хранимая процедура будет работать, когда я выполняю ее вручную, а не работать при запуске из веб-приложения?

3 ответов


похоже, вы можете использовать глобальные курсоры, что может вызвать такие проблемы.

Если вы должны использовать курсоры:

Если можете, используйте локальные курсоры во всем коде. например, объявите курсор с помощью ключевого слова "LOCAL", например:

DECLARE yourcursor CURSOR LOCAL ...

вы также можете попробовать это

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

звучит немного похоже на то, что он вызывается несколькими потоками и, следовательно, уже существует, когда второй поток пытается использовать имя. Вы можете попробовать назвать курсор динамически с идентификатором GUID в имени и т. д. Я бы не рекомендовал такой подход.

Я предлагаю вам удалить курсор из код триггера, если это вообще возможно в пользу подхода на основе. Накладные расходы на использование курсора в триггере должны быть довольно высокими.