Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 В триггере отменить удаление только некоторых строк  [new]
Element2
Member

Откуда: Украина
Сообщений: 22
Добрый день!
Подскажите, пожалуйста, выход из такой ситуации.
Я опишу упрощённо. Главное суть.

Есть таблица tableA (с полями id1, id2, sum) и таблица tableB (id, sum).

Есть процедура procB, которая изменяет данные в таблице tableB, либо выдаёт сообщение, что изменить нельзя:
PROCEDURE procB
@_id int,
@_sum numeric(15,2),
@error bit = 0 output
AS
BEGIN
	DECLARE @s numeric(15,2)=0
	select @s = sum
		from tableB
		where id=@_id
	if @s-@_sum>0
		UPDATE tableB
			SET sum = @s-@_sum
			where id=@_id
	else
	begin
		set @error=1
		raisError ('Меньше нуля! Обработать низзя!', 16, 1)
	end
END

Есть триггер на удаление из таблицы tableA:
TRIGGER triggerA
   ON tableA
   AFTER DELETE
AS 
BEGIN
	SET NOCOUNT ON;
	DECLARE @err
	DECLARE o_cur CURSOR FOR
		select id1, id2, sum
			from deleted
	OPEN o_cur
	FETCH NEXT FROM o_cur into @id1, @id2, @sum
	WHILE @@FETCH_STATUS = 0
	BEGIN
		exec procB @id1, @sum, @err out;
		if @err=0
			exec procB @id2, @sum, @err out;
		if @err=1
                                                    ТУТ НАДО ОТМЕНИТЬ ИЗМЕНЕНИЯ, КОТОРЫЕ БЫЛИ СДЕЛАНЫ В ПЕРВОМ ЗАПУСКЕ procB
		FETCH NEXT FROM o_cur into @id1, @id2, @sum
	END
	CLOSE o_cur 
	DEALLOCATE o_cur
END
Я бы мог откатить транзакцию, если бы из tableA удалялась одна запись.
Но если удаляется несколько, мне нужно, чтобы отмена удаления прошла не по всем записям, а только по ошибочным.
Как это сделать?
20 окт 11, 12:54    [11472036]     Ответить | Цитировать Сообщить модератору
 Re: В триггере отменить удаление только некоторых строк  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
это не поможет?

http://msdn.microsoft.com/ru-ru/library/ms191208.aspx
20 окт 11, 13:03    [11472105]     Ответить | Цитировать Сообщить модератору
 Re: В триггере отменить удаление только некоторых строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Element2
Я бы мог откатить транзакцию, если бы из tableA удалялась одна запись.
Но если удаляется несколько, мне нужно, чтобы отмена удаления прошла не по всем записям, а только по ошибочным.
Как это сделать?
Либо в триггере FOR DELETE вставить некоторые записи обратно,
либо в триггере INSTEAD OF DELETE удалять только то, что нужно.
20 окт 11, 13:04    [11472107]     Ответить | Цитировать Сообщить модератору
 Re: В триггере отменить удаление только некоторых строк  [new]
Element2
Member

Откуда: Украина
Сообщений: 22
Winnipuh, iap,
так проблема в том, как отменить произведённые изменения в таблице tableB
20 окт 11, 13:18    [11472246]     Ответить | Цитировать Сообщить модератору
 Re: В триггере отменить удаление только некоторых строк  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Element2
Winnipuh, iap,
так проблема в том, как отменить произведённые изменения в таблице tableB


как в триггере на удаление отменить удаление части записей?

см. ссылку... instead of...
20 окт 11, 13:25    [11472332]     Ответить | Цитировать Сообщить модератору
 Re: В триггере отменить удаление только некоторых строк  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Element2
Winnipuh, iap,
так проблема в том, как отменить произведённые изменения в таблице tableB
Не отменить, а наложить необходимые фильтры на курсорный select? А лучше вообще перепроектировать, чтобы избавится от курсоров в принципе.
20 окт 11, 13:27    [11472351]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить