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

Откуда: Москва
Сообщений: 54
есть табличка с ценами на товары Prices, в которой время от времени обнуляются цены на произвольные товары. Дабы понять как что происходит сделал триггер на UPDATE в котором пытаюсь сохранить старое значение цены, новое и хост ну и дату-время. Но каким-то образом НЕКОТОРЫЕ измененные цены не попадают в журнал. Может есть у кого мысли, что тут сделано не так? Заранее благодарю.

табличка очень простая, id, product,price,pricelist - ничего лишнего ))

Выглядит треггер следующим образом:
USE [shop]
GO
/****** Object:  Trigger [dbo].[upd_price]    Script Date: 10/18/2013 11:49:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[upd_price]
   ON  [dbo].[Prices]
   AFTER UPDATE
AS 
BEGIN
SET NOCOUNT ON;	

declare @hostname varchar(100)
IF UPDATE(Price)
    select @hostname=hostname
      from master.dbo.sysprocesses
     where spid=@@spid
     
	insert into price_history
    select Prices.id,
           deleted.Price,
           inserted.Price,
           getdate(),
           @hostname
      from prices inner join inserted on prices.id=inserted.id     
                  inner join deleted on prices.id=deleted.id
END
18 окт 13, 12:08    [14997078]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на UPDATE  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Prg_Alex_
prices.id=deleted.id

Значение id не может меняться?

Таблицу price_history никакой вредитель не зачищает?

Триггер никто не отключает?
18 окт 13, 12:14    [14997156]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на UPDATE  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
а еще может быть, что эти цены вовсе и не update-ом меняли. а удалили запись со старой ценой и вставили с новой.
18 окт 13, 12:19    [14997205]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Prg_Alex_
Но каким-то образом НЕКОТОРЫЕ измененные цены не попадают в журнал. Может есть у кого мысли, что тут сделано не так?

delete from [dbo].[Prices] where id = 1
insert [dbo].[Prices] (id, ...) values(1, ...)
18 окт 13, 12:19    [14997207]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на UPDATE  [new]
Prg_Alex_
Member

Откуда: Москва
Сообщений: 54
Нет ни у кого. Отключить могу только я. Не отключал.
Id не меняется. Я так думаю )))
Может когда вносятся новые цены deleted.id как-то меняется. Но я думал, что все таки запись уже вставлена, значение по умолчанию там 0. Н у то есть может надо треггер на Insert как-то задействовать?
18 окт 13, 12:22    [14997228]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на UPDATE  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Странно написан IF, ибо от него зависит только присвоение @hostname
А вот для триггера begin и end и не нужны совсем.
18 окт 13, 12:23    [14997233]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на UPDATE  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
И нигде не проверяется, изменилась ли цена...
18 окт 13, 12:24    [14997244]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Prg_Alex_
Может когда вносятся новые цены deleted.id как-то меняется

Если при "вносятся новые цены" еще меняют и ID, то разумеется, что в prices.id и в deleted.id будкет разные значения
18 окт 13, 12:24    [14997251]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на UPDATE  [new]
Prg_Alex_
Member

Откуда: Москва
Сообщений: 54
Glory,
delete from [dbo].[Prices] where id = 1

Просто так цену удалить нельзя, только каскадно при удалении товара из связанной таблицы Products.

Когда заводится новый товар, в табличку Prices добавляются записи со старой ценой =0, иЮ если цену не поставили, то новая тоже 0, если поставили, то собственно ту цену которую INSERTили.

iap, про IF BEGIN END - правильно подмечено. Поправил.
18 окт 13, 12:32    [14997341]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на UPDATE  [new]
Prg_Alex_
Member

Откуда: Москва
Сообщений: 54
iap, а UPDATE()
18 окт 13, 12:38    [14997404]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на UPDATE  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Prg_Alex_
iap, а UPDATE()


update [dbo].[Prices]
set Price = Price


цена не меняется (остаётся прежняя), а триггер отработает
18 окт 13, 12:43    [14997458]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на UPDATE  [new]
Prg_Alex_
Member

Откуда: Москва
Сообщений: 54
Knyazev Alexey,

Да, это пусть отрабатывает. Со старой на такую же новую, главное чтобы не пропускал изменения. А он это делает.
18 окт 13, 12:49    [14997525]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на UPDATE  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Prg_Alex_
Просто так цену удалить нельзя, только каскадно при удалении товара из связанной таблицы Products.
Как это гарантируется?
Prg_Alex_
главное чтобы не пропускал изменения. А он это делает.
Чудес не бывает. Журналируйте еще вставки и удаления.

А журнал ваш не дает никакой информации для поиска проблемы. Там просто фиксируются старая и новая цена. А факт, что цена стала нулевой вам и так уже известен.
Гораздо эффективнее будет примерно такой триггер (конечно же, только если такой сценарий позволителен для бизнеса):
ALTER TRIGGER [dbo].[upd_price]
   ON  [dbo].[Prices]
   AFTER UPDATE
AS 
BEGIN
SET NOCOUNT ON;	

if exists(
 select
  1
 from
  inserted i join
  deleted d on d.id = i.id
 where
  i.Price = 0 and d.Price <> 0
)
begin
 raiserror('Zero-price catched!', 16, 1);
 rollback;
 return;
end;

END
Останется только ждать, пока кто-нибудь закричит...
18 окт 13, 13:59    [14998248]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить