Ниже приведены упрощенные DDL и DML для представления чего-то, над чем я сжигал серьезные объемы мозгового вещества. Длинный таймер, первый постер и, надеюсь, не нарушать этикета SO и не использовать слишком много чернил в этом посте.
Существуют ресурсы, которые можно включать или отключать (разрешать) для определенных подразделений в бизнес-организации. Я выбрал ярлык ниже и только что определил таблицу разделов, но также будет таблица компаний и отделов.
Я могу установить разрешения для ресурса, используя любую комбинацию Company, Division и Section.
Набор разрешений только для Секции будет превосходить набор разрешений только для Подразделения или Компании.
Установка разрешения Y с NULL для компании, подразделения и отдела означает, что если нет разрешения, специфичного для этого подразделения, то они получат доступ к ресурсу на основе этого значения по умолчанию.
В настоящий момент я нахожу наиболее подходящее разрешение для бизнес-единицы, выполняя сначала несколько SELECT с наиболее конкретным предложением WHERE (ища ResourcePermission с Company, Division и Section, равной таковой для поставляемого бизнес-подразделения) наименее конкретный (NULL для всех трех). Всего восемь SELECT.
Если позднее будет добавлено больше бизнес-уровней (Department, UserGroup ...), SELECT примут привычки разведения кроликов.
Есть ли лучший способ добиться этого в SQL или лучше подходит для выполнения этого в процедурном коде.
Запуск финального SELECT ниже даст вам 9 разрешений на ресурсы. Я просто хочу, чтобы три, которые являются наиболее определенными для определенной бизнес-единицы.
CREATE TABLE Resources (
ResourceID varchar(20) NOT NULL PRIMARY KEY NONCLUSTERED,
ResourceName varchar(100) NOT NULL)
GO
CREATE TABLE ResourcePermissions (
PermissionID int identity(1,1) PRIMARY KEY NONCLUSTERED,
ResourceID varchar(20) CONSTRAINT [FK_Resources] FOREIGN KEY REFERENCES Resources(ResourceID),
Company varchar(10) NULL,
Division varchar(10) NULL,
Section varchar(20) NULL,
Permitted char(1) NOT NULL)
GO
CREATE TABLE Sections (
Company varchar(10) NOT NULL,
Division varchar(10) NOT NULL,
Section varchar(20) NOT NULL,
SectionName varchar(50) NOT NULL,
CONSTRAINT PK_Sections PRIMARY KEY (Company, Division, Section) )
GO
INSERT INTO Sections VALUES('Company 1','Division A','Red Section','Redskins')
INSERT INTO Sections VALUES ('Company 1','Division A','Blue Section','Bluejays')
INSERT INTO Sections VALUES ('Company 1','Division B','Red Section','Redskins')
INSERT INTO Sections VALUES ('Company 1','Division B','Blue Section','Bluejays')
INSERT INTO Sections VALUES ('Company 1','Division C','Red Section','Redskins')
INSERT INTO Sections VALUES ('Company 1','Division C','Blue Section','Bluejays')
INSERT INTO Sections VALUES('Company 2','Division A','Red Section','Redskins')
INSERT INTO Sections VALUES ('Company 2','Division A','Blue Section','Bluejays')
INSERT INTO Sections VALUES ('Company 2','Division B','Red Section','Redskins')
INSERT INTO Sections VALUES ('Company 2','Division B','Blue Section','Bluejays')
INSERT INTO Sections VALUES ('Company 2','Division C','Red Section','Redskins')
INSERT INTO Sections VALUES ('Company 2','Division C','Blue Section','Bluejays')
INSERT INTO Resources VALUES('Irish','Irish Resource')
INSERT INTO Resources VALUES('English','English Resource')
INSERT INTO Resources VALUES('French','French Resource')
INSERT INTO ResourcePermissions VALUES('Irish', NULL, NULL, NULL, 'Y')
INSERT INTO ResourcePermissions VALUES('Irish', NULL, NULL, 'Blue Section', 'N')
INSERT INTO ResourcePermissions VALUES('Irish', NULL, 'Division A', 'Blue Section', 'N')
INSERT INTO ResourcePermissions VALUES('Irish', 'Company 1', 'Division A', NULL, 'N')
INSERT INTO ResourcePermissions VALUES('French', NULL, 'Division B', 'Blue Section', 'Y')
INSERT INTO ResourcePermissions VALUES('French', 'Company 2', NULL, 'Blue Section', 'N')
INSERT INTO ResourcePermissions VALUES('French', 'Company 1', NULL, 'Blue Section', 'Y')
INSERT INTO ResourcePermissions VALUES('French', NULL, NULL, 'Blue Section', 'Y')
INSERT INTO ResourcePermissions VALUES('French', NULL, 'Division B', 'Red Section', 'N')
INSERT INTO ResourcePermissions VALUES('French', NULL, 'Division C', 'Red Section', 'Y')
INSERT INTO ResourcePermissions VALUES('English', NULL, 'Division B', 'Blue Section', 'Y')
INSERT INTO ResourcePermissions VALUES('English', 'Company 2', NULL, 'Blue Section', 'N')
INSERT INTO ResourcePermissions VALUES('English', NULL, 'Division A', 'Blue Section', 'N')
INSERT INTO ResourcePermissions VALUES('English', NULL, NULL, 'Blue Section', 'N')
INSERT INTO ResourcePermissions VALUES('English', 'Company 1', 'Division A', 'Blue Section', 'Y')
Запрос:
SELECT ResourceID, Company, Division, Section, Permitted
FROM ResourcePermissions
WHERE (Company = 'Company 1' OR Company IS NULL)
AND (Division = 'Division A' OR Division IS NULL)
AND (Section = 'Blue Section' OR Section IS NULL)
ORDER BY ResourceID