Цикл по удаленным или добавленным записям в триггере ?

DennisL
Дата: 15.03.2001 18:02:56
Как лучше делать цикл по удаленным (добавленным) записям в триггере, если для каждой записис надо осуществить проверку статуса (разрешена такая опреция или нет) в одной таблице и затем пересчетать общую сумму и записать в другую?
Genady
Дата: 15.03.2001 18:14:27
Поконкретнее опишите задачу, а в триггерах лучше обходитьсябез циклов.
DennisL
Дата: 15.03.2001 18:57:08
Простой пример :

Есть две таблицы : Одна содержит Счета: (номер, статус, основная сумма, налог, коммисия, дополнительная сумма, общаяя сумма и т.д.)
Вторая содержит дополнительный суммы (номер счета,Сумма ,обоснование и т.д.)
При добавлении новой записи (или сразу нескольких), тоже самое при удалении надо проверить статус счета (например если он уже напечатан и отправлен) то отменить изменения если нет то пересчитать дополнительную сумму по всем дополнительным расходам каждого из счетов которых коснулись изменения и записать эти данные в таблицу счетов, в поле дополнительные расходы ...
(Последнее не так важно т.к. в принципе можно не хранить дополнительную сумму для каждого счета, а вычислять ее во View но это тоже не очень удобно)
ArtP
Дата: 15.03.2001 19:03:14
К сожалению в триггерах не обойтись без циклов так как существуют групповые операции по изменению данных, а триггер у MSSQL вызывается один раз

DECLARE Inst CURSOR FOR SELECT * FROM Deleted
OPEN Inst
FETCH NEXT FROM Inst INTO ... -- тут локальный переменные
WHILE @@FETCH_STATUS = 0
BEGIN
.... -- тут операции
FETCH NEXT FROM Inst INTO ... -- тут локальный переменные
END
CLOSE Inst
DEALLOCATE Inst
SergSuper
Дата: 16.03.2001 09:42:36
вот как раз для таких задач циклы и курсоры совсем не нужны
попробуйте работать не с каждой записью, а сразу с массивом данных - и всё получиться, и гораздо проще чем вам казалось
DennisL
Дата: 16.03.2001 10:30:51
Можно какойто пример как без цикла организовать проверку для каждой записи, в принципе надо осуществить только две операции либо запретить изменения либо разрешить ...

Вопрос в догонку а в T-SQL вообще есть что то вроде FOR x=1 TO 10 ... вобщем цыкл повторяющися заданое чило раз ?
Genady
Дата: 16.03.2001 10:50:04
2 ArtP Бррррр..... аж страшно

2 Dennisl

create trigger ti_Суммы on Суммы for insert as
begin

delete from Суммы inner join Счета on Суммы.ID = Счета.ID where Счета.Статус = "Плохой"

update Счета set [че там нужно апдейтить] from Счета, Суммы, insertded where Счета.ID = Суммы.ID and Суммы.ID = inserted.ID

end

В запросах под ID я понимал PK, FK из вашего описания таблиц я не понял где там первичный и внешний ключи.
DennisL
Дата: 16.03.2001 11:15:49
Спасибо Genady ! я так и сделаю вероятно, с UPDATE тоже тогда надо востанавливать занчения из deleted ...