Sounds like #2 is unnecessary, and #3 chould be supported via a unique index (clustering perhaps, but that depends on your searching and sorting requirements) on the columns you've selected as your candidate key.For example:set nocount ondrop table bobgocreate table bob (i uniqueidentifier primary key, a char(1), b char(2))gocreate unique index IX_Bob_CandidateKeyon Bob(a,b)goinsert into bob (i,a,b)select newid(),'a','b'union allselect newid(),'a','bb'select * from bobinsert into bob (i,a,b)select newid(),'a','b'
results:i a b ------------------------------------ ---- ---- 88B5D7A6-4C24-41D7-8420-3309E91E57F5 a b C3C7130F-EDDF-407F-BB1A-1ADE1AF0ACA7 a bbServer: Msg 2601, Level 14, State 3, Line 1Cannot insert duplicate key row in object 'bob' with unique index 'IX_Bob_CandidateKey'.The statement has been terminated.
*##* *##* *##* *##* Chaos, Disorder and Panic ... my work is done here!