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

Откуда:
Сообщений: 203
В базе есть триггер:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
CREATE TRIGGER [dbo].[No19Sens]  
    ON  [dbo].[SYS_DEV_DirtyData]  
    AFTER INSERT  
AS  
BEGIN  
 
    SET NOCOUNT ON;  
     
    update DD  
    SET dd.[digit_sens_num]&=~POWER(2,19-1)
    FROM inserted as i  
    inner join [dbo].[SYS_DEV_DirtyData] as dd on dd.id=i.id  
    inner join [dbo].[No19Sens_devices] as No19 on No19.device_code=i.device_code  
END
GO 

И есть две таблички, собственно No19Sens_devices в которой он ищет нужную запись и SYS_DEV_DirtyData в которую идет вставка. Цель триггера, чтобы записи из таблицы No19Sens_devices попадали в SYS_DEV_DirtyData с измененными данными, в поле digit_sens_num. Проблема заключается в том, что для каких то записей это поле меняется, а для каких то нет, хотя обе записи есть в таблице No19Sens_devices. Я совершенно не знаю куда копать, надеюсь на помощь.

Скрипты табличек:

+
SYS_DEV_DirtyData
SET ANSI_NULLS ON
GO
 
SET QUOTED_IDENTIFIER ON
GO
 
SET ANSI_PADDING ON
GO
 
CREATE TABLE [dbo].[SYS_DEV_DirtyData](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [device_code] [varchar](16) NOT NULL,
    [tele_time] [datetime] NOT NULL,
    [server_time] [datetime] NOT NULL,
    [transfer_time] [datetime] NOT NULL,
    [long] [float] NULL,
    [lat] [float] NULL,
    [valid] [char](1) NULL,
    [speed] [smallint] NULL,
    [direction] [smallint] NULL,
    [height] [smallint] NULL,
    [digit_sens_num] [int] NULL,
    [analog_sens_num] [int] NULL,
    [analog_data] [float] NULL,
    [flags] [int] NULL,
 CONSTRAINT [PK_SYS_DEV_DeviceData] PRIMARY KEY CLUSTERED  
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
 
GO
 
SET ANSI_PADDING OFF
GO
 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'долгота' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_DEV_DirtyData', @level2type=N'COLUMN',@level2name=N'long'
GO
 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'широта' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_DEV_DirtyData', @level2type=N'COLUMN',@level2name=N'lat'
GO
 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'скорость' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_DEV_DirtyData', @level2type=N'COLUMN',@level2name=N'speed'
GO
 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'направление' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_DEV_DirtyData', @level2type=N'COLUMN',@level2name=N'direction'
GO
 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'высота над уровнем моря' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_DEV_DirtyData', @level2type=N'COLUMN',@level2name=N'height'
GO
 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'номер цыфрового датчика' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_DEV_DirtyData', @level2type=N'COLUMN',@level2name=N'digit_sens_num'
GO
 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'номер аналогового датчика' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_DEV_DirtyData', @level2type=N'COLUMN',@level2name=N'analog_sens_num'
GO
 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'данные аналогового датчика' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_DEV_DirtyData', @level2type=N'COLUMN',@level2name=N'analog_data'
GO
 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Таблица данных от приборов' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_DEV_DirtyData'
GO
 


+
SET ANSI_NULLS ON
GO
 
SET QUOTED_IDENTIFIER ON
GO
 
SET ANSI_PADDING ON
GO
 
CREATE TABLE [dbo].[No19Sens_devices](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [device_code] [varchar](16) NOT NULL,
 CONSTRAINT [PK_No19Sens_devices] PRIMARY KEY CLUSTERED  
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
 
GO
 
SET ANSI_PADDING OFF
GO 


К сообщению приложен файл. Размер - 4Kb
28 дек 14, 02:49    [17063026]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером - не всегда срабатывает.  [new]
Ondayl
Member

Откуда:
Сообщений: 203
Версия сервера:
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)   Apr  2 2010 15:48:46   Copyright (c) Microsoft Corporation  Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600:) 
28 дек 14, 02:50    [17063028]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером - не всегда срабатывает.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Не срабатывает триггер и запрос внутри триггера производит не тоот результат - это разные вещи

Ondayl
Я совершенно не знаю куда копать,

Логировать/мониторить действия триггера и результаты, которые он производит
28 дек 14, 12:47    [17063398]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером - не всегда срабатывает.  [new]
MSSQLBug
Guest
Ondayl
Версия сервера:
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)   Apr  2 2010 15:48:46   Copyright (c) Microsoft Corporation  Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600:) 


Как насчёт обновиться до последнего service pack-а?
28 дек 14, 12:55    [17063421]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером - не всегда срабатывает.  [new]
lamer yuga
Guest
Ondayl,

вы уверены, что VARCHAR(16) идентичны для JOIN?
28 дек 14, 13:43    [17063549]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером - не всегда срабатывает.  [new]
Ondayl
Member

Откуда:
Сообщений: 203
Glory
Логировать/мониторить действия триггера и результаты, которые он производит

Я насколько знаю профайлером этого не сделать, да ?

автор
Как насчёт обновиться до последнего service pack-а?

Положительно. Просто целый год этот триггер работал без проблем с нынешней версией Sql server.

автор
вы уверены, что VARCHAR(16) идентичны для JOIN?

Тут не совсем понял вопроса, хотя в этой ситуации я ни в чем не уверен. Можно поподробнее ?
28 дек 14, 14:31    [17063654]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером - не всегда срабатывает.  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
Ondayl,

у вас есть скрипт который стабильно приводит к ошибке?
в чем вообще проблема
для начала добавьте в триггер
select * from inserted
select *
FROM inserted as i  
    inner join [dbo].[SYS_DEV_DirtyData] as dd on dd.id=i.id  
    inner join [dbo].[No19Sens_devices] as No19 on No19.device_code=i.device_code  
и исполните ваш скрипт - увидите данные
я предполагаю что у вас при апдейте для dd получается несколько значений
я по таким граблям ходил. очень тяжело ловить таие баги
если пишется update с from то я предпочитаю писать обновляемую таблицу сразу после from
тут с inner join то понятно что однозначно
но что будет если например left join я не понимаю
28 дек 14, 15:53    [17063830]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером - не всегда срабатывает.  [new]
Ondayl
Member

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

автор
у вас есть скрипт который стабильно приводит к ошибке?

К ошибке нет, но триггер при его исполнение не делает то, что должен, вот он:

INSERT INTO SYS_DEV_DirtyData
           ([device_code]
           ,[tele_time]
           ,[server_time]
           ,[transfer_time]
           ,[long]
           ,[lat]
           ,[valid]
           ,[speed]
           ,[direction]
           ,[height]
           ,[digit_sens_num]
           ,[analog_sens_num]
           ,[analog_data]
           ,[flags])
     VALUES
           ('01105055',
           GETDATE(), 
           GETDATE(), 
           GETDATE(), 
           NULL, 
           NULL,
           NULL, 
           NULL, 
           NULL, 
           NULL, 
           262144, 
           NULL, 
           NULL, 
           NULL)
GO 


Триггер должен сделать так, чтобы при вставке поле digit_sens_num было = 0. Так триггер делает со всеми остальными записями, кроме этой. В этом и проблема. Чем ему так не нравиться 01105055 я понять не могу.

То что вы писали я добавил, там получается одна строка со значением как раз таким значением, каким вставляю, ему тут негде запутаться.
28 дек 14, 18:26    [17064203]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером - не всегда срабатывает.  [new]
Ondayl
Member

Откуда:
Сообщений: 203
Тащемта желающих помочь могу пустить удаленкой. Лишь бы вопрос этот решить, весит мертвым грузом.
28 дек 14, 19:43    [17064430]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером - не всегда срабатывает.  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
Ondayl,

я не очень понимаю что вы тут конкретно делаете dd.[digit_sens_num]&=~POWER(2,19-1)
но попробуйте эти значения вывести в том-же селекте
select dd.[digit_sens_num], POWER(2,19-1),
dd.[digit_sens_num] & ~POWER(2,19-1)
FROM inserted as i  
    inner join [dbo].[SYS_DEV_DirtyData] as dd on dd.id=i.id  
    inner join [dbo].[No19Sens_devices] as No19 on No19.device_code=i.device_code  
28 дек 14, 19:49    [17064455]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером - не всегда срабатывает.  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
Ondayl
Тащемта желающих помочь могу пустить удаленкой. Лишь бы вопрос этот решить, весит мертвым грузом.
я email в профиле расшарил. пиши куда ходить
28 дек 14, 19:52    [17064472]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером - не всегда срабатывает.  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Ondayl
Чем ему так не нравиться 01105055 я понять не могу.
Тем, что в No19Sens_devices нет строк с таким device_code.
28 дек 14, 20:12    [17064562]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером - не всегда срабатывает.  [new]
Ondayl
Member

Откуда:
Сообщений: 203
invm, есть. Я гарнитурную это.
28 дек 14, 21:04    [17064752]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером - не всегда срабатывает.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
Ondayl
invm, есть. Я гарнитурную это.
Покажите, что есть.

17064455
28 дек 14, 22:45    [17065008]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером - не всегда срабатывает.  [new]
o-o
Guest
leov
Ondayl,
для начала добавьте в триггер
select * from inserted
select *
FROM inserted as i  
    inner join [dbo].[SYS_DEV_DirtyData] as dd on dd.id=i.id  
    inner join [dbo].[No19Sens_devices] as No19 on No19.device_code=i.device_code  

Ondayl
leov,
То что вы писали я добавил, там получается одна строка со значением как раз таким значением, каким вставляю, ему тут негде запутаться.

если вы вставили именно то, что написал leov, то при вставке и наличии той записи в No19Sens_devices,
вы не одну строку должны получить, а 2 резалтсета, в каждом по строке.
раз второй резалтсет пустой, то именно что записи нет в No19Sens_devices.

а лечится это просто.
картинкой покажите результат 3х запросов подряд: ваша вставка (где триггер отредактирован по совету leov) + 2 селекта как у меня:
INSERT INTO dbo.SYS_DEV_DirtyData
           ([device_code]           ,[tele_time]           ,[server_time]           ,[transfer_time]           ,[long]
           ,[lat]           ,[valid]           ,[speed]           ,[direction]           ,[height]           ,[digit_sens_num]
           ,[analog_sens_num]           ,[analog_data]           ,[flags])
     VALUES
           ('01105055',           GETDATE(),            GETDATE(),           GETDATE(),           NULL,           NULL,           NULL,            NULL, 
           NULL,           NULL,            262144,           NULL,           NULL,           NULL)

select *
from dbo.SYS_DEV_DirtyData 
where device_code = '01105055';

select *
from dbo.No19Sens_devices 
where device_code = '01105055';

и чтоб все в одном окне

К сообщению приложен файл. Размер - 22Kb
28 дек 14, 22:49    [17065022]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером - не всегда срабатывает.  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
o-o,

думаю что не стоит продолжать эту тему
мы поговорили с автором и там оказалась наведенная ошибка
там в триггере еще куча апдейтов которые перетирали результат
он просто не очень опытный и запутался
29 дек 14, 00:10    [17065252]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером - не всегда срабатывает.  [new]
Ondayl
Member

Откуда:
Сообщений: 203
Да, большая благодарность leov. Пока полет нормальный.
Если будут опять проблемы, подниму. Пока все хорошо.

автор
вы не одну строку должны получить, а 2 резалтсета, в каждом по строке.

Так и было, я просто не так выразился.
29 дек 14, 00:17    [17065270]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером - не всегда срабатывает.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
Ondayl
Так и было, я просто не так выразился.
o-o вам рассказал базовые правила отладки - нужно не "верить" и "знать", а просто поставить отладочный вывод "сразу после", или "сразу до" интересующего стейтмента, и всё выяснится за минуты, без бессоных ночей в тяжёлых гаданиях.
29 дек 14, 00:54    [17065326]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить