Дублирование прав по
операциям
Симптомы
Роли All employees и All portal users имеют одинаковые права на операции с объектами. Настройки доступа к ним не работают. Изменения не сохраняются.
Решение
Чтобы удалить дубликаты прав доступа, нужно обратиться к таблице SysEntitySchemaOperationRight в базе данных. В этой таблице хранятся данные о правах на операции.
Дублирующие права для одного объекта
- Выполните скрипт, чтобы проверить наличие дублей прав доступа:
SELECT Row_number() OVER(
PARTITION BY SubjectSchemaUId, SysAdminUnitId
ORDER BY CreatedOn --- Признак выбора дубля (например, запись, созданная позднее - дубль)
) AS rowN,
*
FROM SysEntitySchemaOperationRight
WHERE SubjectSchemaUId = (
SELECT UId
FROM SysSchema
WHERE ExtendParent = 0
AND Name = 'Contact' --- Фильтрация по названию схемы, в которой дублируются права доступа
)
AND SysAdminUnitId IN (
SELECT Id
FROM SysAdminUnit
WHERE Name = 'All employees'
OR Name = 'All portal users' --- Фильтрация по названию ролей, для которых дублируются права
)
SELECT Row_number() OVER(
PARTITION BY "SubjectSchemaUId", "SysAdminUnitId"
ORDER BY "CreatedOn" --- Признак выбора дубля (например, запись, созданная позднее - дубль)
) AS rowN,
*
FROM "SysEntitySchemaOperationRight"
WHERE "SubjectSchemaUId" = (
SELECT "UId"
FROM "SysSchema"
WHERE "ExtendParent" = false
AND "Name" = 'Contact' --- Фильтрация по названию схемы, в которой дублируются права доступа
)
AND "SysAdminUnitId" IN (
SELECT "Id"
FROM "SysAdminUnit"
WHERE "Name" = 'All employees'
OR "Name" = 'All portal users' --- Фильтрация по названию ролей, для которых дублируются права
)
Запись считается дублем, если количество вернувшихся записей rowN > 1.
- Выполните скрипт для удаления ролей:
DELETE FROM SysEntitySchemaOperationRight
WHERE Id IN (
select Id FROM (
SELECT Id, Row_number() OVER(
PARTITION BY SubjectSchemaUId, SysAdminUnitId
ORDER BY CreatedOn --- Признак выбора дубля (например, запись созданная позднее – дубль)
) AS rowN
FROM SysEntitySchemaOperationRight
WHERE SubjectSchemaUId = (
SELECT UId
FROM SysSchema
WHERE ExtendParent = 0
AND Name = 'Case' --- Фильтрация по названию схемы, в которой дублируются права доступа
)
AND SysAdminUnitId IN (
SELECT Id
FROM SysAdminUnit
WHERE Name = 'All employees'
OR Name = 'All portal users' --- Фильтрация по названию ролей (на русском), для которых дублируются права
)
) as t
where rowN > 1
)
DELETE FROM "SysEntitySchemaOperationRight"
WHERE "Id"::text IN (
select "Id" from (
SELECT "Id", Row_number() OVER(
PARTITION BY "SubjectSchemaUId", "SysAdminUnitId"
ORDER BY "CreatedOn" --- Признак выбора дубля (например, запись созданная позднее – дубль)
) AS rowN
FROM "SysEntitySchemaOperationRight"
WHERE "SubjectSchemaUId" = (
SELECT "UId"
FROM "SysSchema"
WHERE "ExtendParent" = false
AND "Name" = 'Case' --- Фильтрация по названию схемы, в которой дублируются права доступа
)
AND "SysAdminUnitId" IN (
SELECT "Id"
FROM "SysAdminUnit"
WHERE "Name" = 'All employees'
OR "Name" = 'All portal users' --- Фильтрация по названию ролей (на русском), для которых дублируются права
)
) as t
where rowN > 1
)
Дублирующие права для нескольких объектов
Если дубли найдены в правах сразу по нескольким объектам, можно провести поиск и удаление дубликатов сразу по всем схемам, не проверяя каждую схему отдельно:
- Выполните скрипт, чтобы проверить наличие дублей прав доступа по всем схемам:
SELECT * FROM (
SELECT Row_number() OVER(
PARTITION BY "SubjectSchemaUId", "SysAdminUnitId"
ORDER BY "CreatedOn" --- Признак выбора дубля (например, запись созданная позднее - дубль)
) AS rowN,
*
FROM "SysEntitySchemaOperationRight"
) AS t
WHERE rowN > 1
Результатом выборки будут записи, которые дублируются в SysEntitySchemaOperationRight.
- Выполните скрипт для удаления дублей:
DELETE FROM "SysEntitySchemaOperationRight"
WHERE "Id" IN (
SELECT "Id" FROM (
SELECT "Id", Row_number() OVER(
PARTITION BY "SubjectSchemaUId", "SysAdminUnitId"
ORDER BY "CreatedOn" --- Признак выбора дубля (например, запись созданная позднее - дубль)
) AS rowN
FROM "SysEntitySchemaOperationRight"
) AS t
WHERE rowN > 1
)
В результате будет выполнено удаление дублей в таблице SysEntitySchemaOperationRight для всех схем и ролей.
Рекомендуем изучить
Общие принципы диагностики проблем при компиляции и поставке изменений