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

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

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

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

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

Ответ 1

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

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

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

DECLARE yourcursor CURSOR LOCAL ...

Ответ 2

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

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

Ответ 3

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

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