powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / курсор в триггере на Update
8 сообщений из 8, страница 1 из 1
курсор в триггере на Update
    #32068768
khoud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня такой вопрос:
Я создаю хранимую процедуру, которая сама выполняет Update таблицы и вызывается в триггере при Update.
При этом я использую курсор в процедуре. При update таблицы выдается ошибка, что курсор с таким именем уже существует.
Как это обойти? Заранее спасибо.
...
Рейтинг: 0 / 0
курсор в триггере на Update
    #32068773
khoud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я сделала следующим образом:
завела еще один параметр у хранимой процедуры типа CURSOR VARYING OUTPUT, и эту переменную использую внутри процедуры, ошибки теперь нет, но нельзя ли иначе сделать?
...
Рейтинг: 0 / 0
курсор в триггере на Update
    #32068850
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При update таблицы выдается ошибка, что курсор с таким именем уже существует.

Лучше предъявите текст процедуры.
...
Рейтинг: 0 / 0
курсор в триггере на Update
    #32069172
khoud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Триггер:
--------------------------------------------
CREATE TRIGGER UpdateTable ON dbo.Table
AFTER UPDATE
AS
BEGIN
Declare @Id int,
@oldvalue int,
@newvalue int

SELECT @Id = Id
FROM inserted

If Columns_Updated() = 4
begin
SELECT @oldvalue = Value
FROM deleted

SELECT @newvalue = Value
FROM inserted

exec SetValueDependent 'Table', @Id, @oldvalue, @newvalue
end

END
-------------------------
SetValueDependent - хранимая процедура:
CREATE PROCEDURE dbo.SetValueDependent @TableName sysname, @Id int, @oldvalue int, @newvalue int
AS
BEGIN
DECLARE ValueCursor CURSOR
FOR
SELECT TableFrom, FieldName, Value
FROM [TableValues]
WHERE TableTo = @TableName AND Value > 0
OPEN ValueCursor

DECLARE @TableFrom sysname,
@FieldName sysname,
@Value int

FETCH NEXT FROM ValueCursor INTO @TableFrom,@FieldName, @Value
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
EXEC ('UPDATE ' + @TableFrom + ' ' +
'SET Value = Value &(~'+@Value +'& '+ @oldvalue +')|('+@Value +'&'+ @newvalue +') '+
'WHEREэ+@FieldName+ '='+@Id)
END
FETCH NEXT FROM ValueCursor INTO @TableFrom, @FieldName, @Value
END
CLOSE ValueCursor
DEALLOCATE ValueCursor
END

GO
--------------------------------
При изменении поля в одной таблице, вызывается хранимая процедура, в которой выполняется другое обновление (то есть снова срабатывает триггер, в котором вызывается та же процедура с другими параметрами, открывается курсор с таким же именем)
...
Рейтинг: 0 / 0
курсор в триггере на Update
    #32069246
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1)тут курсор вроде как не нужен.....
2)что-то тут плюс ко всему с логикой не то....
а какая задача то?
...
Рейтинг: 0 / 0
курсор в триггере на Update
    #32069266
Фотография Слон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего курсор по умолчанию открыт как глобальный.
Не вдаваясь в нужность курсора, могу посоветовать в cursor declaration добавить слово LOCAL
DECLARE valuecursor CURSOR LOCAL
Тогда этот курсор будет виден только внутри вызываемой процедуры.

-- Слон
...
Рейтинг: 0 / 0
курсор в триггере на Update
    #32069621
khoud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, вариант с CURSOR LOCAL работает.
...
Рейтинг: 0 / 0
курсор в триггере на Update
    #32069636
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка раз: Триггер написан для обработки одной строки, на самом деле inserted и deleted являются таблицами и могут содержать много строк.
Ошибка два: Курсор нафиг не нужен.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / курсор в триггере на Update
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]