Решал я такую задачку на MS SQL 2000.
Идея: У каждой записи есть поле AccessID в котором хранится Обстрактный ID доступа.
Есть таблица вида
TABLE [twk_Logins_log] [id_log] [int] ,[Login_name] [varchar] (50)
Далее был вид
SELECT dbo.twk_Tariffs.*
FROM dbo.twk_Logins_log INNER JOIN
dbo.twk_Tariffs ON dbo.twk_Logins_log.id_log = dbo.twk_Tariffs.AccessID
WHERE (dbo.twk_Logins_log.Login_name = SYSTEM_USER)
В результате пользователь получал доступ только к своим запесям и скрипты были построены так что при добавлении записи id_log подставлялся атоматически тригером. те. клиентское приложение воббще не знало об его существовани.
Когда потребовалось добавить групы и все прочие причендалы сделал так
SELECT *
FROM dbo.twk_Tariffs WHERE dbo.twk_Access(AccessID, SYSTEM_USER)=1
А в функции dbo.twk_Access уже анализировал имеет ли право пользователь видеть эту запись, соотвественно в поле AccessID могло стоять либо id пользователя либо id группы, dbo.twk_Access возвращает еденицу в том случае если AccessID равно id пользователя или id одной из групп в которые входит пользователь.
(код к сожалению не приведу ибо нет подруками проъекта ) И соотвественно придумать структуру для хранения информации какие есть пользователи и вкакие группы они входят можете сами.
Минусы втом что запись можно было расшарить только для одной группы и все пользователи кому она нужна должны были входить в эту группу....хотя им никто не запрещал состоять в нескольких группах