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

Откуда:
Сообщений: 15
Доброго времени суток.
Есть база MS SQL 2008. Необходимо менять значение одного поля в таблице в зависимости от его значения. Написал запрос update:
update dbo.pLogData
set timeval = DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval)
where (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '08:30:00' and '08:59:59')
and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%')


Сделал абсолютно простейший триггер for insert:
create trigger trpTimeLogData_Inserted_Updated on dbo.plogdata
for insert
as 
begin
update dbo.pLogData
set timeval = DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval)
where (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '08:30:00' and '08:59:59')
and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%')
end


И запрос и триггер работают, всё хорошо. Вот только хотелось бы чтоб данные менялись ещё до вставки в таблицу. Если я правильно понимаю то мне нужен триггер Instead OF, но как мне его реализовать в коде не знаю, а сделать нужно до конца недели. Помогите?
28 мар 17, 09:36    [20339619]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
iiyama
Member

Откуда:
Сообщений: 642
Сиволапый,

а в чем у Вас затруднение?

в instead of insert triggere делаете insert в базовую таблицу значений из inserted модифицируя Ваше поле timeval в CASE по критерию, указанному в where в триггере trpTimeLogData_Inserted_Updated
28 мар 17, 10:02    [20339764]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31780
Сиволапый
Сделал абсолютно простейший триггер for insert:
Ваш триггер при вставке одной записи будет менять все записи в таблице.
Нехороший код, хотя визуально ошибки вы можете какое то время не заметить.
Сиволапый
Если я правильно понимаю то мне нужен триггер Instead OF, но как мне его реализовать в коде не знаю, а сделать нужно до конца недели. Помогите?
Да просто вставляете из inserted, меняя поле timeval.
28 мар 17, 10:09    [20339818]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
Сиволапый
Member

Откуда:
Сообщений: 15
Да вот в синтаксисе у меня проблема :)
28 мар 17, 12:10    [20340746]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
Сиволапый
Member

Откуда:
Сообщений: 15
USE [ORION120TEST]
GO
/****** Object:  Trigger [dbo].[insteadof]    Script Date: 03/28/2017 14:28:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[insteadof] on [dbo].[pLogData]
instead of insert
as 
begin
select timeval HozOrgan 
from inserted
where (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '08:30:00' and '08:59:59')
and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%')
/* set timeval = DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval)
insert timeval into dbo.plogdata */
end


На данный момент я вот на этом остановился, по идее, дальше нужно модифицировать значение и вставить его в dbo.plogdata... Вот не могу правильно это написать...
28 мар 17, 12:49    [20340948]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
Сиволапый
Member

Откуда:
Сообщений: 15
Остановился, в том смысле что данный код в Management Studio хотя бы ошибок не выдает :)

P.S. Извиняюсь что каждый раз создаю новое сообщение, не могу найти кнопку редактировать...
28 мар 17, 12:51    [20340962]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31780
Сиволапый
На данный момент я вот на этом остановился, по идее, дальше нужно модифицировать значение и вставить его в dbo.plogdata... Вот не могу правильно это написать...
"Модифицировать" - так, как вы это написали в UPDATE
DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval)

Вставить - командой INSERT
28 мар 17, 15:27    [20342028]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
iiyama
Member

Откуда:
Сообщений: 642
Сиволапый,
Зачем Вы в триггере фильтруете inserted по критерию UPDATE?
inserted содержит тот набор данных, который вы уже определили в инструкции UPDATE, которая инициализировала срабатывание триггера. Перейдите по ссылке выше и ознакомьтесь с документацией иначе общение будет бесполезным
28 мар 17, 15:31    [20342049]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
Сиволапый
Member

Откуда:
Сообщений: 15
После долги мучительных проб и ошибок, получилось следующее:
USE [ORION120TEST]
GO
/****** Object:  Trigger [dbo].[trpTimeLogData_Inserted_Updated]    Script Date: 03/28/2017 16:51:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[trpTimeLogData_Inserted_Updated] on [dbo].[pLogData]
instead of insert
as
begin
set nocount on
select * into #tmp from inserted
update #tmp set timeval = DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval)
where (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '08:30:00' and '08:59:59')
and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%')
insert into plogdata select * from #tmp
drop table #tmp
end


На вид - работает. Посмотрите опытным взглядом, все тут верно?
Заранее спасибо.
28 мар 17, 15:40    [20342112]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
iiyama
Member

Откуда:
Сообщений: 642
Сиволапый,

Прошу прощения, что отвечаю вопросом на вопрос(но это определит ответ), у Вас реальная производственная задача и Вы не программист или Вы изучаете MSSQL (студент)?
28 мар 17, 15:54    [20342196]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
Сиволапый
Member

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

Задача реальная, производственная. Я не программист. И не студент тоже. Я IT инженер, сети, серверы, инфраструктура. Поставили задачу, открыл Managment Studio и начал читать и пробовать писать. Я первый раз провожу столько времени в Management Studio :)
Просто задачу нужно решить, а делать тяп ляп запросами, планировщиком задач и sqlcmd не захотел. Вот полез дальше...
28 мар 17, 18:40    [20343148]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
iiyama
Member

Откуда:
Сообщений: 642
Сиволапый,
ок, распишу как Вашу постановку понял я
1. У Вас какое-то приложение пишет лог в БД. Операция insert
2. Для определенных данных исходя из критерия:
 (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '08:30:00' and '08:59:59')
and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%')

вам нужно чтобы в лог записалось не то значение [timeval], которое передает приложение в команде insert,а измененное
DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval)
3. Для данных, которые не удовлетворяют п.2 поле [timeval] записывается без изменений

Если это так, то
1. приложение шлет insert
2. срабытывает триггер
ALTER trigger [dbo].[trpTimeLogData_Inserted_Updated] on [dbo].[pLogData]
instead of insert
as
begin
set nocount on;

insert into  [dbo].[pLogData] values([timeval], [перечисляете остальные столбцы которые вставляете ]
select
case 
when
 (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '08:30:00' and '08:59:59')
and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%')
then DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval)
else [timeval]
end,  [перечисляете остальные столбцы которые вставляете ]
from inserted

end
28 мар 17, 19:25    [20343316]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
Сиволапый
Member

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

Да, именно так. Но только у меня вот этих условий:

when
 (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '08:30:00' and '08:59:59')
and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%')
then DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval)


будет пять штук. На разное время и с разными расчётами. Сейчас просто не на работе, не могу проверить, как будет работать эта конструкция с несколькими when :) И по поводу столбцов, если я меняю только один столбец, перечислять я должен все равно ВСЕ имеющиеся в данной таблице столбцы?
Ещё ради интереса хотел бы узнать чем плоха моя "конструкция"? :) Ну помимо того, что она выдергивает целиком все данные в новую таблицу...

Спасибо Вам за помощь!
28 мар 17, 20:04    [20343433]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31780
Сиволапый
Ещё ради интереса хотел бы узнать чем плоха моя "конструкция"?
Какая из них?
Последняя вставляет только те записи, которые нужно изменить, а правильные теряет, не вставляет.
Триггер instead of выполняется вместо вставки, если вы сами там не вставите, то записей не будет.

Сиволапый
не могу проверить, как будет работать эта конструкция с несколькими when
Хорошо будет работать, в каждом when будет проверять условие, и как только наткнётся на истинное, то его и выполнит.
28 мар 17, 20:50    [20343554]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
Сиволапый
Member

Откуда:
Сообщений: 15
Что то у меня опять с синтаксисом проблема, вот на это:

USE [ORION120TEST]
GO
/****** Object:  Trigger [dbo].[trpTimeLogData_Inserted_Updated]    Script Date: 03/28/2017 16:51:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[trpTimeLogData_Inserted_Updated] on [dbo].[pLogData]
instead of insert
as
begin
set nocount on;

insert into  [dbo].[pLogData] values([timeval], [NumCom], [IDComp], [Par1], [Par2], [Par3], [Par4], [Event], [IndexKey], [RazdIndex], [HozOrgan], [HozGuest], [Remark], [DoorIndex], [Mode], [DeviceTime], [VEvent], [ZReserv], [ZoneIndex], [ReaderIndex], [Sign], [tpRzdIndex], [tpPar4], [IndexZone], [tpIndex], [GUID])
select
case
 
when
(HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '08:30:00' and '08:59:59')
and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%')
then DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval)

when
HozOrgan = '116'
and  (CAST (timeval as time) between  '09:00:00' and '09:29:59')
and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%')
then DATEADD (minute, DATEPART (minute, timeval) % 10 - 40 - DATEPART (minute, timeval), timeval)

when
(HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '12:00:00' and '12:29:59')
and (Remark LIKE '%2: Выход%' or Remark LIKE '%3: Выход%' or Remark LIKE '%1: Выход%')
then DATEADD (minute, DATEPART (minute, timeval) % 10 + 30 - DATEPART (minute, timeval), timeval)

when
(HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '14:00:00' and '14:29:59')
and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%')
then DATEADD (minute, DATEPART (minute, timeval) % 10 - 15 - DATEPART (minute, timeval), timeval)

when
(HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '17:30:00' and '17:59:59')
and (Remark LIKE '%2: Выход%' or Remark LIKE '%3: Выход%' or Remark LIKE '%1: Выход%')
then DATEADD (minute, DATEPART (minute, timeval) % 10 + 5 + DATEPART (hour, timeval), timeval)

else [timeval]
end, ([timeval], [NumCom], [IDComp], [Par1], [Par2], [Par3], [Par4], [Event], [IndexKey], [RazdIndex], [HozOrgan], [HozGuest], [Remark], [DoorIndex], [Mode], [DeviceTime], [VEvent], [ZReserv], [ZoneIndex], [ReaderIndex], [Sign], [tpRzdIndex], [tpPar4], [IndexZone], [tpIndex], [GUID])
from inserted

end


он мне говорит - Сообщение 102, уровень 15, состояние 1, процедура trpTimeLogData_Inserted_Updated, строка 42
Неправильный синтаксис около конструкции ",".

Пробовал убирать запятую, скобки, никак не работает. Пните?
29 мар 17, 08:01    [20344388]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
o-o
Guest
убирайте скобки после case-а и не inserte, а inserted
29 мар 17, 09:18    [20344584]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31780
Сиволапый
Неправильный синтаксис около конструкции ",".

Пробовал убирать запятую, скобки, никак не работает. Пните?
У вас в select перечисляются выводимые поля.
И смотрите, написано
select (поле, формируемое case), (поле1, поле2, ...)

Видите, почему то поля после case указаны в скобках.
Как это серверу понимать???
29 мар 17, 09:22    [20344610]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
iiyama
Member

Откуда:
Сообщений: 642
Сиволапый,
Пару советов.
1. Для отладки триггера закоментируйте insert
--insert into  [dbo].[pLogData] values([timeval], [NumCom], [IDComp], [Par1], [Par2], [Par3], [Par4], [Event], [IndexKey], [RazdIndex], [HozOrgan], [HozGuest], [Remark], [DoorIndex], [Mode], [DeviceTime], [VEvent], [ZReserv], [ZoneIndex], [ReaderIndex], [Sign], [tpRzdIndex], [tpPar4], [IndexZone], [tpIndex], [GUID])
вместо вставки вам отобразится что вы пытаетесь добавить.

2. Если выводится ошибка и не понимаете где она, закомментируйте подозрительный блок /* подозрительный блок */. Если ошибка пропала, и не понимаете где ошибка в блоке, то разбивайте его на более мелкие и тестируйте

Удачи
29 мар 17, 09:27    [20344637]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
Сиволапый
Member

Откуда:
Сообщений: 15
USE [ORION120TEST]
GO
/****** Object:  Trigger [dbo].[trpTimeLogData_Inserted_Updated]    Script Date: 03/28/2017 16:51:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[trpTimeLogData_Inserted_Updated] on [dbo].[pLogData]
instead of insert
as
begin
set nocount on;

insert into [dbo].[pLogData]
(
TimeVal
, NumCom
, IDComp
, Par1
, Par2
, Par3
, Par4
, Event
, IndexKey
, RazdIndex
, HozOrgan
, HozGuest
, Remark
, DoorIndex
, Mode
, DeviceTime
, VEvent
, ZReserv
, ZoneIndex
, ReaderIndex
, Sign
, tpRzdIndex
, tpPar4
, IndexZone
, tpIndex
, GUID)
select
case
 
when
(HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '08:30:00' and '08:59:59')
and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%')
then DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval)

when
HozOrgan = '116'
and  (CAST (timeval as time) between  '09:00:00' and '09:29:59')
and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%')
then DATEADD (minute, DATEPART (minute, timeval) % 10 - 40 - DATEPART (minute, timeval), timeval)

when
(HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '12:00:00' and '12:29:59')
and (Remark LIKE '%2: Выход%' or Remark LIKE '%3: Выход%' or Remark LIKE '%1: Выход%')
then DATEADD (minute, DATEPART (minute, timeval) % 10 + 30 - DATEPART (minute, timeval), timeval)

when
(HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '14:00:00' and '14:29:59')
and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%')
then DATEADD (minute, DATEPART (minute, timeval) % 10 - 15 - DATEPART (minute, timeval), timeval)

when
(HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '17:30:00' and '17:59:59')
and (Remark LIKE '%2: Выход%' or Remark LIKE '%3: Выход%' or Remark LIKE '%1: Выход%')
then DATEADD (minute, DATEPART (minute, timeval) % 10 + 5 + DATEPART (hour, timeval), timeval)

else [TimeVal]
end
, [NumCom]
, [IDComp]
, [Par1]
, [Par2]
, [Par3]
, [Par4]
, [Event]
, [IndexKey]
, [RazdIndex]
, [HozOrgan]
, [HozGuest]
, [Remark]
, [DoorIndex]
, [Mode]
, [DeviceTime]
, [VEvent]
, [ZReserv]
, [ZoneIndex]
, [ReaderIndex]
, [Sign]
, [tpRzdIndex]
, [tpPar4]
, [IndexZone]
, [tpIndex]
, [GUID]
from inserted
end


Как то вот так...
29 мар 17, 12:45    [20345832]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
Сиволапый
Member

Откуда:
Сообщений: 15
Было бы здорово услышать мнение о "Как то вот так" :) Просто сейчас я делаю все на копии основной базы, на вид оно все работает, но когда повешаю этот триггер на основную базу, а в нем вдруг что то будет не так, не приятно получится...
29 мар 17, 13:58    [20346349]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31780
Сиволапый
Было бы здорово услышать мнение о "Как то вот так" :) Просто сейчас я делаю все на копии основной базы, на вид оно все работает, но когда повешаю этот триггер на основную базу, а в нем вдруг что то будет не так, не приятно получится...
Всё правильно, но, конечно, вам самому нужно проверять логику в case...when
29 мар 17, 14:06    [20346424]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
Сиволапый
Member

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

Эта логика проверена уже на несколько десятков раз :)
А ещё я хотел спросить у Вас, относительно вот этой моей "конструкции":
USE [ORION120TEST]
GO
/****** Object:  Trigger [dbo].[trpTimeLogData_Inserted_Updated]    Script Date: 03/28/2017 16:51:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[trpTimeLogData_Inserted_Updated] on [dbo].[pLogData]
instead of insert
as
begin
set nocount on
select * into #tmp from inserted
update #tmp set timeval = DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval)
where (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '08:30:00' and '08:59:59')
and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%')
insert into plogdata select * from #tmp
drop table #tmp
end


Вы говорили, что данная конструкция, теряет правильные записи. Я просто не совсем понял что имеется в виду под правильными записями. Если имеется в виду, что, например триггером было изменено значение времени с 08:45 на 08:25, то под правильной записью подразумевается 08:45? Теряются они, если я правильно понял из-за использования update, т.к. он находя соответствующую условию запись обновляет её... И если это так, то тогда куда же деваются правильные записи тут:
USE [ORION120TEST]
GO
/****** Object:  Trigger [dbo].[trpTimeLogData_Inserted_Updated]    Script Date: 03/28/2017 16:51:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[trpTimeLogData_Inserted_Updated] on [dbo].[pLogData]
instead of insert
as
begin
set nocount on;

insert into [dbo].[pLogData]
(
TimeVal
, NumCom
, IDComp
, Par1
, Par2
, Par3
, Par4
, Event
, IndexKey
, RazdIndex
, HozOrgan
, HozGuest
, Remark
, DoorIndex
, Mode
, DeviceTime
, VEvent
, ZReserv
, ZoneIndex
, ReaderIndex
, Sign
, tpRzdIndex
, tpPar4
, IndexZone
, tpIndex
, GUID)
select
case
 
when
(HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '08:30:00' and '08:59:59')
and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%')
then DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval)

when
HozOrgan = '116'
and  (CAST (timeval as time) between  '09:00:00' and '09:29:59')
and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%')
then DATEADD (minute, DATEPART (minute, timeval) % 10 - 40 - DATEPART (minute, timeval), timeval)

when
(HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '12:00:00' and '12:29:59')
and (Remark LIKE '%2: Выход%' or Remark LIKE '%3: Выход%' or Remark LIKE '%1: Выход%')
then DATEADD (minute, DATEPART (minute, timeval) % 10 + 30 - DATEPART (minute, timeval), timeval)

when
(HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '14:00:00' and '14:29:59')
and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%')
then DATEADD (minute, DATEPART (minute, timeval) % 10 - 15 - DATEPART (minute, timeval), timeval)

when
(HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570')
and  (CAST (timeval as time) between  '17:30:00' and '17:59:59')
and (Remark LIKE '%2: Выход%' or Remark LIKE '%3: Выход%' or Remark LIKE '%1: Выход%')
then DATEADD (minute, DATEPART (minute, timeval) % 10 + 5 + DATEPART (hour, timeval), timeval)

else [TimeVal]
end
, [NumCom]
, [IDComp]
, [Par1]
, [Par2]
, [Par3]
, [Par4]
, [Event]
, [IndexKey]
, [RazdIndex]
, [HozOrgan]
, [HozGuest]
, [Remark]
, [DoorIndex]
, [Mode]
, [DeviceTime]
, [VEvent]
, [ZReserv]
, [ZoneIndex]
, [ReaderIndex]
, [Sign]
, [tpRzdIndex]
, [tpPar4]
, [IndexZone]
, [tpIndex]
, [GUID]
from inserted
end
29 мар 17, 14:18    [20346514]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31780
Сиволапый
Вы говорили, что данная конструкция, теряет правильные записи. Я просто не совсем понял что имеется в виду под правильными записями.
Да, это правильно работает, я просто не заметил, что там в #temp вставляется всё без условий.
29 мар 17, 14:40    [20346678]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead of  [new]
Сиволапый
Member

Откуда:
Сообщений: 15
Спасибо всем за помощь!
29 мар 17, 14:51    [20346784]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить