После дополнительных исследований выяснилось, что мы также можем использовать ограничение CHECK
для достижения этой цели.
Шаги:
Создайте user defined function
, который вернет 0
или 1
, после проверки наличия дубликатов, как показано ниже:
CREATE FUNCTION [dbo].[udf_TransactionHeader_Bill_ID_Surity_ID](@File_ID INT,@Bill_ID VARCHAR(10))
RETURNS BIT
AS
BEGIN
IF(SELECT COUNT(*) FROM [dbo].[TransactionHeader] AS th
WHERE th.Bill_ID = @Bill_ID) > 0
BEGIN
DECLARE @Surity_ID SMALLINT = (SELECT Surity_ID FROM [dbo].[TransactionGroup] WHERE File_ID = @File_ID)
IF (SELECT COUNT(*)
FROM [dbo].[TransactionHeader] AS th
INNER JOIN [dbo].[TransactionGroup] AS tg ON tg.File_ID = th.File_ID
WHERE th.Bill_ID = @Bill_ID
AND tg.Surity_ID = @Surity_ID) > 1
BEGIN
RETURN 1
END
END
RETURN 0
END
GO
Теперь добавьте ограничение CHECK
к столбцу dbo.TransactionHeader
(Bill_ID
)
и вставьте указанную выше функцию в выражение ограничения CHECK
, как показано ниже:
ALTER TABLE [dbo].[TransactionHeader] WITH NOCHECK
ADD CONSTRAINT CK_TransactionHeader_Bill_ID
CHECK (dbo.udf_TransactionHeader_Bill_ID_Surity_ID(SurityID,Bill_ID) = 0);
Это должно достичь этого.