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

Откуда:
Сообщений: 36
Добрый день, необходимо разработать небольшое приложение с БД на MS SQL 2008.
Задумался над вопросом, как лучше организовать БД в плане предотвращения дубликатов по некоторым данным.
Использование индексов и ключей для некоторых таблиц не панацея.
Можно создать триггеры на вставку и обновление данных.
Или же проверять вносимые в БД данные средствами приложения (фактически, будет веб-морда на php).
Поделитесь опытом, пожалуйста.
Приложение не очень большое, в БД записей будет не так много (суммарно за год наберется максимум 100 тысяч).
16 апр 13, 15:59    [14187885]     Ответить | Цитировать Сообщить модератору
 Re: Целостность БД  [new]
Glory
Member

Откуда:
Сообщений: 104760
yas9
Использование индексов и ключей для некоторых таблиц не панацея.

Почему ?
16 апр 13, 16:00    [14187897]     Ответить | Цитировать Сообщить модератору
 Re: Целостность БД  [new]
yas9
Member

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

Тут цель - исключить возможность ввода в таблице записей, одинаковых по полю: Operators и за пересекающийся диапазон дат.

Если делать триггер, то будет что-то подобное:
 CREATE TRIGGER TR_GR_OperGraph
ON OperGraph FOR INSERT
AS
IF @@ROWCOUNT=1
begin 
  if exists (select * 
		from inserted a join OperGraph b 
		on a.Operators=b.Operators and (a.dtBegin <= b.dtEnd or b.dtEnd is null)
		where b.IsActive = 1)
   BEGIN
      ROLLBACK TRAN
   PRINT 
     'Данные на этот период существуют'
 	    
   end
end
16 апр 13, 16:12    [14187988]     Ответить | Цитировать Сообщить модератору
 Re: Целостность БД  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
yas9
Glory,

Тут цель - исключить возможность ввода в таблице записей, одинаковых по полю: Operators и за пересекающийся диапазон дат.

Если делать триггер, то будет что-то подобное:
 CREATE TRIGGER TR_GR_OperGraph
ON OperGraph FOR INSERT
AS
IF @@ROWCOUNT=1
begin 
  if exists (select * 
		from inserted a join OperGraph b 
		on a.Operators=b.Operators and (a.dtBegin <= b.dtEnd or b.dtEnd is null)
		where b.IsActive = 1)
   BEGIN
      ROLLBACK TRAN
   PRINT 
     'Данные на этот период существуют'
 	    
   end
end
А две записи, значит, вставить можно?
Даже если диапазоны дат пересекаются?

Применение @@ROWCOUNT может мешать в операторе MERGE.
16 апр 13, 16:18    [14188037]     Ответить | Цитировать Сообщить модератору
 Re: Целостность БД  [new]
yas9
Member

Откуда:
Сообщений: 36
iap, согласен с Вами, уберу из конечного продукта
16 апр 13, 16:33    [14188156]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить