По сути, я получил ответ на первую часть вопроса, и вот заявление SQL, которое у меня есть до сих пор ...
SELECT DbaRolePrivs.GRANTEE,
DbaRolePrivs.GRANTED_ROLE,
ApplicationRoleDefinition.ROLE,
ApplicationRoledefinition.description_tx,
CASE
WHEN GRANTED_ROLE = ROLE AND GRANTEE = USERNAME THEN
'T'
ELSE
'F'
END AS checkMark
FROM DBA_ROLE_PRIVS DbaRolePrivs, APPLICATION_ROLE_DEFINITION ApplicationRoleDefinition
Вот логика, которую я пытаюсь выполнить на простом английском языке.
"Учитывая список всех ролей и их описания, пометьте каждую роль как ИСТИНА или ЛОЖЬ в зависимости от того, была ли текущему выбранному ИМЯ ПОЛЬЗОВАТЕЛЯ предоставлена эта роль на основе их собственного списка GrantedRoles."
Сейчас он, конечно, возвращает двойной список, поскольку в разделе «случай, когда» каждая из предоставленных ролей сравнивается с общим списком ролей.(Я говорю «дубликаты», потому что у тестового пользователя есть только две роли, в текущем запросе SQL он будет возвращать строку для каждой роли для каждой возможной роли.
Я едва работал с SQL, поэтому я более привыкC ++, Objective-C и т. д. Действительно, все, что мне нужно в разделе «случай, когда», это проверить, существует ли вообще текущий ROLE в столбце GRANTED_ROLE. Я видел функцию EXISTS, но, похоже, она предназначена исключительно длянаборы результатов, такие как «ГДЕ СУЩЕСТВУЕТ».
Заранее спасибо, я знаю, что для тех, кто часто работал с базами данных, это, наверное, просто, я только начал.