Ограничение проверки SQL с пользовательской функцией
Я устраняю проблему, замеченную в нашей базе данных сервера sql недавно.
В таблице 1 есть вычисленный битовый столбец, основанный на определенной пользователем функции, которая проверяет, существует ли запись в другой таблице, и оценивается в 0, если нет.
Таблица 2 - это таблица, в которой функция выполняет поиск по Таблице 1. В Таблице 2 также есть проверочное ограничение, использующее функцию, чтобы увидеть, установлено ли для поля битов в Таблице 1 значение 1.
Это похоже на круговую зависимость. Проблема заключается в том, что при вставке пакета записей в таблицу 2 ограничение не выполняется. Вставка этих же записей 1 на 1 позволяет всем вставкам пройти. Я не могу понять, почему пакетные вставки приводят к сбою. Любая помощь приветствуется.
CREATE TABLE [dbo].[tPecosPriceCheckStoreSubcategory](
[PecosPriceCheckID] [int] NOT NULL,
[StoreID] [int] NOT NULL,
[SubcategoryID] [int] NOT NULL,
[UndirectedExpectedScans] [int] NULL,
[PriceMin] [decimal](8, 2) NULL,
[PriceMax] [decimal](8, 2) NULL,
[PastPriceVariancePercent] [decimal](5, 2) NULL,
[ChangeDate] [datetime] NOT NULL,
[IsUndirected] [bit] NOT NULL,
[IsDirected] AS ([dbo].[fnPecosPriceCheckStoreSubcategoryIsDirected]([PecosPriceCheckID],[SubcategoryID])),
CONSTRAINT [PK_tPecosPriceCheckStoreSubcategory] PRIMARY KEY CLUSTERED
(
[PecosPriceCheckID] ASC,
[StoreID] ASC,
[SubcategoryID] ASC
)
ALTER TABLE [dbo].[tPecosPriceCheckStoreSubcategory] ADD CONSTRAINT [DF_IsUndirected] DEFAULT ((0)) FOR [IsUndirected]
GO
CREATE FUNCTION [dbo].[fnPecosPriceCheckStoreSubcategoryIsDirected]
(
@PecosPriceCheckID int,
@SubcategoryID int
)
RETURNS bit
AS
BEGIN
declare @isDirected bit
set @isDirected = 0
if (exists (select 1 from tPecosDirectedPriceCheckItem where PecosPriceCheckID = @PecosPriceCheckID and SubcategoryID = @SubcategoryID ))
begin
set @isDirected = 1
end
return @isDirected
END
CREATE TABLE [dbo].[tPecosDirectedPriceCheckItem](
[ID] [int] IDENTITY(1,1) NOT NULL,
[PecosPriceCheckID] [int] NOT NULL,
[PecosItemID] [int] NOT NULL,
[ItemSortOrder] [int] NOT NULL,
[SubcategoryID] [int] NOT NULL,
[ChangeDate] [datetime] NULL,
CONSTRAINT [PK_tPecosDirectedPriceCheckItem] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
ALTER TABLE [dbo].[tPecosDirectedPriceCheckItem] WITH NOCHECK ADD CONSTRAINT [CK_tPecosDirectedPriceCheckItem_CheckPriceCheckSubcategoryDirected] CHECK (([dbo].[fnCheckDirectedItemPriceCheckSubcategory]([PecosPriceCheckID],[SubcategoryID])=(0)))
GO
ALTER TABLE [dbo].[tPecosDirectedPriceCheckItem] CHECK CONSTRAINT [CK_tPecosDirectedPriceCheckItem_CheckPriceCheckSubcategoryDirected]
GO
CREATE FUNCTION [dbo].[fnCheckDirectedItemPriceCheckSubcategory]
(
@PriceCheckID INT,
@SubcategoryID INT
)
RETURNS BIT
AS
BEGIN
DECLARE @isViolation BIT
SET @isViolation =
CASE WHEN EXISTS (SELECT * FROM tPecosPriceCheckStoreSubcategory WHERE SubcategoryID = @SubcategoryID AND PecosPriceCheckID = @PriceCheckID AND IsDirected = 1)
THEN
0
ELSE
1
END
RETURN @isViolation
END