Структура доступа к базе данных - PullRequest
1 голос
/ 14 июля 2009

Многие из моих приложений работодателей имеют похожую внутреннюю структуру разрешений для ограничения данных для определенного набора пользователей или групп. Группы также могут быть вложенными.

Проблема, с которой мы сейчас сталкиваемся при таком подходе, состоит в том, что перечисление разрешений невероятно медленно. Текущий метод использует хранимую процедуру со многими курсорами и временными таблицами. Это хорошо работает для небольших приложений, но теперь у нас есть одна конкретная система, которая быстро развивается и начинает замедляться.

Основная структура таблицы выглядит следующим образом:

tblUser {ИД пользователя, имя пользователя, WindowsLogonName}

tblGroup {GroupID, Имя, Описание, SystemFlag}

tblGroupGroup {GroupGroupID, Имя,}

tblGroupUser {GroupUserID, Name,}

и связать все это вместе;

tblPermission {PermissionID, SecurityObjectID, SecuredID, TableName, AllowFlag}

который содержит строки типа ..

'5255-5152-1234-5678', '{ID группы}', '{ID для чего-то в tblJob}', 'tblJob', 1

'4240-7678-5435-8774', '{ID пользователя}', '{ID для чего-то в tblJob}', 'tblJob', 1

'5434-2424-5244-5678', '{ID группы}', '{ID чего-либо в tblTask}', 'tblTask', 0

Конечно, должен быть более эффективный подход для перечисления всех групп и получения идентификаторов защищенных строк?

Чтобы усложнить вещи дальше; если пользователю явно отказано в доступе к строке, это отменяет любые групповые разрешения. Это все в MSSQL.

Ответы [ 3 ]

0 голосов
/ 16 июля 2009

Я думаю, что вы могли бы использовать Рекурсивный Общие табличные выражения ( CTE ) иерархического запроса. Вы можете найти много примеров, если вы ищете его. Этот является одним из них.

0 голосов
/ 05 сентября 2009

Возможно, ваш дизайн в порядке, но реализация / код неверны.

Некоторые мысли:

  • Все ли ваши столбцы идентификаторов GUID? Не рекомендуется Kimberley L Tripp артикул
  • Индексирует все внешние ключи, возможно, с другими столбцами в ключе или ВКЛЮЧАЕТ
  • Регулярное обслуживание? например, фрагментированные индексы, статистика за дату и т. д.
  • Все ли типы данных совпадают (предполагается, что нет FK): приоритет типа данных и неявные ошибки преобразования могут появиться в

Некоторые дополнительные сведения о схеме и примеры неэффективного кода могут помочь

0 голосов
/ 15 июля 2009

Полагаю, было бы полезно разбить tblPermission на пару таблиц: одну для групп и одну для пользователей. Наличие в нем как групп, так и пользователей, кажется, усложняет дизайн (и, возможно, именно поэтому вам нужны хранимые процедуры).

Если вы хотите разбить таблицу tblPermission (на что-то вроде tblUserPermission и tblGroupPermission), но при этом хотите получить представление таблиц, которое выглядит как tblPermission, вы можете создать представление, объединяющее данные из двух таблиц.

Надеюсь, это поможет. У вас есть примеры того, что делают хранимые процедуры?

...