You can use a CHECK constraint with a CASE expression. If check2 is enabled, make sure check1 is enabled too, otherwise you can default to a no-op ("checking" that check1 = check1). For simplicity I'm assuming these columns are not NULLable.
CREATE TABLE dbo.foo
(
check1 BIT NOT NULL DEFAULT 0,
check2 BIT NOT NULL DEFAULT 0,
CONSTRAINT ck_both CHECK (check1 = CASE WHEN check2 = 1 THEN 1 ELSE check1 END)
);
INSERT dbo.foo DEFAULT VALUES; -- 0,0 succeeds
INSERT dbo.foo(check1,check2) VALUES(1,0); -- succeeds
INSERT dbo.foo(check1,check2) VALUES(1,1); -- succeeds
GO
INSERT dbo.foo(check1,check2) VALUES(0,1); -- fails
To add this constraint to your existing table:
ALTER TABLE dbo.tablename
ADD CONSTRAINT ck_BothBits
CHECK (check1 = CASE WHEN check2 = 1 THEN 1 ELSE check1 END);
If the columns are NULLable (hopefully they aren't), you can say something like this (untested):
ALTER TABLE dbo.tablename
ADD CONSTRAINT ck_BothBits
CHECK (COALESCE(check1,0) = CASE
WHEN check2 = 1 THEN 1 ELSE COALESCE(check1,0) END);
With that constraint in place:
INSERT dbo.foo(check1,check2) VALUES(NULL,NULL) -- succeeds
INSERT dbo.foo(check1,check2) VALUES(1,0); -- succeeds
INSERT dbo.foo(check1,check2) VALUES(1,1); -- succeeds
INSERT dbo.foo(check1,check2) VALUES(1,NULL); -- succeeds
INSERT dbo.foo(check1,check2) VALUES(0,NULL); -- succeeds
INSERT dbo.foo(check1,check2) VALUES(NULL,0); -- succeeds
GO
INSERT dbo.foo(check1,check2) VALUES(0,1); -- fails
GO
INSERT dbo.foo(check1,check2) VALUES(NULL,1); -- fails