Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Триггер. Непонятки  [new]
uiop123
Guest
CREATE TRIGGER dbo.AIU_InsertSensorsLog
   ON  dbo.Sp_UU
   AFTER INSERT, UPDATE
AS 
BEGIN
	if not exists(select * from inserted)
      return;
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	
	Declare @mon int;
	Declare @Cod smallint;

    -- Insert statements for trigger here
    select @mon = Monitored , @Cod = Cod
    from inserted;
    if @mon = 1 
      if not exists(select 1 from SensorsLog
                	where Cod = @Cod)
	  begin
		Insert Into SensorsLog(cod, last_date)	
		Values(@Cod, getdate())
      end;

END


Все отлично работает, если обновлять одну запись в таблице Sp_UU, но если обновлять несколько записей, то в таблицу логов заносится только одна запись.

Что не так?
3 июл 15, 13:21    [17848311]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Непонятки  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
uiop123
Что не так?
	Declare @mon int;
	Declare @Cod smallint;

    -- Insert statements for trigger here
    select @mon = Monitored , @Cod = Cod
    from inserted;
3 июл 15, 13:27    [17848373]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Непонятки  [new]
Glory
Member

Откуда:
Сообщений: 104760
uiop123
Что не так?

А вы хотели, чтобы после

select @mon = Monitored , @Cod = Cod
from inserted;

в переменных @mon и @Cod оказались все записи ?
3 июл 15, 13:27    [17848376]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Непонятки  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
uiop123
CREATE TRIGGER dbo.AIU_InsertSensorsLog
   ON  dbo.Sp_UU
   AFTER INSERT, UPDATE
AS 
BEGIN
	if not exists(select * from inserted)
      return;
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	
	Declare @mon int;
	Declare @Cod smallint;

    -- Insert statements for trigger here
    select @mon = Monitored , @Cod = Cod
    from inserted;
    if @mon = 1 
      if not exists(select 1 from SensorsLog
                	where Cod = @Cod)
	  begin
		Insert Into SensorsLog(cod, last_date)	
		Values(@Cod, getdate())
      end;

END


Все отлично работает, если обновлять одну запись в таблице Sp_UU, но если обновлять несколько записей, то в таблицу логов заносится только одна запись.

Что не так?


как написано, так и работает. Обрабатывается одна запись из таблицы inserted

select @mon = Monitored , @Cod = Cod
from inserted;
3 июл 15, 13:27    [17848381]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Непонятки  [new]
uiop123
Guest
А как надо?
3 июл 15, 13:28    [17848398]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Непонятки  [new]
iap
Member

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

какая необходимость в этих скалярных переменных (@mon, @Cod)?
Как они могут содерожать в себе несколько значений одновременно?
3 июл 15, 13:28    [17848403]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Непонятки  [new]
Glory
Member

Откуда:
Сообщений: 104760
uiop123
А как надо?

надо оперировать всей таблицей inserted
3 июл 15, 13:29    [17848415]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Непонятки  [new]
uiop123
Guest
iap,

А как сделать чтобы обрабатывались все записи? Перебирать inserted в цикле?
3 июл 15, 13:30    [17848428]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Непонятки  [new]
Glory
Member

Откуда:
Сообщений: 104760
uiop123
Перебирать inserted в цикле?

Вы не умеете писать запросы с 2мя и более таблицами ?
3 июл 15, 13:31    [17848448]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Непонятки  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
uiop123
А как надо?


что-то такое может быть

Insert Into SensorsLog(cod, last_date)
select i.Cod, getdate() from inserted i
where not exists(seelct 1 from SensorsLog s where s.Cod = i.Cod )
3 июл 15, 13:33    [17848466]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Непонятки  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Winnipuh
uiop123
А как надо?


что-то такое может быть

Insert Into SensorsLog(cod, last_date)
select i.Cod, getdate() from inserted i
where not exists(seelct 1 from SensorsLog s where s.Cod = i.Cod )


только не совсем понятно, у вас если Cod записался полгода назад вы его больше никогда не запишете в свой лог?
почему бы не писать всё или скажем не перезаписывать?
3 июл 15, 13:34    [17848476]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Непонятки  [new]
komrad
Member

Откуда:
Сообщений: 5249
uiop123
iap,

А как сделать чтобы обрабатывались все записи? Перебирать inserted в цикле?


ну как-то так, наверно, при условии, что Monitored либо 1, либо 0 :

if (select sum(Monitored) from inserted)>1
	begin
		insert 
			into SensorLog(cod,last_date)
		select Сod, getdate()
			from inserted 
		where Сod not in (select Сod from SensorLog)
	end
3 июл 15, 13:34    [17848482]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Непонятки  [new]
uiop123
Guest
Winnipuh,

Спасибо! Получилось
3 июл 15, 13:44    [17848578]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить