Я часто сталкиваюсь со следующим сценарием, где мне нужно предложить множество разных типов разрешений. Я в первую очередь использовать ASP.NET/VB.NET с SQL Server 2000.Каков наилучший способ обработки нескольких типов разрешений?
Сценарий
Я хочу предложить динамическую систему разрешений, которые могут работать на различных параметрах. Предположим, что я хочу предоставить любому отделу или просто конкретному человеку доступ к приложению. И притворяйтесь, что у нас есть ряд приложений, которые продолжают расти.
В прошлом я выбрал один из следующих двух способов, которые я знаю для этого.
1) Используйте единую таблицу разрешений со специальными столбцами, которые используются для определения того, как применять параметры. Специальные столбцы в этом примере - TypeID и TypeAuxID. SQL будет выглядеть примерно так.
SELECT COUNT(PermissionID)
FROM application_permissions
WHERE
(TypeID = 1 AND TypeAuxID = @UserID) OR
(TypeID = 2 AND TypeAuxID = @DepartmentID)
AND ApplicationID = 1
2) Используйте таблицу сопоставлений для каждого типа разрешений, а затем объедините их все вместе.
SELECT COUNT(perm.PermissionID)
FROM application_permissions perm
LEFT JOIN application_UserPermissions emp
ON perm.ApplicationID = emp.ApplicationID
LEFT JOIN application_DepartmentPermissions dept
ON perm.ApplicationID = dept.ApplicationID
WHERE [email protected]
AND ([email protected] OR [email protected] OR
(emp.UserID IS NULL AND dept.DeptID IS NULL)) AND ApplicationID = 1
ORDER BY q.QID ASC
Мои мысли
Я надеюсь, что эти примеры имеют смысл. Я собрал их вместе.
Первый пример требует меньше работы, но ни один из них не чувствует себя лучшим ответом. Есть ли лучший способ справиться с этим?
Проблема, с которой я столкнулся с этим подходом, состоит в том, что с помощью этого подхода очень просто выполнить определенные роли. Как видите, 6 ролей имеют значение 2^6 = 64, когда 31 ролей будет иметь 2^31 = 2,147,483,647, что является максимальным значением int. Таким образом, в T-SQL самым большим типом данных, который можно использовать, является `bigint` (2^63). Конечно, вы можете использовать тип varchar, но я предпочитаю использовать решение Джона Дауни, когда у меня много ролей. – 2011-10-07 00:47:08