1

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

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

Основная структура таблицы такова:

tblUser {Идентификатор_пользователя, Имя пользователя, WindowsLogonName}

tblGroup {GroupID, название, описание, SystemFlag}

tblGroupGroup {GroupGroupID, имя,}

tblGroupUser {GroupUserID, Name,}

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

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

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

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

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

' 5434-2424-5244-5678 ',' {ID группы} ',' {ID для что-то в tblTask} ',' tblTask ​​', 0

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

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

+0

Какую версию SQL-сервера вы используете; есть несколько предложений, но они зависят от версии сервера sql. Посмотрите на окончательные разрешения в приложении с более высокой нагрузкой, вы можете разделить чеки, чтобы предоставить и отклонить выбор, который может упростить выполнение, поскольку я привык видеть больше грантов, чем denys в моих приложениях. – u07ch

+0

SQL Server 2005. Где я могу найти информацию о приложении с более высокой нагрузкой? –

ответ

0

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

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

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

+0

Спасибо за ваше предложение, хотя я думаю, что разделение прав пользователей и групп еще более усложнит ситуацию, поскольку разрешения всегда рассчитываются на основе пользователей и групп. У нас также есть достаточно хорошо определенная объектная модель, которая ожидает что-то в определенных местах. Я собрал этот сценарий, который, похоже, хорошо работает при перечислении разрешений; http://pastebin.com/f3877c416 В нескольких тестах он возвращает такое же количество строк, что и текущие хранимые процедуры, но менее чем за 1 секунду вместо 30. –

0

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

0

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

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

  • все ваши ID столбцы GUID? Не рекомендуется Kimberley L Tripp article
  • Индексы по всем внешним ключам, возможно, с другими столбцами в ключе или INCLUDE
  • Регулярное техническое обслуживание? например фрагментированные индексы, статистика ВЗ даты и т.д.
  • ли все типы данных соответствия (не принимает на себя FKs): тип данных приоритет и неявные ошибки преобразования могут ползать в

Некоторые больше информации схемы и примеры плохо выполняющей кода может помочь

 Смежные вопросы

  • Нет связанных вопросов^_^