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

Откуда: Minsk
Сообщений: 59
Вот упрощенный пример, иллюстрирующий проблему:

Есть таблица "Компании":
1. Страна
2. Организация
3. Компания
4. Главный офис (Да/нет)

Нужно обеспечить ограничение: "У организации может быть только один главный офис в стране"

Сперва написал триггеры INSERT, UPDATE где проверял, есть ли еще компания в стране с признаком Главный офис=Да
Вот ключевое условие триггера:
select @t = count(*)
from Компании t1 inner join inserted t2
on 	(t1.Страна=t2.Страна) and (t1.Организация=t2.Организация) and (t1.[Главный офис]='Да')

if (@t>1)
begin
  ROLLBACK TRAN
  RAISERROR('Главный офис уже существует.', 16, 1)
  RETURN
end



Для клиентских запросов этого было достаточно, пока не понадобилось импортировать сразу много записей из смежной базы данных через SQL-запрос
insert into Компании (Страна, Организация, Компания, [Главный офис])
select Страна, Организация, Компания, [Главный офис]
from ВнешняяБД..Компании


Триггеры стали не пускать группу записей и понятно почему, так как вставляется N записей, а не одна.

Вопрос:
Как проверить условие для группы записей? - ориентироваться по вставляемому количеству уже не получится
5 дек 11, 15:00    [11707362]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия в триггере для группы записей  [new]
Glory
Member

Откуда:
Сообщений: 104751
MSSQL_USER
Сперва написал триггеры INSERT, UPDATE где проверял, есть ли еще компания в стране с признаком Главный офис=Да
Вот ключевое условие триггера:
select @t = count(*)
from Компании t1 inner join inserted t2
on 	(t1.Страна=t2.Страна) and (t1.Организация=t2.Организация) and (t1.[Главный офис]='Да')

if (@t>1)
begin
  ROLLBACK TRAN
  RAISERROR('Главный офис уже существует.', 16, 1)
  RETURN
end

Этот триггер не даст даже добавить первую запись с Главный офис='Да'
Потому что в триггерах AFTER все записи из inserted уже видны и в самой таблице
5 дек 11, 15:05    [11707406]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия в триггере для группы записей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
MSSQL_USER
Как проверить условие для группы записей?
Типа того:

if exists(
	select *
	from inserted i
		inner join Компании k 
			on k.id <> i.id
			and k.Страна=i.Страна
			and k.Организация=i.Организация
			and k.[Главный офис]='Да'
	where i.[Главный офис]='Да'
)
begin
	ROLLBACK TRAN
	RAISERROR('Главный офис уже существует.', 16, 1)
	RETURN
end
5 дек 11, 15:07    [11707420]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия в триггере для группы записей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Glory
Этот триггер не даст даже добавить первую запись с Главный офис='Да'
Потому что в триггерах AFTER все записи из inserted уже видны и в самой таблице
Там же проверка > 1
5 дек 11, 15:07    [11707426]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия в триггере для группы записей  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
create unique index <Наименование индекса> on <Моя таблица> (Страна, Организация) where [Главный офис]='Да';
5 дек 11, 15:40    [11707707]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия в триггере для группы записей  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
invm
create unique index <Наименование индекса> on <Моя таблица> (Страна, Организация) where [Главный офис]='Да';
Забыли добавить, что триггер не нужен.
А нужен CHECK constraint на [Главный офис], чтобы пропускал только 'Да' и 'Нет'
5 дек 11, 16:18    [11708151]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия в триггере для группы записей  [new]
MSSQL_USER
Member

Откуда: Minsk
Сообщений: 59
iap,
а на SQL2000 будет работать такое?
5 дек 11, 20:04    [11709761]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия в триггере для группы записей  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
MSSQL_USER
iap,
а на SQL2000 будет работать такое?
Только >=SQL2008
5 дек 11, 21:40    [11710024]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить