4

В таблице я хочу, чтобы гарантировать, что только уникальные Vales существуют по клавише пяти столбцов:SQL Server: «В основном уникальный» индекс

Timestamp Account RatingDate TripHistoryKey EventAction 
========= ======= ========== ============== =========== 
2010511 1234 2010511 1    INSERT 
2010511 1234 2010511 4    INSERT 
2010511 1234 2010511 7    INSERT 
2010511 1234 2010511 1    INSERT <---duplicate 

Но я только хочу единственное ограничение для применения между строки, когда EventAction является INSERT:

Timestamp Account RatingDate TripHistoryKey EventAction 
========= ======= ========== ============== =========== 
2010511 1234 2010511 1    INSERT 
2010511 1234 2010511 1    UPDATE 
2010511 1234 2010511 1    UPDATE <---not duplicate 
2010511 1234 2010511 1    UPDATE <---not duplicate 
2010511 1234 2010511 1    DELETE <---not duplicate 
2010511 1234 2010511 1    DELETE <---not duplicate 
2010511 1234 2010511 1    INSERT <---DUPLICATE 

возможно?

+1

Что такое мероприятие Акция? Я подозреваю, что у вас есть проблема с дизайном и что вы можете захотеть создать таблицу/отношение для каждого типа EventAction. Возможно, вы можете предоставить бизнес-контекст на ваш вопрос. –

+0

Таблица представляет собой журнал журнала аудита другой таблицы (Insert, update, delete). я не хочу, чтобы дублирующие операции «вставки» делали его в моей таблице. (Содержимое этой таблицы генерируется другим продуктом базы данных на другом сервере, и я получаю копию копии контрольного журнала, чтобы получить привилегию попробовать его разобрать). я также мог бы изменить имена столбцов на ** A **, ** B **, ** C **, ** D ** и ** E ** и заменить значения столбцов цифрами - если это помогает получить главный вопрос. –

ответ

1

Я хотел бы сделать это с контрольным ограничением. Я не думаю, что традиционное уникальное ограничение будет работать.

+0

Любые предложения по синтаксису ограничения проверки, которые могли бы достичь цели? –

5

Да

  • SQL Server 2008: использовать фильтрованную индекс
  • SQL Server 2005: использовать триггер или индексированного представления

Edit:

+0

Любые предложения по триггеру или синтаксису вида привязки, не связанного с схемой, которые достигнут цели? –

+0

@Ian Boyd: вам придется использовать триггер, если вы не можете SCHEMABIND для индексации – gbn

+0

Любые предложения по синтаксису триггера? –

2

Что такое EventAction?

Я подозреваю, что у вас есть проблема с дизайном на рабочем месте и что вы можете захотеть создать таблицу/отношение для каждого типа EventAction. Это позволит вам создать уникальное ограничение для таблицы InsertEventAction, например.

Возможно, вы можете задать деловой контекст на свой вопрос.

Комментарий: Учитывая характер источника данных и активность синтаксического анализа, которую вы хотите реализовать, я думаю, что gbn предложила ваши лучшие варианты.

Жаль, что исходная база данных не является также SQL Server, поскольку вы можете реализовать свой собственный механизм аудита с помощью триггеров. Такое решение может включать в себя вашу «фильтрующую» логику в Trigger.

+0

Отвечено на комментарий в разделе комментариев. –

0

Это пример триггера INSTEAD OF INSERT. EXISTS проверяет наличие существующих строк с одинаковыми значениями, но только когда EventAction является INSERT.

CREATE TRIGGER [dbo].[YourTriggerName] ON [dbo].[YourTableName] 
    INSTEAD OF INSERT 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    IF NOT EXISTS (
    SELECT 1 
    FROM [YourTableName] L 
    INNER JOIN inserted I ON 
      I.Timestamp = L.Timestamp 
     AND I.Account = L.Account 
     AND I.RatingDate = L.RatingDate 
     AND I.TripHistoryKey = L.TripHistoryKey 
     AND I.EventAction = 'INSERT' 
) 
    BEGIN 
     INSERT INTO [YourTableName] 
     SELECT * FROM inserted 
    END 
END 
Смежные вопросы