制約を使用してデータを制約し、db にビジネス ロジックを実装する必要がある (できれば) まれなインスタンスのトリガーを残します (新しい色が挿入された場合は xyz を実行します)。
チェックにバインドされた関数を使用した制約ベースの方法を次に示します。
--setup
create table dbo.Color (ColorId int primary key, ColorName varchar(10), Cap int);
go
create table dbo.Detail (DetailId int identity(1,1), ColorId int references dbo.Color(ColorId));
go
--create color blue with max row cap of 3
insert into dbo.Color
values(1, 'blue', 3);
go
--create a func to evaluate the max row cap
create function dbo.IsColorCapped(@ColorId int)
returns bit
as
begin
return ( select case when count(*) > max(c.Cap) then 1 else 0 end
from dbo.Color c
join dbo.Detail d on
c.ColorId = d.ColorId
where c.ColorId = @ColorId
)
end;
go
-- use the func in table constraint
alter table dbo.Detail add constraint ck_ColorCap check (dbo.IsColorCapped(ColorId)=0);
go
-- Test...
-- insert 3 blue rows
insert into dbo.Detail (ColorId)
values(1),(1),(1);
-- insert 4th blue row - FAIL
insert into dbo.Detail (ColorId)
values(1)
/*
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "ck_ColorCap". The conflict occurred in database "yak", table "dbo.Detail", column 'ColorId'.
The statement has been terminated.
*/
-- incease the color cap
update dbo.Color
set Cap = 4
where ColorId = 1;
-- insert 4th blue row again
insert into dbo.Detail (ColorId)
values(1);