Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер на сравнение значений / 25 сообщений из 28, страница 1 из 2
27.05.2019, 19:51
    #39818954
darkvenger34
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
Здравствуйте, написал триггер,который, по идее должен сравнивать созданный номер телефон, с текущим.Не совсем понимаю,что не так ( Точнее я понимаю, что он всегда выдает мне сообщение прописанное в условии "print ('Номер существует')", ибо триггер работает после добавления кода, а как сделать по другому? триггер instead of insert тоже не подходит,ибо таблица с ключами, или я не совсем понимаю, как это все сделать.Буду благодарен за помощь.
код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TRIGGER [Telephone number]ON Номера for insert
AS
BEGIN
IF (EXISTS (SELECT Номера.[Номер телефона]
 FROM Номера, inserted I
 WHERE Номера.[Номер телефона] = I.[Номер телефона]))
	begin print ('Номер существует') end
END


Данный триггер, выдает сообщение при добавлении, даже если номер не совпадает с текущим.
...
Рейтинг: 0 / 0
27.05.2019, 19:59
    #39818958
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
Какое сообщение при добавлении какой командой?
...
Рейтинг: 0 / 0
27.05.2019, 22:08
    #39818992
darkvenger34
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
Сообщение - print ('Номер существует')
при Insert
Номер существует при добавлении любого значения в таблицу "Номера"
...
Рейтинг: 0 / 0
27.05.2019, 22:30
    #39818999
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
darkvenger34,

Созданный номер, текущий номер... вы какую то ерунду несете. Объясните по человечески что вы пытаетесь сделать и какой результат вам нужен?
Вам нужно чтобы не добавлялись дубликаты? Создайте уникальный индекс или ограничение.
...
Рейтинг: 0 / 0
28.05.2019, 01:13
    #39819035
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
darkvenger34Здравствуйте, написал триггер,который, по идее должен сравнивать созданный номер телефон, с текущим.Не совсем понимаю,что не так ( Точнее я понимаю, что он всегда выдает мне сообщение прописанное в условии "print ('Номер существует')", ибо триггер работает после добавления кода, а как сделать по другому?Наверное, не с "текущим" (что такое "текущий"?), а с номенрами, которые есть в этой таблице?
Тогда всё правильно, только нужно исключить из поиска тот номер, который вставлен, то есть
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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


Или попробовать решить задачу другим способом (например, если задача "не допустить дубликаты", то можно сделать уникальный констрейн)
...
Рейтинг: 0 / 0
28.05.2019, 14:26
    #39819310
darkvenger34
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
Если не понятно разяснил, то извиняюсь.
У меня есть Таблица - Номера.
В ней есть 2 поля:
1- Номер телефона
2- Код пациента (первичный ключ)
Я хотел сделать триггер, который сравнивает созданное значения номера с текущим
т.е если у меня есть номер - 123
я добавил номер 123, то будет вывод сообщения.
...
Рейтинг: 0 / 0
28.05.2019, 14:28
    #39819313
darkvenger34
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
alexeyvg,
Ошибка в этой строке " and Номера.[ID] <> I.[ID]))"
у меня нету поля ID в таблице номера
Да, мне нужно сравнить созданный номер запросом Insert с текущими номера в таблице Номер, если он есть, то выполнить условие, например Print('..').
...
Рейтинг: 0 / 0
28.05.2019, 14:30
    #39819317
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
darkvenger34alexeyvg,
Ошибка в этой строке " and Номера.[ID] <> I.[ID]))"
у меня нету поля ID в таблице номера
Да, мне нужно сравнить созданный номер запросом Insert с текущими номера в таблице Номер, если он есть, то выполнить условие, например Print('..').

это ж "бублегум" триггер, какой к чёрту принт в консоль
...
Рейтинг: 0 / 0
28.05.2019, 14:49
    #39819343
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
darkvenger34у меня нету поля ID в таблице номераКак это "нету поля ID в таблице номера", а это что?darkvenger342- Код пациента (первичный ключ)
...
Рейтинг: 0 / 0
28.05.2019, 14:53
    #39819348
darkvenger34
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
alexeyvg,

Извиняюсь, не понял, что ID- подразумевался как код пациента, все работает,проблема решена.Спасибо
...
Рейтинг: 0 / 0
28.05.2019, 14:54
    #39819350
darkvenger34
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
alexeyvg, правда я не знаю, что означает условие в запросе - "<>"
...
Рейтинг: 0 / 0
28.05.2019, 15:00
    #39819355
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
darkvenger34alexeyvg, правда я не знаю, что означает условие в запросе - "<>""Неравно", записывается в TSQL либо как <>, либо как !=
...
Рейтинг: 0 / 0
28.05.2019, 15:01
    #39819356
darkvenger34
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
alexeyvg,

ну !=, это очевидно
а <> 1 раз вижу, впрочем, спасибо,тема решена.
...
Рейтинг: 0 / 0
28.05.2019, 15:01
    #39819358
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
alexeyvgdarkvenger34у меня нету поля ID в таблице номераКак это "нету поля ID в таблице номера", а это что?darkvenger342- Код пациента (первичный ключ)

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

darkvenger34что означает условие в запросе - "<>"
...
Рейтинг: 0 / 0
28.05.2019, 15:04
    #39819361
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
darkvenger34а <> 1 раз вижуМожно было выделить мышкой и нажать кнопку "F1" :-)
...
Рейтинг: 0 / 0
28.05.2019, 15:06
    #39819364
darkvenger34
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
Это видимо рофл какой-то был, нет,Ключи первичный - Primary, если нужно.
Мне нужен был этот триггер, потому что у меня есть таблицы с 3 ключами (Код пациента)
В 1 - Номера
Во 2- Пациенты
В 3 - Регистрация на прием
Триггер предназначается чтобы избавится от избыточности данных, я конечно не специалист в sql, ну так это вижу
Если Номер существует, то он не заполняет его в таблицу а сразу переходит в таблицу Регистрация на прием, по существующему ключу по номеру.
Возможно можно было сделать все гораздо проще, но,как есть.
А первичный ключ я не поставил потому что, это не логично, если один и тот же пациент не может регистрироваться на прием дважды или >.
//- Я не понял, что вы от меня хотели своим ответом,поэтому просто пояснил,зачем мне нужен был этот триггер.
Всем спасибо.
...
Рейтинг: 0 / 0
28.05.2019, 15:14
    #39819373
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
darkvenger34Триггер предназначается чтобы избавится от избыточности данных, я конечно не специалист в sql, ну так это вижу
Если Номер существует, то он не заполняет его в таблицу а сразу переходит в таблицу Регистрация на прием, по существующему ключу по номеру.Триггер сработает, когда вы уже заполнили таблицу неправильными данными.
Поэтому нужно либо откатывать транзакцию, либо сделать триггер instead of, либо просто проверять наличие записи при перед вставкой данных, что самое правильное.
...
Рейтинг: 0 / 0
28.05.2019, 15:17
    #39819375
darkvenger34
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
alexeyvg, я прописал вместо print - Rollback transaction, а уже в c# ( я просто все манипуляции демонстрирую в с#) через try catch перехожу к заполнению следующий таблицы, если запрос не принимается
а так да, это скорее всего нужно делать через instead of, но я с ним особо не работал, да и триггеры мы особо не проходим, сам что-то пытаюсь делать.Я только на 3 курсе учусь, выковыриваюсь как могу)
...
Рейтинг: 0 / 0
28.05.2019, 15:17
    #39819376
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
alexeyvgdarkvenger34Триггер предназначается чтобы избавится от избыточности данных, я конечно не специалист в sql, ну так это вижу
Если Номер существует, то он не заполняет его в таблицу а сразу переходит в таблицу Регистрация на прием, по существующему ключу по номеру.Триггер сработает, когда вы уже заполнили таблицу неправильными данными.
Поэтому нужно либо откатывать транзакцию, либо сделать триггер instead of, либо просто проверять наличие записи при перед вставкой данных, что самое правильное.

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

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

то этому пациенту этот номер присвоить повторно инсертом не удастся и безо всякого триггера, как и никакой другой.
только какому нибудь другому пациенту, у которого еще нет ни одного номера.
...
Рейтинг: 0 / 0
28.05.2019, 15:23
    #39819381
darkvenger34
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
Посетитель, Я только сейчас это понял, что в принципе, что этот триггер выполняет теже функции как и первичный ключ, если я перехожу к другим таблицам через try catch..черт.
Ну, ладно. везде есть плюсы, зато в курсаче опишу еще 1 триггер)))).
Спасибо,что подметили
фак..:)
...
Рейтинг: 0 / 0
28.05.2019, 15:24
    #39819382
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
ТС, ещё про constraint почитайте
...
Рейтинг: 0 / 0
28.05.2019, 15:26
    #39819386
darkvenger34
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
Konst_One,
Да, я знаю,что такое ограничения, я не понял, как сделать,чтобы он запрещал добавлять номер телефона, который уже есть.Вроде триггер для этого больше подходит,ибо есть таблица inserted
...
Рейтинг: 0 / 0
28.05.2019, 15:33
    #39819392
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
можно с UDF сделать (производительность просядет, но в некоторых случаях оправданно), пример с просторов интернета =) :

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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); 
...
Рейтинг: 0 / 0
28.05.2019, 15:39
    #39819396
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
darkvenger34Konst_One,
Да, я знаю,что такое ограничения, я не понял, как сделать,чтобы он запрещал добавлять номер телефона, который уже есть.Вроде триггер для этого больше подходит,ибо есть таблица inserted

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

это несколько разные задачи.
...
Рейтинг: 0 / 0
28.05.2019, 15:45
    #39819402
darkvenger34
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на сравнение значений
Посетитель,
Отследить идентичный номер телефона, если он присутствует, то переходить к следующему действию.
Я думал, что для этого понадобится триггер, чтобы после отслеживания прервать запрос через rollback transaction, но так как, я все эти манипуляции делаю в c#. Я также мог просто добавить ключ, как подметили выше и в catch засунуть необходимый код.
Цель - данной темы, была отследить идентичный номер при добавлении, а дальше, там уже идет не много другая тема, задача уже решена и как я уже понял, ее можно было решить разным способами, основная цель выполнена, я отследил Идентичное значение из таблицы inserted с помощью триггера.
Всем спасибо.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер на сравнение значений / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]