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

Откуда:
Сообщений: 193
Добрый день. Не могу написать простой триггер на вставку где будет исключаться дублирование записей

Ну например:

Create Table Categories (
[id_Category] [int] Identity (1, 1),
[Name] [varchar] (50) Not Null,
Constraint PK_id_Category Primary Key (id_Category)
)


Create Trigger [dbo].[Insert_Categories]
On [dbo].[Categories]
For Insert
As

 Select Name
 Into #Temp
 From Inserted I
 Where Not Exists (Select 1 From Categories C Where C.Name = I.Name)
 
 if @@ROWCOUNT <> 0 
 begin	
	Insert Into Categories
	Select Name
	From Inserted
 end 
 
 Drop Table #Temp


Подскажите в чем ошибка, запись все равно дублируется
18 июн 15, 16:49    [17788516]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
For insert триггер работает _после_ вставки записи в таблицу. А вы там еще один insert пишите.
18 июн 15, 16:56    [17788550]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры  [new]
RuslanSharipov
Member

Откуда:
Сообщений: 193
Гавриленко Сергей Алексеевич
For insert триггер работает _после_ вставки записи в таблицу. А вы там еще один insert пишите.


Before Insert получается использовать
18 июн 15, 16:57    [17788555]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры  [new]
iap
Member

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

во-первых, в момент запуска триггера FOR INSERT записи уже вставлены в таблицу - inserted фактически является частью таблицы, NOT EXISTS вернёт FALSE.
Стало быть, надо искать записи в таблице в количестве >=2.

Во-вторых, правильнее и проще создать констрейнт UNIQUE.
В-третьих, проверять на уникальность строковое поле - дело неблагодарное.
Одно и то же значение может быть записано разными способами, включая лишние пробелы,
разницу в регистре букв, наличие похожих визуально символов из разных языков и т.д.

И что там делает вставка в ту же таблицу??
18 июн 15, 16:58    [17788559]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
RuslanSharipov
Гавриленко Сергей Алексеевич
For insert триггер работает _после_ вставки записи в таблицу. А вы там еще один insert пишите.


Before Insert получается использовать
А он существует?
18 июн 15, 16:58    [17788564]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
RuslanSharipov
пропущено...


Before Insert получается использовать
А он существует?
Точнее, а он бывает?
18 июн 15, 16:59    [17788569]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры  [new]
RuslanSharipov
Member

Откуда:
Сообщений: 193
iap, эт я так)))

instead of Insert. Всем спасибо)))
18 июн 15, 17:01    [17788596]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
RuslanSharipov, триггер предназначены не для изменения данных, а для проверки их корректности. Используйте процедуру взамен. "Можно" не означает "нужно".
Для проверки качества добавляемых данных (дублей) используют уникальные индексы.
18 июн 15, 17:05    [17788627]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить