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

Откуда:
Сообщений: 204
Задача в следующем: Есть таблица chassis. В ней есть поле ip4. ip4 должен быть уникальным. Нужно написать триггер , который бы проверял на уникальность поле ip4 при обновлении , когда поле меняется. Т.е. если поле изменилось нужно проверить на уникальность, а если нет, то не нужно проверять. Вопрос в следующем: как мне в триггере считать предыдущее значение поля ip4 из таблицы chassis? привожу тригер

BEGIN
  declare @i int,@vmac varchar(250),@vv char(1),@vmac_old varchar(250),@state int,@manufacturer int;
  declare @vip varchar(250), @vss varchar(250),@vip_old varchar(250),@host varchar(250),@vid int, 
  @serial_number varchar(50), @code varchar(50), @ip_adress4 varchar(20);
    
  declare @ip_old varchar(20),@host_old varchar(250), @code_old varchar(50), @mac_old  varchar(250);
          
   
  select @vid = i.id from inserted i;  -- считаваю id обновляемой строки.
  
/********пытаюсь считать старые значения из базы. Как их считать????********/

select @ip_old = c.ip_adress4 
from chassis c 
where c.state not in (50000205,50000206) and c.id = @vid;
/****************/
  
    select @vmac=i.mac_address,
        --   @vip=i.ip_adress4,@vmac_old=d.mac_address,@vip_old=d.ip_adress4,
           @host=i.hostname,@vid=i.id ,@state=i.state, @serial_number=i.serial_number, 
           @code=i.code,   @ip_adress4=i.ip_adress4,@manufacturer=md.manufacturer
      from inserted i
      left join chassis_model md on md.id=i.model
    --left join deleted d on d.id=i.id;
      
  
-- здесь происходит проверка: если ip разные тогда нужно проводить проверку, а если одинаковые то не нужно

  if isnull(@ip_adress4,'')<>'' and @ip_old is not NULL and @ip_old <> @ip_adress4 and @state not in (50000205,50000206)
  begin
   select @i=count(id) from chassis where state not in (50000205,50000206)
   and ip_adress4=@ip_adress4 and id<>@vid;
   if isnull(@i,0)>0
    RAISERROR('поле IP_ADRESS должно быть уникальным %s , %s ,%i', 16, 1, @ip_old,@ip_adress4,@vid);
  end 
1 дек 14, 14:11    [16931306]     Ответить | Цитировать Сообщить модератору
 Re: Как считать предыдущее значение из таблицы в триггере.  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
да как в таблице deleted оно
1 дек 14, 14:12    [16931311]     Ответить | Цитировать Сообщить модератору
 Re: Как считать предыдущее значение из таблицы в триггере.  [new]
iap
Member

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

нужно сделать уникальный констрейнт. Он будет работать лучше триггера.
Если почитаете хелп, то узнаете, что старые значения полей можно вытащить в триггере из псевдотаблицы deleted.
1 дек 14, 14:13    [16931314]     Ответить | Цитировать Сообщить модератору
 Re: Как считать предыдущее значение из таблицы в триггере.  [new]
Glory
Member

Откуда:
Сообщений: 104751
relav
Вопрос в следующем: как мне в триггере считать предыдущее значение поля ip4 из таблицы chassis?

А там, где вы узнали про inserted ничего не было сказано про deleted ?

relav
Нужно написать триггер , который бы проверял на уникальность поле ip4 при обновлении , когда поле меняется. Т.е. если поле изменилось нужно проверить на уникальность, а если нет, то не нужно проверять.

А почему не уникальное ограничение а триггер ?
1 дек 14, 14:14    [16931321]     Ответить | Цитировать Сообщить модератору
 Re: Как считать предыдущее значение из таблицы в триггере.  [new]
iap
Member

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

обилие скалярных переменных в триггере почти всегда свидетельствует о говнокоде.
Спрашивается, как разместить миллион значений в одной переменной @vmac, например?
1 дек 14, 14:15    [16931326]     Ответить | Цитировать Сообщить модератору
 Re: Как считать предыдущее значение из таблицы в триггере.  [new]
relav
Member

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

спасибо
1 дек 14, 14:22    [16931361]     Ответить | Цитировать Сообщить модератору
 Re: Как считать предыдущее значение из таблицы в триггере.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Начинающие часто верят, что триггер срабатывает для каждой записи.
1 дек 14, 14:52    [16931549]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить