Вы не можете создать CONSTRAINT
для этого, однако, вы можете создать отфильтрованный уникальный индекс:
USE Sandbox;
GO
CREATE TABLE dbo.Student (ID int IDENTITY(1, 1) PRIMARY KEY,
FirstName varchar(100),
LastName varchar(100),
Active bit);
CREATE UNIQUE INDEX UQ_StudentName
ON Student (FirstName,LastName)
WHERE Active = 1;
GO
INSERT INTO dbo.Student (FirstName,
LastName,
Active)
VALUES ('Jane', 'Smith', 1); --Success
GO
INSERT INTO dbo.Student (FirstName,
LastName,
Active)
VALUES ('Jane', 'Smith', 0); --Success
GO
INSERT INTO dbo.Student (FirstName,
LastName,
Active)
VALUES ('Jane', 'Smith', 0); --Success
GO
INSERT INTO dbo.Student (FirstName,
LastName,
Active)
VALUES ('Jane', 'Smith', 1); --Fails;
GO
UPDATE dbo.Student
SET Active = 1
WHERE ID = 2; --Fails;
GO
SELECT *
FROM dbo.Student;
GO
DROP TABLE dbo.Student;
Однако я настоятельно рекомендую против мысли, что имена уникальны. Я (лично) поделился своим именем и датой рождения с другим человеком в нескольких местах моей юности, и компании, которые рассматривали имена (и дату рождения) как уникальные в своих системах, были такой головной болью для нас обоих (там действительно были места, где я (или они) не могли зарегистрироваться без использования сокращенного имени, потому что мы «уже существовали»).