2016-02-17 5 views
1

У меня есть таблица, которая может содержать дубликаты. Я хотел бы ограничить таблицу, чтобы разрешить только определенное количество дубликатов (например, 100). Я знаю, что это может быть достигнуто с помощью UDF и ограничения таблицы, но я бы хотел избежать этого, поскольку есть недостатки, включая производительность.Использование индексированного представления для ограничения количества дубликатов в таблице

Вместо этого я пытаюсь использовать уникальное ограничение для индексированного представления. Вот то, что я пробовал:

CREATE VIEW DuplicateCheckView 
WITH SCHEMABINDING 
AS 
    SELECT  1 AS Marker 
    UNION ALL 
    SELECT  1 AS Marker 
    FROM   DuplicateContainingTable 
    GROUP BY  KeyColumn1, KeyColumn2, KeyColumn3 
    HAVING  COUNT(1) > 100 
GO 

CREATE UNIQUE CLUSTERED INDEX IXU_DuplicatesCheck 
    ON DuplicateCheckView (Marker); 
GO 

Это приводит к ошибке

Msg 10116, Level 16, State 1, Line 1 
Cannot create index on view 'DuplicatesCheckView' because it contains one or more UNION, INTERSECT, or EXCEPT operators. Consider creating a separate indexed view for each query that is an input to the UNION, INTERSECT, or EXCEPT operators of the original view. 

OK Я понимаю ошибку (но не очень, почему это должно быть именно так), есть ли другой способ добиться этого?

+0

Предположим, что индексированный вид для этого случая - хорошая идея. Зачем вам этот союз? –

+0

Если вы явно используете значение '1' для каждой строки результата для столбца' marker', как вы ожидаете, что они будут 'уникальными'? – Raj

+0

@IvanStarostin Мне не нужны экземпляры более 100 дубликатов. Без UNION, если у меня есть только один экземпляр, тогда индекс будет по-прежнему оставаться уникальным. Цель UNION заключается в том, что первый экземпляр избыточных дубликатов приведет к ошибке. – innomatics

ответ

1

Это невозможно. Другой барьер заключается в том, что предложение HAVING не допускается в индексированном виде (а также подзапросы). Вместо этого я использовал триггерный подход.