Я знаю, что Active Directory позволяет, по крайней мере, одному объекту иметь назначенного менеджера (атрибут), который совпадает с текущим объектом. Другими словами, работник является их собственным менеджером (то есть генеральным директором).
Кто-нибудь знает, возможно ли иметь более одного объекта, в котором менеджер совпадает с данным объектом (т. Е. Есть со-генеральный директор)? Microsoft молчит на эту тему (см. Ссылку ниже).
Я извлекаю объекты AD из таблицы SQL-сервера и разрабатываю рекурсивный запрос для построения иерархии между сотрудниками и менеджерами. Первый шаг запроса получает генеральный директор, где DistinguishedName = ManagerDistinguishedName
. Второй шаг запроса получает всех сотрудников, где DistinguishedName <> ManagerDistinguishedName
.
Запрос в настоящее время работает, когда для фирмы существует только один генеральный директор. К сожалению, у меня нет среды разработки для AD для тестирования со-генеральных директоров и того, как это может повлиять на запрос. Другими словами, я не уверен, существует ли потенциал для бесконечного цикла, основанного на данных и ограничениях запросов.
Атрибут менеджера
UPDATE
;WITH EmployeeList AS (
SELECT EmployeeObjectKey = ObjectKey, EmployeeFullName = FullName, EmployeeSamAccountName = SamAccountName, ManagerObjectKey
,ManagerFullName = FullName, ManagerSamAccountName = SamAccountName, EmployeeLevel = 1
FROM #TEMP_ManagerToEmployeeHierarchy
WHERE ObjectKey = ManagerObjectKey -- The CEO of the organization should be the only employee who's manager is themself.
UNION ALL
SELECT EmployeeObjectKey = E.ObjectKey, EmployeeFullName = E.FullName, EmployeeSamAccountName = E.SamAccountName, E.ManagerObjectKey
,ManagerFullName = M.EmployeeFullName, ManagerSamAccountName = M.EmployeeSamAccountName, EmployeeLevel = M.EmployeeLevel + 1
FROM #TEMP_ManagerToEmployeeHierarchy E -- Employee
INNER JOIN EmployeeList M -- Manager
ON E.ManagerObjectKey = M.EmployeeObjectKey
AND ObjectKey <> E.ManagerObjectKey -- Do not remove this exclusion, otherwise an infinite loop is created and the query will fail.
)
SELECT *
FROM EmployeeList
ORDER BY EmployeeLevel, ManagerFullName, EmployeeFullName
Где:
- . # TEMP_ManagerToEmployeeHierarchy - временная таблица, которая содержит только активные учетные записи пользователей.
- ObjectKey - это значение IDENTITY, основанное на порядке вставки объектов. Другими словами, это перевод атрибута objectGuid.