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

Откуда: Москва
Сообщений: 18
Добрый день Всем.

У меня такая задачка.
Есть схема БД в ней есть таблица ObjectsMotions:

CREATE TABLE [dbo].[ObjectsMotions] (
    [ObjectMotionPointID]     BIGINT           IDENTITY (1, 1) NOT NULL,
    [ObjectID]                     INT               NULL,
    [DeviceID]                     INT               NULL,
    [NavTime]                DATETIME            NOT NULL,
    [SrvTime]                 DATETIME           NOT NULL,
    [Lat]                       DECIMAL (9, 6)     NOT NULL,
    [Lng]                      DECIMAL (9, 6)      NOT NULL,
    [Speed]                   SMALLINT            NOT NULL,
    [Course]                  SMALLINT            NOT NULL,
    [Sensors]                 INT                    NOT NULL,
    [SensType]              BIT                   CONSTRAINT [DF_ObjectsMotions_SensType]  DEFAULT ((0)) NOT NULL,
    [Valid]                     BIT                   CONSTRAINT [DF_ObjectsMotions_Valid]         DEFAULT ((1)) NOT NULL,
    [RunMode]               BIT                   CONSTRAINT [DF_ObjectsMotions_RunMode]    DEFAULT ((0)) NOT NULL,
    [DistMode]               BIT                   CONSTRAINT [DF_ObjectsMotions_DistMode]   DEFAULT ((0)) NOT NULL,
    [OnLine]                  BIT                   CONSTRAINT [DF_ObjectsMotions_OnLine]       DEFAULT ((1)) NOT NULL,
    [Analog]               DECIMAL (9, 3)      CONSTRAINT [DF_ObjectsMotions_Run]           DEFAULT ((-1.0)) NOT NULL,
    CONSTRAINT [PK_ObjectsMotions] PRIMARY KEY CLUSTERED ([ObjectMotionPointID] ASC) ON [ARCH],
    CONSTRAINT [CK_ObjectsMotions] CHECK (NOT ([ObjectID]=NULL AND [DeviceID]=NULL))
);


GO
CREATE NONCLUSTERED INDEX [IX_ObjectsMotions]
    ON [dbo].[ObjectsMotions]([ObjectID] ASC, [DeviceID] ASC, [NavTime] ASC)
    ON [ARCH];

GO


и 3 таблицы Event, EventStatus, EventType:

create table dbo.Event (
   ID                        bigint               identity,
   EventTypeID          int                  not null,
   EventStatusID        int                  not null,
   CreateTime           datetime           not null,
   LoginID                 int                        null,
   DeviceID               int                        null,
   IntValue1              int                        null,
   IntValue2              int                        null,
   IntValue3              int                        null,
   StrValue1              nvarchar(1024)       null,
   StrValue2              nvarchar(1024)       null,
   DateValue1            datetime                null,
   DateValue2            datetime                null,
   CLOBValue             ntext                     null,
   constraint PK_EVENT primary key (ID)
)
go

create index I_Event_TypeStatus on dbo.Event (
EventTypeID ASC,
EventStatusID ASC
)
go

create table dbo.EventStatus (
   ID                      int                      not null,
   Name                 nvarchar(64)         not null,
   Description          nvarchar(1024)           null,
   constraint PK_EVENTSTATUS primary key (ID)
)
go

create table dbo.EventType (
   ID                      int                      not null,
   Name                 nvarchar(64)         not null,
   Description          nvarchar(1024)       null,
   constraint PK_EVENTTYPE primary key (ID)
)
go


Надо написать триггер на таблицу ObjectMotions, который будет смотреть в поле Sensors и если там есть значения 16384,16896 - что соответствуют сигналу "тревожной кнопки" с GPS трекеров, вставлять запись в таблицу Event.
Где в Event-Status: "1" - New (С таким статусом должен генерировать триггер)
"-1" - Processed (Такой статус можно ставить, после того как в WEB-приложении (в данном случае клиент для MS SQL),
Event-Type: "1" - Срабатывание тревожной кнопки.
В качестве первичного ключа в т.Event (ID), взять значение ObjectMotionPointID из т.ObjectsMotions

Вот пример выборки из ObjectsMotions:
ObjectMotionPointID	ObjectID	DeviceID	NavTime	SrvTime	Lat	Lng	Speed	Course	Sensors	SensType	Valid	RunMode	DistMode	OnLine	Analog
192300	3	5	2013-06-10 11:15:07.000	2013-06-10 11:15:10.000	55.795075	37.565252	0	0	16384	0	1	0	0	1	0.000
192353	3	5	2013-06-10 11:20:42.000	2013-06-10 11:20:44.000	55.795075	37.565252	0	0	16384	0	1	0	0	1	0.000
192476	3	5	2013-06-10 11:37:13.000	2013-06-10 11:37:16.000	55.795075	37.565252	0	0	1024	0	1	0	0	1	0.000
192485	3	5	2013-06-10 11:37:53.000	2013-06-10 11:37:56.000	55.795075	37.565252	0	0	1024	0	1	0	0	1	0.000
192487	3	5	2013-06-10 11:38:33.000	2013-06-10 11:38:37.000	55.795075	37.565252	0	0	1024	0	1	0	0	1	0.000
192490	3	5	2013-06-10 11:39:13.000	2013-06-10 11:39:16.000	55.795075	37.565252	0	0	1024	0	1	0	0	1	0.000
192497	3	5	2013-06-10 11:39:53.000	2013-06-10 11:39:56.000	55.795075	37.565252	0	0	1024	0	1	0	0	1	0.000
192500	3	5	2013-06-10 11:40:33.000	2013-06-10 11:40:37.000	55.795075	37.565252	0	0	1024	0	1	0	0	1	0.000
192503	3	5	2013-06-10 11:41:13.000	2013-06-10 11:41:16.000	55.795075	37.565252	0	0	1024	0	1	0	0	1	0.000
192506	3	5	2013-06-10 11:41:53.000	2013-06-10 11:41:56.000	55.795075	37.565252	0	0	1024	0	1	0	0	1	0.000
192518	3	5	2013-06-10 11:42:33.000	2013-06-10 11:42:36.000	55.795075	37.565252	0	0	1024	0	1	0	0	1	0.000
192521	3	5	2013-06-10 11:43:13.000	2013-06-10 11:43:17.000	55.795075	37.565252	0	0	1024	0	1	0	0	1	0.000
192522	3	5	2013-06-10 11:43:53.000	2013-06-10 11:43:56.000	55.795075	37.565252	0	0	1024	0	1	0	0	1	0.000
192523	3	5	2013-06-10 11:44:33.000	2013-06-10 11:44:36.000	55.795075	37.565252	0	0	1024	0	1	0	0	1	0.000
192545	3	5	2013-06-10 11:45:13.000	2013-06-10 11:45:17.000	55.795075	37.565252	0	0	1024	0	1	0	0	1	0.000
192547	3	5	2013-06-10 11:45:53.000	2013-06-10 11:45:57.000	55.795075	37.565252	0	0	1024	0	1	0	0	1	0.000
192556	3	5	2013-06-10 11:46:33.000	2013-06-10 11:46:36.000	55.795075	37.565252	0	0	1024	0	1	0	0	1	0.000
234555	3	5	2010-01-01 00:02:08.000	2013-06-18 08:01:46.000	55.795020	37.565405	0	0	16896	0	0	0	0	1	0.000


Вот код который пытаюсь написать:
CREATE TRIGGER OnInsert_OM ON ObjectsMotions
AFTER INSERT AS --FOR ObjectsMotions

DECLARE    @ObjectID_inc int,
		@DeviceID_inc int,
		@EventTypeID_inc int,
		@is_Empty int

SET @ObjectID_inc=0
SET @DeviceID_inc=0
SET @EventTypeID_inc=0

BEGIN

select case when exists(select * from [NIS-PLATFORM].dbo.Event) then (@is_Empty=0) else (@is_Empty=1) end

IF @is_Empty=0
	BEGIN

INSERT INTO [Event]
(ID, EventTypeID, EventStatusID, CreateTime, LoginID, DeviceID,StrValue1)
SELECT ObjectMotionPointID, 
           1, 
	   1,
	   SYSDATETIME(),
	   0,
	   DeviceID,
	   Sensors 
FROM Inserted I                             --LEFT JOIN ObjectsMotions OM ON I.Sensors in (16384, 16896) --I.KeyField = A.KeyField
WHERE I.Sensors in (16384,16896)    --[NIS-PLATFORM].[dbo].ObjectsMotions.Sensors = 16384,16896
-- end
-- ELSE

ELSE
  -- нужно пробежаться по всем записям где в поле Sensors есть значения 16384,16896 и в цикле заполнить таблицу Event


END


Картинка с другого сайта.
1 июл 13, 03:00    [14502874]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
Пишите в "Работу".
Возможно, Вам что-то ещё придётся "дорисовывать" в задаче...

Триггеры пишутся (для MSSQL) на T-SQL, но ни как не на Паскале...

PS Это будет всего честнее...
1 июл 13, 07:23    [14502973]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
ZeoNRF
Member

Откуда: Москва
Сообщений: 18
Я в T-SQL новичок поэтому и спросил как лучше написать триггер.
1 июл 13, 09:41    [14503364]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
aleks2
Guest
ZeoNRF
В качестве первичного ключа в т.Event (ID), взять значение ObjectMotionPointID из т.ObjectsMotions

Чо за бред? А нафега тогда
ZeoNRF
create table dbo.Event (
ID bigint identity,
1 июл 13, 09:46    [14503384]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
aleks2
ZeoNRF
В качестве первичного ключа в т.Event (ID), взять значение ObjectMotionPointID из т.ObjectsMotions

Чо за бред? А нафега тогда
ZeoNRF
create table dbo.Event (
ID bigint identity,
Алекс, ну о чём тут говорить?
Достаточно посмотреть на SELECT CASE ... в опубликованном "триггере".
Что можно посоветовать человеку, который не удосужился залезать в справку,
когда писал текст на непонятном ему языке?!
1 июл 13, 09:53    [14503422]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
Glory
Member

Откуда:
Сообщений: 104751
ZeoNRF
Вот код который пытаюсь написать:

Начните просто с написания select-а, который по "таблицу ObjectMotions, который будет смотреть в поле Sensors и если там есть значения 16384,16896 - что соответствуют сигналу "тревожной кнопки" с GPS трекеров"
1 июл 13, 10:57    [14503774]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
ZeoNRF
Member

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

запросы который выводит значения написать очень просто:

select * from [NIS-PLATFORM].[dbo].ObjectsMotions
WHERE Sensors in (16384,16896)


Вопрос как лучше написать триггер.
1 июл 13, 13:17    [14504782]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
ZeoNRF
Вопрос как лучше написать триггер.
Прежде чем его писать, надо разобраться, что он делать должен.
Вы поняли, что aleks2 написал?
1 июл 13, 13:32    [14504895]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
Glory
Member

Откуда:
Сообщений: 104751
ZeoNRF
Вопрос как лучше написать триггер.

Заменить в вашем запросе [NIS-PLATFORM].[dbo].ObjectsMotions на inserted
1 июл 13, 14:14    [14505241]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
ZeoNRF
Member

Откуда: Москва
Сообщений: 18
Вы можете просто привести пример триггера, который следить за изменением и сравнивает значение в таблице №1 и при совпадении сравниваемых значений вставляет найденное в таблицу №2, при этом есть условие если таблица № 2 пустая, то надо пройтись по всем записям таблицы №1 и вставить массив значений из таб.№2 в таб.№1, иначе просто проверять на обновление таб.№1 и обновлять таб.№2 единичное записью.
1 июл 13, 14:45    [14505494]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
Glory
Member

Откуда:
Сообщений: 104751
ZeoNRF
Вы можете просто привести пример триггера, который следить за изменением и сравнивает значение в таблице №1 и при совпадении сравниваемых значений вставляет найденное в таблицу №2, при этом есть условие если таблица № 2 пустая, то надо пройтись по всем записям таблицы №1 и вставить массив значений из таб.№2 в таб.№1, иначе просто проверять на обновление таб.№1 и обновлять таб.№2 единичное записью.

Т.е. написать вам весь ваш триггер ?

С какой проблемой вы столкнулись ?
Если с незнанием синтаксиса, то для его изучение есть хелп
1 июл 13, 14:50    [14505529]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
ZeoNRF
Member

Откуда: Москва
Сообщений: 18
2 Glory ,

Долго не занимался разработкой на T-SQL, поэтому и попросил Вас о этом.
1 июл 13, 15:17    [14505689]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
Glory
Member

Откуда:
Сообщений: 104751
ZeoNRF
поэтому и попросил Вас о этом.

Задания под ключ дают в формуе Работа
1 июл 13, 15:25    [14505728]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
pirovindos
Member

Откуда:
Сообщений: 517
Судя по
ZeoNRF
Надо написать триггер на таблицу ObjectMotions, который будет смотреть в поле Sensors и если там есть значения 16384,16896 - что соответствуют сигналу "тревожной кнопки" с GPS трекеров, вставлять запись в таблицу Event.
Где в Event-Status: "1" - New (С таким статусом должен генерировать триггер)
"-1" - Processed (Такой статус можно ставить, после того как в WEB-приложении (в данном случае клиент для MS SQL),
Event-Type: "1" - Срабатывание тревожной кнопки.
В качестве первичного ключа в т.Event (ID), взять значение ObjectMotionPointID из т.ObjectsMotions

нужно оценить правильность постановки задачи.
Навскидку:
1. Наверняка только два значения для тревожной кнопки: 16384,16896 - ошибка, там должна быть проверка на равенство 9-го бита единице.
2. Вешать триггер на вставку сообщения от GPS-трекера - путь, приводящий к большим проблемам при хоть какой-то реальной нагрузке. События будут наверняка более сложными чем "Тревожная кнопка", например, "Вход в геозону, позже чем через полчаса после включения зажигания" - тоже триггер в СУБД писать? В таких системах прикладную обработку телеметрии, особенно требующей немедленной реакции, обычно выносят из СУБД.
1 июл 13, 18:46    [14506889]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить