J'ai la structure de tableau ci-dessous
Utilisateurs (PK – UserId)
Système (PK – SystemId)
SystemRoles (PK-SystemRoleId, FK – SystemId)
UserRoles (PK-UserId & SystemRoleId, FK-SystemRoleId, FK-UserId)
Users
peuvent avoir access à différents Systems
et un System
peut avoir différents SystemRoles
définis.
Maintenant, je dois supprimer les Users
qui ont des SystemRoles
qui leur sont assignés SEULEMENT pour un System
spécifique. S'ils ont des SystemRoles
définis pour d'autres Systems
, ils ne doivent pas être supprimés.
J'ai trouvé la requête ci-dessous pour identifier les loggings qui peuvent être supprimés, mais je pense que cela peut être optimisé. Aucune suggestion?
SELECT U.* FROM ( SELECT distinct UR.UserID FROM dbo.UserRole UR INNER JOIN dbo.SystemRole SR ON (SR.SystemRoleID = UR.SystemRoleID) INNER JOIN dbo.[System] S ON (S.SystemID = SR.SystemID) WHERE S.SystemName = 'ABC' OR S.SystemName = 'XYZ' ) T INNER JOIN dbo.[User] U ON (U.UserID = T.UserID) WHERE T.UserID NOT IN ( select distinct UR.UserID from dbo.[UserRole] UR INNER JOIN dbo.SystemRole SR ON (SR.SystemRoleID = UR.SystemRoleID) INNER JOIN dbo.[System] S ON (S.SystemID = SR.SystemID) WHERE S.SystemName <> 'ABC' AND S.SystemName <> 'XYZ' )
Ce genre de structure vous permettra d'get les loggings dont vous avez besoin.
select yourfields -- or delete from userroles where userid in (select userid from userroles join etc where system.name = the one you want except select userid from userroles join etc where system.name <> the one you want )
quelque chose comme ça?
select userid from ( SELECT UR.UserID, max(case when (S.SystemName = 'ABC' OR S.SystemName = 'XYZ') then 1 else 0 end) as kill, max(case when (S.SystemName <> 'ABC' AND S.SystemName <> 'XYZ') then 1 else 0 end) as keep FROM dbo.UserRole UR INNER JOIN dbo.SystemRole SR ON (SR.SystemRoleID = UR.SystemRoleID) INNER JOIN dbo.[System] S ON (S.SystemID = SR.SystemID) group by UR.UserID ) u where kill = 1 and keep = 0