|
|
|
курсор в триггере на Update
|
|||
|---|---|---|---|
|
#18+
У меня такой вопрос: Я создаю хранимую процедуру, которая сама выполняет Update таблицы и вызывается в триггере при Update. При этом я использую курсор в процедуре. При update таблицы выдается ошибка, что курсор с таким именем уже существует. Как это обойти? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2002, 23:31:34 |
|
||
|
курсор в триггере на Update
|
|||
|---|---|---|---|
|
#18+
Я сделала следующим образом: завела еще один параметр у хранимой процедуры типа CURSOR VARYING OUTPUT, и эту переменную использую внутри процедуры, ошибки теперь нет, но нельзя ли иначе сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2002, 01:45:11 |
|
||
|
курсор в триггере на Update
|
|||
|---|---|---|---|
|
#18+
При update таблицы выдается ошибка, что курсор с таким именем уже существует. Лучше предъявите текст процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2002, 10:56:24 |
|
||
|
курсор в триггере на Update
|
|||
|---|---|---|---|
|
#18+
Триггер: -------------------------------------------- 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 -------------------------------- При изменении поля в одной таблице, вызывается хранимая процедура, в которой выполняется другое обновление (то есть снова срабатывает триггер, в котором вызывается та же процедура с другими параметрами, открывается курсор с таким же именем) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2002, 17:10:10 |
|
||
|
курсор в триггере на Update
|
|||
|---|---|---|---|
|
#18+
1)тут курсор вроде как не нужен..... 2)что-то тут плюс ко всему с логикой не то.... а какая задача то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2002, 18:04:18 |
|
||
|
курсор в триггере на Update
|
|||
|---|---|---|---|
|
#18+
Скорее всего курсор по умолчанию открыт как глобальный. Не вдаваясь в нужность курсора, могу посоветовать в cursor declaration добавить слово LOCAL DECLARE valuecursor CURSOR LOCAL Тогда этот курсор будет виден только внутри вызываемой процедуры. -- Слон ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2002, 18:42:57 |
|
||
|
курсор в триггере на Update
|
|||
|---|---|---|---|
|
#18+
Спасибо, вариант с CURSOR LOCAL работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2002, 13:53:24 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32068850&tid=1818694]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
30ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
26ms |
get tp. blocked users: |
1ms |
| others: | 182ms |
| total: | 268ms |

| 0 / 0 |
