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

Откуда:
Сообщений: 15
Здравствуйте, написал триггер,который, по идее должен сравнивать созданный номер телефон, с текущим.Не совсем понимаю,что не так ( Точнее я понимаю, что он всегда выдает мне сообщение прописанное в условии "print ('Номер существует')", ибо триггер работает после добавления кода, а как сделать по другому? триггер instead of insert тоже не подходит,ибо таблица с ключами, или я не совсем понимаю, как это все сделать.Буду благодарен за помощь.
код:
CREATE TRIGGER [Telephone number]ON Номера for insert
AS
BEGIN
IF (EXISTS (SELECT Номера.[Номер телефона]
 FROM Номера, inserted I
 WHERE Номера.[Номер телефона] = I.[Номер телефона]))
	begin print ('Номер существует') end
END

Данный триггер, выдает сообщение при добавлении, даже если номер не совпадает с текущим.

Сообщение было отредактировано: 27 май 19, 19:58
27 май 19, 19:51    [21895152]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36695
Какое сообщение при добавлении какой командой?
27 май 19, 19:59    [21895156]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
darkvenger34
Member

Откуда:
Сообщений: 15
Сообщение - print ('Номер существует')
при Insert
Номер существует при добавлении любого значения в таблицу "Номера"
27 май 19, 22:08    [21895211]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
darkvenger34,

Созданный номер, текущий номер... вы какую то ерунду несете. Объясните по человечески что вы пытаетесь сделать и какой результат вам нужен?
Вам нужно чтобы не добавлялись дубликаты? Создайте уникальный индекс или ограничение.
27 май 19, 22:30    [21895222]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30790
darkvenger34
Здравствуйте, написал триггер,который, по идее должен сравнивать созданный номер телефон, с текущим.Не совсем понимаю,что не так ( Точнее я понимаю, что он всегда выдает мне сообщение прописанное в условии "print ('Номер существует')", ибо триггер работает после добавления кода, а как сделать по другому?
Наверное, не с "текущим" (что такое "текущий"?), а с номенрами, которые есть в этой таблице?
Тогда всё правильно, только нужно исключить из поиска тот номер, который вставлен, то есть
CREATE TRIGGER [Telephone number]ON Номера for insert
AS
BEGIN
IF (EXISTS (SELECT Номера.[Номер телефона]
 FROM Номера, inserted I
 WHERE Номера.[Номер телефона] = I.[Номер телефона]
    and Номера.[ID] <> I.[ID]))
	begin print ('Номер существует') end
END

Или попробовать решить задачу другим способом (например, если задача "не допустить дубликаты", то можно сделать уникальный констрейн)
28 май 19, 01:13    [21895286]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
darkvenger34
Member

Откуда:
Сообщений: 15
Если не понятно разяснил, то извиняюсь.
У меня есть Таблица - Номера.
В ней есть 2 поля:
1- Номер телефона
2- Код пациента (первичный ключ)
Я хотел сделать триггер, который сравнивает созданное значения номера с текущим
т.е если у меня есть номер - 123
я добавил номер 123, то будет вывод сообщения.
28 май 19, 14:26    [21895731]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
darkvenger34
Member

Откуда:
Сообщений: 15
alexeyvg,
Ошибка в этой строке " and Номера.[ID] <> I.[ID]))"
у меня нету поля ID в таблице номера
Да, мне нужно сравнить созданный номер запросом Insert с текущими номера в таблице Номер, если он есть, то выполнить условие, например Print('..').
28 май 19, 14:28    [21895735]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
darkvenger34
alexeyvg,
Ошибка в этой строке " and Номера.[ID] <> I.[ID]))"
у меня нету поля ID в таблице номера
Да, мне нужно сравнить созданный номер запросом Insert с текущими номера в таблице Номер, если он есть, то выполнить условие, например Print('..').


это ж "бублегум" триггер, какой к чёрту принт в консоль
28 май 19, 14:30    [21895740]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30790
darkvenger34
у меня нету поля ID в таблице номера
Как это "нету поля ID в таблице номера", а это что?
darkvenger34
2- Код пациента (первичный ключ)
28 май 19, 14:49    [21895791]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
darkvenger34
Member

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

Извиняюсь, не понял, что ID- подразумевался как код пациента, все работает,проблема решена.Спасибо
28 май 19, 14:53    [21895801]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
darkvenger34
Member

Откуда:
Сообщений: 15
alexeyvg, правда я не знаю, что означает условие в запросе - "<>"
28 май 19, 14:54    [21895804]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30790
darkvenger34
alexeyvg, правда я не знаю, что означает условие в запросе - "<>"
"Неравно", записывается в TSQL либо как <>, либо как !=
28 май 19, 15:00    [21895813]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
darkvenger34
Member

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

ну !=, это очевидно
а <> 1 раз вижу, впрочем, спасибо,тема решена.
28 май 19, 15:01    [21895814]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
Посетитель
Member

Откуда:
Сообщений: 1384
alexeyvg
darkvenger34
у меня нету поля ID в таблице номера
Как это "нету поля ID в таблице номера", а это что?
darkvenger34
2- Код пациента (первичный ключ)


ох, не уверен я, что первичный ключ вдруг не окажется на самом деле foreign key, с учетом того, что пациент даже не знает

darkvenger34
что означает условие в запросе - "<>"
28 май 19, 15:01    [21895816]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30790
darkvenger34
а <> 1 раз вижу
Можно было выделить мышкой и нажать кнопку "F1" :-)
28 май 19, 15:04    [21895822]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
darkvenger34
Member

Откуда:
Сообщений: 15
Это видимо рофл какой-то был, нет,Ключи первичный - Primary, если нужно.
Мне нужен был этот триггер, потому что у меня есть таблицы с 3 ключами (Код пациента)
В 1 - Номера
Во 2- Пациенты
В 3 - Регистрация на прием
Триггер предназначается чтобы избавится от избыточности данных, я конечно не специалист в sql, ну так это вижу
Если Номер существует, то он не заполняет его в таблицу а сразу переходит в таблицу Регистрация на прием, по существующему ключу по номеру.
Возможно можно было сделать все гораздо проще, но,как есть.
А первичный ключ я не поставил потому что, это не логично, если один и тот же пациент не может регистрироваться на прием дважды или >.
//- Я не понял, что вы от меня хотели своим ответом,поэтому просто пояснил,зачем мне нужен был этот триггер.
Всем спасибо.
28 май 19, 15:06    [21895826]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30790
darkvenger34
Триггер предназначается чтобы избавится от избыточности данных, я конечно не специалист в sql, ну так это вижу
Если Номер существует, то он не заполняет его в таблицу а сразу переходит в таблицу Регистрация на прием, по существующему ключу по номеру.
Триггер сработает, когда вы уже заполнили таблицу неправильными данными.
Поэтому нужно либо откатывать транзакцию, либо сделать триггер instead of, либо просто проверять наличие записи при перед вставкой данных, что самое правильное.
28 май 19, 15:14    [21895840]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
darkvenger34
Member

Откуда:
Сообщений: 15
alexeyvg, я прописал вместо print - Rollback transaction, а уже в c# ( я просто все манипуляции демонстрирую в с#) через try catch перехожу к заполнению следующий таблицы, если запрос не принимается
а так да, это скорее всего нужно делать через instead of, но я с ним особо не работал, да и триггеры мы особо не проходим, сам что-то пытаюсь делать.Я только на 3 курсе учусь, выковыриваюсь как могу)
28 май 19, 15:17    [21895843]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
Посетитель
Member

Откуда:
Сообщений: 1384
alexeyvg
darkvenger34
Триггер предназначается чтобы избавится от избыточности данных, я конечно не специалист в sql, ну так это вижу
Если Номер существует, то он не заполняет его в таблицу а сразу переходит в таблицу Регистрация на прием, по существующему ключу по номеру.
Триггер сработает, когда вы уже заполнили таблицу неправильными данными.
Поэтому нужно либо откатывать транзакцию, либо сделать триггер instead of, либо просто проверять наличие записи при перед вставкой данных, что самое правильное.


если в таблице номеров

автор
2- Код пациента (первичный ключ)


то этому пациенту этот номер присвоить повторно инсертом не удастся и безо всякого триггера, как и никакой другой.
только какому нибудь другому пациенту, у которого еще нет ни одного номера.
28 май 19, 15:17    [21895844]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
darkvenger34
Member

Откуда:
Сообщений: 15
Посетитель, Я только сейчас это понял, что в принципе, что этот триггер выполняет теже функции как и первичный ключ, если я перехожу к другим таблицам через try catch..черт.
Ну, ладно. везде есть плюсы, зато в курсаче опишу еще 1 триггер)))).
Спасибо,что подметили
фак..:)
28 май 19, 15:23    [21895855]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
ТС, ещё про constraint почитайте
28 май 19, 15:24    [21895856]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
darkvenger34
Member

Откуда:
Сообщений: 15
Konst_One,
Да, я знаю,что такое ограничения, я не понял, как сделать,чтобы он запрещал добавлять номер телефона, который уже есть.Вроде триггер для этого больше подходит,ибо есть таблица inserted
28 май 19, 15:26    [21895860]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
можно с UDF сделать (производительность просядет, но в некоторых случаях оправданно), пример с просторов интернета =) :

CREATE FUNCTION dbo.CheckVenueCapacity (@venue_id int, @capacity int)
RETURNS int
AS 
BEGIN
  DECLARE @retval int
    SELECT @retval = CASE WHEN venue_max_capacity >= @capacity THEN 0 ELSE 1 END
    FROM venues
    WHERE venue_id = @venue_id 
  RETURN @retval
END;
GO

ALTER TABLE events 
  ADD CONSTRAINT chkVenueCapacity 
  CHECK (dbo.CheckVenueCapacity(event_venue_id, event_expected_attendance) = 0); 
28 май 19, 15:33    [21895869]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
Посетитель
Member

Откуда:
Сообщений: 1384
darkvenger34
Konst_One,
Да, я знаю,что такое ограничения, я не понял, как сделать,чтобы он запрещал добавлять номер телефона, который уже есть.Вроде триггер для этого больше подходит,ибо есть таблица inserted


каша у вас пока в голове.
какую именно цель вы преследуете?
запретить привязывать пациенту более одного номера телефона?
или запретить привязывать один номер более чем одному пациенту?
или запретить привязывать один номер одному пациенту более одного раза?

это несколько разные задачи.
28 май 19, 15:39    [21895877]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на сравнение значений  [new]
darkvenger34
Member

Откуда:
Сообщений: 15
Посетитель,
Отследить идентичный номер телефона, если он присутствует, то переходить к следующему действию.
Я думал, что для этого понадобится триггер, чтобы после отслеживания прервать запрос через rollback transaction, но так как, я все эти манипуляции делаю в c#. Я также мог просто добавить ключ, как подметили выше и в catch засунуть необходимый код.
Цель - данной темы, была отследить идентичный номер при добавлении, а дальше, там уже идет не много другая тема, задача уже решена и как я уже понял, ее можно было решить разным способами, основная цель выполнена, я отследил Идентичное значение из таблицы inserted с помощью триггера.
Всем спасибо.
28 май 19, 15:45    [21895885]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить