Вы можете сделать это с помощью проверочного ограничения и скалярной функции. Вот как я построил образец.
Сначала создайте таблицу:
CREATE TABLE MyTable
(
MyTableId int not null identity(1,1)
,MyName varchar(100) not null
)
Затем создайте функцию для этой таблицы. (Вы можете добавить предел количества строк в качестве параметров, если вам нужна большая гибкость.)
CREATE FUNCTION dbo.MyTableRowCount()
RETURNS int
AS
BEGIN
DECLARE @HowMany int
SELECT @HowMany = count(*)
from MyTable
RETURN @HowMany
END
Теперь добавьте проверочное ограничение с помощью этой функции в таблицу
ALTER TABLE MyTable
add constraint CK_MyTable__TwoRowsMax
check (dbo.MyTableRowCount() < 3)
И проверить это:
INSERT MyTable (MyName) values ('Row one')
INSERT MyTable (MyName) values ('Row two')
INSERT MyTable (MyName) values ('Row three')
INSERT MyTable (MyName) values ('Row four')
Недостатком является то, что каждый раз, когда вы вставляете в таблицу, вы должны запускать функцию и выполнять сканирование таблицы ... но что же, таблица (с кластеризованным индексом) занимает максимум две страницы. Реальный недостаток в том, что это выглядит глупо ... но все выглядит глупо, когда вы не понимаете почему так и должно быть.
(Триггерное решение будет работать, но я бы хотел избегать триггеров при любой возможности.)