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

Откуда: Москва
Сообщений: 39
Есть таблица Table1, в которую вставляются детальные данные. Одновременно со вставкой в эту таблицу необходимо считать аггрегированные данные (из тех, что вставились) и вставлять их в таблицу Table1_1, где хранятся аггрегаты. Я решил повесить на первую таблицу триггер AFTER INSERT и в нем делать аггрегацию. Тело триггера примерно такое :
INSERT INTO Table1_1(MEAS_PERIOD, Att, Succ)
SELECT
	MEAS_PERIOD,
	SUM(Att),
	SUM(Succ)
FROM
	Table1 T1
WHERE 
	NOT EXISTS(	SELECT * FROM Table1_1 T2 WHERE T1.Meas_Period = T2.Meas_Period  )
GROUP BY
	MEAS_PERIOD


Но есть проблема - при аггрегации может произойти переполнение (там стоит сумма). При отсутствии триггера вставка в таблицу 1 прошла бы нормально, но с триггером вставка в таблицу Table1 не происходит (из-за ошибки переполнения в нем). Помещение тела триггера в блок try..catch не помогает. Реально ли сделать так, чтобы при переполнении в аггрегации вставка в таблицу 1 происходила бы, а вставка в таблицу 1_1 нет?
2 окт 13, 13:47    [14912154]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибок в триггере  [new]
andy_111
Member

Откуда: Москва
Сообщений: 39
Немного ошибся - в триггере вместо Table1 должно быть inserted, но сути дела это не меняет.
2 окт 13, 13:48    [14912169]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибок в триггере  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74928
автор
при аггрегации может произойти переполнение (там стоит сумма)


Ну так приведите поля, например, к bigint или decimal (38,s) в зависимости от их типов данных.
2 окт 13, 14:10    [14912318]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибок в триггере  [new]
andy_111
Member

Откуда: Москва
Сообщений: 39
Вы не поняли - у меня в таблице с аггрегированными данными поля типа int и ошибка происходит при вставке туда - не принимает она значения более 2 миллиардов. Мне нужно по сути откинуть все суммы более двух миллиардов (превышающие диапазон int). Сделать HAVING и в нем проверку соответствия типу? А как проверить, что число соответствует типу INT?
2 окт 13, 14:49    [14912573]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибок в триггере  [new]
Glory
Member

Откуда:
Сообщений: 104751
andy_111
Вы не поняли - у меня в таблице с аггрегированными данными поля типа int и ошибка происходит при вставке туда - не принимает она значения более 2 миллиардов.

Ну так и советуют поменять тип поля

andy_111
А как проверить, что число соответствует типу INT?

SUM(int) и так может дать только int
2 окт 13, 14:52    [14912602]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибок в триггере  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74928
andy_111,

И в таблице тип поля меняйте, а лучше забейте на триггер и вторую таблицу и создайте индексированное представление.

Сообщение было отредактировано: 2 окт 13, 14:56
2 окт 13, 14:55    [14912631]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибок в триггере  [new]
andy_111
Member

Откуда: Москва
Сообщений: 39
Индексированное представление - вещь интересная, но мне нужно хранить в аггрегированной табличке историю. То есть я могу удалить исходные данные из целевой таблицы, но они должны в аггрегированном виде остаться во второй таблице. Я так понимаю при удалении их из первой таблицы они уйдут и из второй?
Есть ли функция, которая сможет сказать, входит ли значение в диапазон значения для int?
2 окт 13, 15:59    [14913242]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибок в триггере  [new]
Glory
Member

Откуда:
Сообщений: 104751
andy_111
входит ли значение

Значение какого типа ? Какая то константа ?
2 окт 13, 16:05    [14913318]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибок в триггере  [new]
Гость333
Member

Откуда:
Сообщений: 3683
andy_111
Реально ли сделать так, чтобы при переполнении в аггрегации вставка в таблицу 1 происходила бы, а вставка в таблицу 1_1 нет?

То есть вам нужно, чтобы в таблице 1_1 были неправильные данные? А в чём смысл?
2 окт 13, 16:07    [14913334]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибок в триггере  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74928
andy_111
Есть ли функция, которая сможет сказать, входит ли значение в диапазон значения для int?


Еще раз. Тип результата SUM зависит от типа выражения, к которому применяется эта функция. Для int будет int. Не посчитав сумму нельзя понять, выйдет ли результат за предел допустимых для int значений или нет, НО SUM() свалится с ошибкой переполнения, если в результате суммирования будет получено превышение.

Поэтому другого способа, кроме как привести к bigint, подсчитать сумма и только потом проверить, превышает ли она int или нет, нет.
2 окт 13, 16:10    [14913358]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить