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

Откуда:
Сообщений: 545
Есть триггер на инсерт. Как добавилась новая строка триггер срабатывает и пишет эту строчку в другую таблицу. Я чайник, все ли я так делаю. Поделитесь опытом, поправите скрипты если необходимо.
BEGIN
	DECLARE
		@unitId int,
		@receivedOn datetime,
		@sentOn datetime,
		@latitude real,
		@longitude real,
		@speed int
	BEGIN TRY
		BEGIN transaction
			SELECT 
				@unitId = [dbo].[block_id],
				@sentOn = [dbo].[last_coord],
				@latitude = [dbo].[mmd_state].[lat],
				@longitude = [dbo].[lon],
				@speed = [dbo].[speed]	
			FROM INSERTED
		UPDATE [dbo].[LastPosition]
			SET
				[sentOn] = @sentOn,
				[latitude] = @latitude,
				[longitude] = @longitude,
				[speed] = @speed,
			WHERE [unitId] = @unitId	
		COMMIT transaction
		END
	END TRY
	BEGIN CATCH
		raiserror('Ошибка',16,-1)	
		PRINT 'Error: ' + ERROR_NUMBER();
		PRINT 'Error: ' + ERROR_SEVERITY();
		PRINT 'Error: ' + ERROR_STATE();
		PRINT 'Error: ' + ERROR_PROCEDURE();
		PRINT 'Error: ' + ERROR_LINE();    
		PRINT 'Error: ' + ERROR_MESSAGE();
		ROLLBACK transaction
	END CATCH
END
24 окт 11, 21:27    [11491930]     Ответить | Цитировать Сообщить модератору
 Re: Обычный триггер или я переборщил?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Все на так вы делаете. Ваш try/catch можете просто выкинуть, а пока выкидываете, подумайте, что будет, если одновременно в вашу таблицу добавится две строки.
24 окт 11, 21:29    [11491938]     Ответить | Цитировать Сообщить модератору
 Re: Обычный триггер или я переборщил?  [new]
iljy
Member

Откуда:
Сообщений: 8711
2king2,

вы делаете неправильно буквально все. Почему-то люди совершенно не задумываются, что будет, если в таблицу будет добавлено более одной записи. Или ни одной записи. Что мешает сразу использовать таблицу INSERTED для выполнения UPDATE?
24 окт 11, 21:30    [11491944]     Ответить | Цитировать Сообщить модератору
 Re: Обычный триггер или я переборщил?  [new]
iljy
Member

Откуда:
Сообщений: 8711
2king2,

и открывать транзакцию в триггере совершенно незачем, он и так внутри транзакции выполняется по любому.
24 окт 11, 21:35    [11491960]     Ответить | Цитировать Сообщить модератору
 Re: Обычный триггер или я переборщил?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
iljy
2king2,

и открывать транзакцию в триггере совершенно незачем, он и так внутри транзакции выполняется по любому.
До отката не дойдет - все принты честно попадают на конвертации строки в int.
24 окт 11, 21:37    [11491969]     Ответить | Цитировать Сообщить модератору
 Re: Обычный триггер или я переборщил?  [new]
2king2
Member

Откуда:
Сообщений: 545
iljy
Что мешает сразу использовать таблицу INSERTED для выполнения UPDATE?


Как это сделать, покажите пожалуйста.
24 окт 11, 21:43    [11492005]     Ответить | Цитировать Сообщить модератору
 Re: Обычный триггер или я переборщил?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Гавриленко Сергей Алексеевич
iljy
2king2,

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

А я тут про откат даже и не думал, само открытие бессмысленно.
24 окт 11, 22:15    [11492126]     Ответить | Цитировать Сообщить модератору
 Re: Обычный триггер или я переборщил?  [new]
iljy
Member

Откуда:
Сообщений: 8711
2king2
iljy
Что мешает сразу использовать таблицу INSERTED для выполнения UPDATE?


Как это сделать, покажите пожалуйста.

UPDATE t1
SET ...
FROM [dbo].[LastPosition] t1 JOIN INSERTED i
			ON ...
24 окт 11, 22:15    [11492130]     Ответить | Цитировать Сообщить модератору
 Re: Обычный триггер или я переборщил?  [new]
2king2
Member

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

Ok, разабрался. У не может возникнуть ситуация что баца куда пишет данные трригер может отвалится на время. Как поступить чобы данные не потерались?
25 окт 11, 10:39    [11493324]     Ответить | Цитировать Сообщить модератору
 Re: Обычный триггер или я переборщил?  [new]
2king2
Member

Откуда:
Сообщений: 545
Гавриленко Сергей Алексеевич
Все на так вы делаете. Ваш try/catch можете просто выкинуть, а пока выкидываете, подумайте, что будет, если одновременно в вашу таблицу добавится две строки.


try/catch вставляю по следующей причине. В триггере вызывается хранимка которая пишит в другие базы. Хранимку я не могу редактировать. Но мне надо сделать так чтобы если в хранимке произошла ошибка (например база стала не достумной) в триггер должна вернутся ошибка (если я правильно понимаю) и тогда чтобы не потерять данные я их запишу в резервную буферную таблицу.
25 окт 11, 10:45    [11493371]     Ответить | Цитировать Сообщить модератору
 Re: Обычный триггер или я переборщил?  [new]
iljy
Member

Откуда:
Сообщений: 8711
2king2,

не надо в триггере использовать объекты, которые могут становиться недоступны. Триггер должен отрабатывать очень быстро. Для таких вещей существуют асинхронные механизмы, например Service Brocker. Можно также попробовать настроить репликацию локальной таблицы или копировать данные заданием каждые 1-2-5-20 минут, сколько можете задержку позволить.
25 окт 11, 10:51    [11493418]     Ответить | Цитировать Сообщить модератору
 Re: Обычный триггер или я переборщил?  [new]
q_w_e_r_t_y
Guest
2king2
Есть триггер на инсерт. Как добавилась новая строка триггер срабатывает и пишет эту строчку в другую таблицу.
...
		UPDATE [dbo].[LastPosition]
...

А в dbo.LastPosition уже есть такие строки?_
25 окт 11, 12:23    [11494394]     Ответить | Цитировать Сообщить модератору
 Re: Обычный триггер или я переборщил?  [new]
2king2
Member

Откуда:
Сообщений: 545
Все сдаюсь. Пока выполняется триггер таблица источник блокируется. И сыпятся ошибки приложений которые льют инфу в базу. Если руками выполнять то все гуд. А вот триггер все рушит.
25 окт 11, 16:29    [11497060]     Ответить | Цитировать Сообщить модератору
 Re: Обычный триггер или я переборщил?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
2king2,

кривые руки, Илья уже сказал , что надо делать. Топиков с тригерами ,вашего типа обработки, на фоуме по нескольку раз в месяц всплывают, посмотрите их.
25 окт 11, 17:53    [11497938]     Ответить | Цитировать Сообщить модератору
 Re: Обычный триггер или я переборщил?  [new]
2king2
Member

Откуда:
Сообщений: 545
iljy
2king2,

не надо в триггере использовать объекты, которые могут становиться недоступны. Триггер должен отрабатывать очень быстро. Для таких вещей существуют асинхронные механизмы, например Service Brocker. Можно также попробовать настроить репликацию локальной таблицы или копировать данные заданием каждые 1-2-5-20 минут, сколько можете задержку позволить.


Последний вопрос. Вроде задачу сформулировали. Есть база туда льются данные со страшной скоростью (только инсерт). Необходимо как только появляется новая запись ее забрать произвести операции (арифметические или еще какие то ...) . И записать в другую базу. Средствами триггера такое реализовать не получилось из-за слишком тяжелых манипуляций в триггере (блокируется таблица на запись по этой причине).

Как я понял это можно реализовать этот механизм на Service Brocker. Т.е. по триггеру данные отдаем в Service Brocker, нам они обрабатываются и затем сразу кладутся в другую базу (как быстро данные смогу попасть в нужную базу?), а если база не доступна Service Brocker аккумулирует данные в себе пока не станет доступна база для записи. Это реально реализовать???
26 окт 11, 11:49    [11501074]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить