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

Откуда:
Сообщений: 3
Задача: Необходимо копировать новые записи с таблицы 1 в таблицу 2, во второй таблице данные по полю (DeviceID) должны быть уникальны.

Структура таблицы 1:
- ID (int, not null); (Key)
- DeviceID (in, not null);
- DataDateTime (datetime, not null);
- Latitude (float, null);
- Longtitude (float, null);
- и т.д.

Структура таблицы 2
- DeviceID (in, not null); (Key)
- DataDateTime (datetime, not null);
- Latitude (float, null);
- Longtitude (float, null);

Реализация: В таблицу 1 добавлен триггер на добавление который проверяет наличие в таблицы 2 существующей записи по ключу и в случае (ИСТИНА) обновляет запись, иначе добавляет новую.
Проблема: Во время работы триггера, постепенно уменьшается количество добавляемых записей в таблицу 1, после (примерно) 1-3 часов перестают добавляться. После отключения триггера, таблица нормально обновляется новыми данными. Также если закомментировать участок кода отвечающий за обновление таблицы 2 проблема не возникает.

+

USE [база]
GO
/****** Object: Trigger [dbo].[CopyCoordinate] Script Date: 01.06.2016 11:44:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- Batch submitted through debugger:
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [dbo].[CopyCoordinate]
ON [dbo].[Coordinate]
AFTER INSERT
AS
BEGIN

IF EXISTS(SELECT [dbo].[LastCoordinate].DeviceID FROM [dbo].[LastCoordinate] INNER JOIN inserted ON inserted.DeviceID = [dbo].[LastCoordinate].DeviceID)
BEGIN
UPDATE [dbo].[LastCoordinate]
SET
LastCoordinate.DataDateTime = inserted.DataDateTime,
LastCoordinate.Latitude = inserted.Latitude,
LastCoordinate.Longtitude = inserted.Longtitude
FROM inserted
INNER JOIN [dbo].[LastCoordinate] LastCoordinate ON inserted.DeviceID = LastCoordinate.DeviceID
AND LastCoordinate.DataDateTime <= inserted.DataDateTime
END
ELSE
BEGIN
INSERT [dbo].[LastCoordinate]
SELECT [DeviceID]
,[DataDateTime]
,[Latitude]
,[Longtitude]
FROM inserted
END
END
1 июн 16, 12:11    [19244951]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с переносом данных с помощью триггера  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
MERGE [dbo].[LastCoordinate] C
USING inserted i ON C.DeviceID=i.DeviceID
WHEN MATCHED THEN UPDATE SET DataDateTime=i.DataDateTime,Latitude=i.Latitude,Longtitude=i.Longtitude
WHEN NOT MATCHED THEN INSERT(DeviceID,DataDateTime,Latitude,Longtitude)VALUES(i.DeviceID,i.DataDateTime,i.Latitude,i.Longtitude);
1 июн 16, 12:24    [19245056]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с переносом данных с помощью триггера  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Поправка:
MERGE [dbo].[LastCoordinate] C
USING inserted i ON C.DeviceID=i.DeviceID
WHEN MATCHED AND C.DataDateTime<=i.DataDateTime THEN UPDATE SET DataDateTime=i.DataDateTime,Latitude=i.Latitude,Longtitude=i.Longtitude
WHEN NOT MATCHED THEN INSERT(DeviceID,DataDateTime,Latitude,Longtitude)VALUES(i.DeviceID,i.DataDateTime,i.Latitude,i.Longtitude);
1 июн 16, 12:31    [19245110]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с переносом данных с помощью триггера  [new]
OlekasndrR
Member

Откуда:
Сообщений: 3
Огромное спасибо за "нормальный код", не то Г что у меня. Но все равно после 2х часов таблица 1 не заполняется.

Думаю если описать всю суть задачи, это поможет в решении.
Есть сервис который пишет в таблицу 1 новые координаты разных девайсов (машины, гаджеты с GPS и т.д.). Скорость заполнения примерно 2-20 сек по 30-40 девайсов. Таблица жутко огромная. Необходимо онлайн отображать где находится тот или иной девайс с периодичностью 2-20 сек. Решил создать таблицу 2 и триггером при добавлении строк в таблицу 1 анализировать, если в таблицу 2 такой девайс уже существует то просто обновим дату и координаты в противном случае добавим девайс.

Помогите советом, уже не знаю что делать. Заранее благодарен
1 июн 16, 15:52    [19246358]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с переносом данных с помощью триггера  [new]
Владислав Колосов
Member

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

MERGE именно это и выполняет.
1 июн 16, 17:41    [19246922]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с переносом данных с помощью триггера  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
OlekasndrR,

у вас там в блокировках не глохнет?
1 июн 16, 17:43    [19246937]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с переносом данных с помощью триггера  [new]
OlekasndrR
Member

Откуда:
Сообщений: 3
TaPaK
Если Вы скажите как это сделать то я посмотрю)
1 июн 16, 19:52    [19247421]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить