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

Откуда:
Сообщений: 494
Есть таблица t2

CREATE TABLE [dbo].[t2](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[idT1] [int] NULL,
	[number] [int] NULL
) ON [PRIMARY]

insert into t2 values (2,5)


Есть запись с idT1=2 и number=5. Хочу сделать триггер который при добавлении с одинаковым idT1 складывал number.

Допустим добавляем следующую запись insert into t2 values (2,7) и в итоге получаем одну запись idT1=2 и number=12.

Если insert into t2 values (8,7) то тогда добавляется.

CREATE TRIGGER Test
ON t2
FOR INSERT
as
DECLARE @id int,
        @number int,
        @old int
set @id = (SELECT idT1 from inserted)
set @number = (SELECT number from inserted)
set @old = (SELECT sum(number) from t2 where idT1 = @id)
if exists(select * from t2
                 where idT1 = @id)
BEGIN
SET NOCOUNT ON;
update t2 set
num = @old+ @number
where t2.idT1=@id
end

Подскажите как правильно
18 ноя 11, 20:06    [11623097]     Ответить | Цитировать Сообщить модератору
 Re: Простой TRIGGER  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Я бы триггер INSTEAD OF сделал.
18 ноя 11, 20:17    [11623119]     Ответить | Цитировать Сообщить модератору
 Re: Простой TRIGGER  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
А может, сложение реализовать не при внесении данных, а при выборке?
18 ноя 11, 20:21    [11623125]     Ответить | Цитировать Сообщить модератору
 Re: Простой TRIGGER  [new]
prBoris
Member

Откуда:
Сообщений: 494
Jovanny,

Спасибо сделал так работает

CREATE TRIGGER Test
ON t2
INSTEAD OF INSERT
as
DECLARE @id int,
        @number int,
        @old int
set @id = (SELECT idT1 from inserted)
set @number = (SELECT number from inserted)
set @old = (SELECT sum(number) from t2 where idT1 = @id)
if exists(select * from t2
                 where idT1 = @id)
BEGIN
SET NOCOUNT ON;
update t2 set
number = @old+ @number
where t2.idT1=@id
end else
begin
insert into t2 values (@id,@number)
end
18 ноя 11, 20:33    [11623166]     Ответить | Цитировать Сообщить модератору
 Re: Простой TRIGGER  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
ну не хотите как хотите
18 ноя 11, 20:35    [11623173]     Ответить | Цитировать Сообщить модератору
 Re: Простой TRIGGER  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
prBoris,

что работает?!
А если две записи одним INSERTом вставят - что будет? Чему будет равно @id и @number?
Одним словом, говнокод.
18 ноя 11, 20:40    [11623192]     Ответить | Цитировать Сообщить модератору
 Re: Простой TRIGGER  [new]
Baddy
Member

Откуда: Харьков
Сообщений: 174
prBoris,

делай MERGE, если версия позволяет
18 ноя 11, 20:44    [11623204]     Ответить | Цитировать Сообщить модератору
 Re: Простой TRIGGER  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
iap
prBoris,

что работает?!
А если две записи одним INSERTом вставят - что будет? Чему будет равно @id и @number?
Одним словом, говнокод.

+1
видел даже где-то голосовалка на коннекте, чтоб убрали из примеров присваивание в триггерах значений из служебных таблиц локальным переменным, не знай, есть там оно сейчас или пофиксили, не смотрел хелпу.

prBoris,
Я бы лучше предложил сделать агрегированную вьюху, например. Практика показывает что иногда имеют место быть разборки кто что добавил. Или опять же пользователь, добавил запись, но ошибся - надо удалить, надо тоже предусмотреть. Во вьюхе просто, а вам писать доп триггер. Либо, если пользователь обновил запись. Хотя может быть, специфика задачи у вас это исключает...
18 ноя 11, 20:49    [11623226]     Ответить | Цитировать Сообщить модератору
 Re: Простой TRIGGER  [new]
prBoris
Member

Откуда:
Сообщений: 494
iap,

Вы правы говнотригер получился, лучше сделать вьюхой ...
19 ноя 11, 13:35    [11624832]     Ответить | Цитировать Сообщить модератору
 Re: Простой TRIGGER  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
prBoris
iap,

Вы правы говнотригер получился, лучше сделать вьюхой ...
Что мешает забыть про переменные и использовать inserted напрямую?
19 ноя 11, 16:44    [11625086]     Ответить | Цитировать Сообщить модератору
 Re: Простой TRIGGER  [new]
londinium
Member

Откуда: Киев
Сообщений: 1199
а, может, когда-то сделают в SQL SERVER триггер FOR EACH ROW
19 ноя 11, 20:30    [11625636]     Ответить | Цитировать Сообщить модератору
 Re: Простой TRIGGER  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
londinium
а, может, когда-то сделают в SQL SERVER триггер FOR EACH ROW
Что это даст?
Я не имею ничего против, но интересно, что имеется в виду?
19 ноя 11, 21:29    [11625869]     Ответить | Цитировать Сообщить модератору
 Re: Простой TRIGGER  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
londinium
а, может, когда-то сделают в SQL SERVER триггер FOR EACH ROW
Не дай бог!

Научиться писать правильно триггеры - дело 5-ти минут, просто один раз прочесть страничку хелпа на русском языке с примерами и попробовать.

А с триггером FOR EACH ROW "простокодеры" не будут заморачиваться правильностью, а будут лабать "простокод" :-)
19 ноя 11, 22:02    [11625970]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить