Простая проверка ограничения не так просто - PullRequest
1 голос
/ 27 августа 2011

2nd Edit : Исходный код для задействованной функции выглядит следующим образом:

ALTER FUNCTION [Fileserver].[fn_CheckSingleFileSource] ( @fileId INT )
RETURNS INT
AS 
    BEGIN
        -- Declare the return variable here
        DECLARE @sourceCount INT ;

        -- Add the T-SQL statements to compute the return value here
        SELECT  @sourceCount = COUNT(*)
        FROM    Fileserver.FileUri
        WHERE   FileId = @fileId
                AND FileUriTypeId = Fileserver.fn_Const_SourceFileUriTypeId() ;

        -- Return the result of the function
        RETURN @sourceCount ;

    END

Редактировать : пример таблицы является упрощением. Мне нужно, чтобы это работало как операция Scaler Function / CHECK CONSTRAINT. Реальное устройство не так просто.

Оригинальный вопрос : предположим, что следующая таблица с именем FileUri

FileUriId, FileId, FileTypeId

Мне нужно написать проверочное ограничение, чтобы FileId был уникальным для FileTypeId, равного 1. Вы можете вставить тот же FileId, сколько захотите, но только одну строку, где FileTypeId равен 1.

Подход, который не работает:

1) dbo.fn_CheckFileTypeId возвращает INT со следующей логикой: SELECT Count(FileId) FROM FileUri WHERE FileTypeId = 1

2) ALTER TABLE FileUri ADD CONSTRAINT CK_FileUri_FileTypeId CHECK dbo.fn_CheckFileTypeId(FileId) <= 1

Когда я вставляю FileId 1, FileTypeId 1 дважды, вторая вставка разрешается.

Спасибо, ТАК!

Ответы [ 2 ]

4 голосов
/ 27 августа 2011

Вам необходимо создать отфильтрованный уникальный индекс (SQL Server 2008)

CREATE UNIQUE NONCLUSTERED  INDEX ix ON YourTable(FileId) WHERE FileTypeId=1

или смоделировать его с помощью индексированного представления (2000 и 2005)

CREATE VIEW dbo.UniqueConstraintView
WITH SCHEMABINDING
AS
SELECT FileId
FROM dbo.YourTable
WHERE FileTypeId = 1

GO 
CREATE UNIQUE CLUSTERED  INDEX ix ON dbo.UniqueConstraintView(FileId)
1 голос
/ 27 августа 2011

Почему бы вам не сделать FieldTypeID и Field первичным ключом таблицы?

Или хотя бы уникальный индекс на столе. Это должно решить вашу проблему.

...