Как я могу создать ограничение запроса - PullRequest
0 голосов
/ 06 июня 2018

У меня есть таблица Items, в которой есть поля Inventory и ItemId (первичный ключ).

И у меня есть еще одна таблица Allocations, в которой есть поля Allocation и ItemId, которые являются внешним ключом, ссылающимся на Items.ItemId.

Таким образом, многие Распределения могут относиться к одному Предмету.

Интересно, как я могу добавить ограничение, чтобы не допускать SUM (Распределение) в таблице Распределений для того же ItemId, чтобы присоединить Items.Inventory дляэтот ItemId.Я мог найти только очень простые примеры, поэтому я не уверен, как подойти к этой проблеме.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Реализация для Tab Allerman ответа См. Демонстрацию

CREATE FUNCTION dbo.fnc_IsValid( @ItemId Int)     RETURNS BIT
AS 
BEGIN 
   DECLARE @flag BIT = 1
   SELECT @flag =
   case 
       when 
           ISNULL(SUM(Allocation),0) < =MAX(Inventory)
       then 1
       else 0
   end
   FROM Allocations A (NOLOCK) JOIN Items I
   on A.Itemid=I.Itemid AND I.ItemId=@ItemId
   group by I.ItemId


   RETURN      @flag

 END

 go
 create table Items(ItemId int , Inventory int);
insert into Items values
(1,35),(2,10);

create table Allocations (Allocation int , Itemid int );

ALTER TABLE dbo.Allocations  ADD CONSTRAINT [CK_inventoryCheck] CHECK  ((dbo.fnc_IsValid(Itemid)=1))
go

insert into Allocations values
(10,1),(20,1),(5,1);


select * from Allocations;
0 голосов
/ 06 июня 2018

Вы можете создать CHECK CONSTRAINT в таблице Allocations, которая вызывает функцию.

Передайте ItemID в функцию, и функция заполняет локальную переменную Items.Inventory для этого ItemId.

После этого, пусть функция выполнит SELECT, который получит SUM(Allocation) в таблице Allocations для того же ItemId, и вернет True (1), если SUM больше, чем Inventory, или же False (0).

В КОНТРОЛЬНОМ ПРОВЕРКЕ просто проверьте, возвращает ли функция False.

...