Курсор с именем ... уже существует - SQL Server 2008 - PullRequest
12 голосов
/ 18 июля 2011

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

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

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

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

Ответы [ 3 ]

30 голосов
/ 19 июля 2011

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

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

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

DECLARE yourcursor CURSOR LOCAL ...
6 голосов
/ 14 апреля 2014

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

IF CURSOR_STATUS('global', 'Cursorname') >= -1
BEGIN
    CLOSE Cursorname
    DEALLOCATE Cursorname
END
4 голосов
/ 18 июля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...