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

Откуда:
Сообщений: 28
Работаю над БД, в которой имеется 7 таблиц. Необходимо сделать так, чтобы в одну из таблиц в определенном поле были либо уникальные значения, либо NULL - тип столбца Unique не подходит. Почитал книги и посмотрел данный форум, в котором нашел примерно следующую методику решения данной проблемы: создать триггер, который будет проверять поле на уникальность. Никогда до этого с триггерами не работал, поэтому решил сперва написать тестовый пример. Определение таблиц БД:
CREATE TABLE [Entity1]
(
 [Attribute1] Char(100) NULL,
 [Attribute2] Char(100) NULL,
 [Attribute3] Char(100) NULL
)
go

Теперь пишу следующий триггер:
CREATE TRIGGER MyTrigger2
	ON [Entity1]
	FOR INSERT
AS
	IF EXISTS(
				SELECT * 
				FROM [inserted] 
				WHERE inserted.[Attribute1]=[Attribute1]
			  )
	BEGIN
		RAISERROR('Нельзя вставлять дубляж', 17,1)		;
		ROLLBACK TRANSACTION;
	END
GO

Но такой триггер вообще не дает вставлять какие-либо данные в Entity1.
Подскажите пожалуйста, что делаю не так и как можно исправить?
23 апр 12, 13:23    [12456390]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на уникальность столбца с помощью триггера  [new]
Glory
Member

Откуда:
Сообщений: 104751
WHERE inserted.[Attribute1]=[Attribute1] - так это условие для добавляемой записи всегда будет выполняться
Это же одно и тоже поле
23 апр 12, 13:26    [12456408]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на уникальность столбца с помощью триггера  [new]
iap
Member

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

если версия сервера больше или равна 10 (SQL 2008), то сделайте уникальный индекс:
CREATE UNIQUE INDEX [iEntity1Attribute1] ON [Entity1]([Attribute1]) WHERE [Attribute1] IS NOT NULL;
В этом случае триггеры не понадобятся.
23 апр 12, 13:29    [12456436]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на уникальность столбца с помощью триггера  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Glory
WHERE inserted.[Attribute1]=[Attribute1] - так это условие для добавляемой записи всегда будет выполняться
Это же одно и тоже поле
За исключением
inserted.[Attribute1] IS NULL
[src][/SRC]
23 апр 12, 13:30    [12456448]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на уникальность столбца с помощью триггера  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
333Mixim333,

А если версия сервера меньше 10, сделайте вычисляемый столбец и на него повесьте уникальный индекс.
23 апр 12, 13:31    [12456457]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на уникальность столбца с помощью триггера  [new]
333Mixim333
Member

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

если версия сервера больше или равна 10 (SQL 2008), то сделайте уникальный индекс:
CREATE UNIQUE INDEX [iEntity1Attribute1] ON [Entity1]([Attribute1]) WHERE [Attribute1] IS NOT NULL;
В этом случае триггеры не понадобятся.

Благодарю, кажется помогло
23 апр 12, 13:37    [12456525]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить