Jag har skrivit en liten artikel som tar upp bitoperationer (till viss del i alla fall). Du kan läsa den här: http://www.swesecure.com/?ID=84473f97-988e-4a78-829d-b5c5d0336107&IID=8bf7deff-a328-4fa8-bf54-421eb740ac74
Vad jag menar är att användare har då endast möjlighet att vara i en grupp samtidigt. Man kan vara registrerad, ej registrerad eller administratör.
Här är ett exempel.
Notera att jag har lagt ut de speciella poster som har speciell behörighet i en egen tabell.
--grupper i detta fallet är
1 - registrerad
2 - ej registrerad
4 - administratör
declare @users table (userid int primary key, username varchar(50), [group] int)
insert into @users values (1, 'brimba', 1)
insert into @users values (2, 'mozilla', 4)
insert into @users values (3, 'unknown', 2)
declare @userid int
set @userid = 1
declare @posts table (postid int primary key, userid int, data varchar(500))
insert into @posts values (1, 1, 'visas för brimba') --skriven av brimba
insert into @posts values (2, 2, 'visas för alla registrerade') --skriven av mozilla
insert into @posts values (3, 2, 'visas för alla') --skriven av mozilla
insert into @posts values (4, 2, 'visas för alla administratörer') --skriven av mozilla
declare @postsrights table (postid int, groups int)
insert into @postsrights values (2, 1)
insert into @postsrights values (3, -1)
insert into @postsrights values (4, 4)
declare @usergroup int
select @usergroup = [group] from @users where userid = @userid
select
t1.userid, t1.data
from
@posts t1
inner join @users t2 on t1.userid = t2.userid
left join @postsrights t3 on t1.postid = t3.postid
where
t1.userid = @userid or (t3.groups & @usergroup)>0
Tänk dock på att det anses vara en dålig design att använda bitvärden i tabellstrukturen. Så ett annat tips (som i detta fallet fungerar utmärkt) är att ha en tabell som ser ut ungefär:
declare @table table (postid int, group)
Sedan ändrar du din left join mot @postrights till:
left join @table t3 on t1.postid = t3.postid and (t2.group = t3.group or t3.group = -1)