Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Вопрос-Ответ Новый топик    Ответить
 Запрос по удалению ролей  [new]
WinBlon
Member

Откуда:
Сообщений: 9
Построить запрос, который удаляет у пользователей все роли, которые отсутствуют в совокупности
профилей локальных администраторов, принадлежащих тому же учреждению, что и пользователь
23 мар 16, 14:07    [18968337]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по удалению ролей  [new]
WinBlon
Member

Откуда:
Сообщений: 9
Прикладываю схему данных:

К сообщению приложен файл. Размер - 140Kb
23 мар 16, 16:28    [18969228]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по удалению ролей  [new]
Злой Бобр
Member

Откуда: Украина, Кривой Рог
Сообщений: 3526
WinBlon,

Тынц
23 мар 16, 17:32    [18969540]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по удалению ролей  [new]
WinBlon
Member

Откуда:
Сообщений: 9
К сожалению, уже не студент ) Пардон, что забыл про просьбу помощи ))
Вот мои мысли насчёт решения и попытки сделать всё самому:
Понятно, что запрос должен включать запрос выборки из нескольких вложенных запросов:

1) В разрезе учреждений вывести всех локальных администраторов с их ролями
SELECT SYS_OPERATOR.DEPARTMENT_ID,SYS_PROFILE_LOCAL_ADMIN.ID, SYS.PROFILE_LOCAL_ADMIN.NAME, SYS_PFROFILE_LOCAL_ADMIN_ROLE.ID
FROM SYS_OPERATOR, SYS_PROFILE_LOCAL_ADMIN, SYS_PFROFILE_LOCAL_ADMIN_ROLE
WHERE SYS_PROFILE_LOCAL_ADMIN.ID = SYS_PROFILE_LOCAL_ADMIN_ROLE.PROFILE_LOCAL_ADMIN_ID
Выдаёт ошибку ORA-00942: table or view does not exist

2) Указать отсутствующие роли у локальных администраторов
SELECT SYS_PFROFILE_LOCAL_ADMIN_ROLE.ID
FROM SYS_PFROFILE_LOCAL_ADMIN_ROLE
WHERE SYS_PROFILE_LOCAL_ADMIN.ID IS NULL
Выдаёт ошибку ORA-00942: table or view does not exist

3) Отфильтровать администраторов и пользователей по учреждению
SELECT SYS_PROFILE_LOCAL_ADMIN.ID, B4_USER.ID, SYS_OPERATOR.DEPARTMENT_ID
FROM SYS_PROFILE_LOCAL_ADMIN, B4_USER, SYS_OPERATOR
WHERE B4_USER.DEPARTMENT_ID = SYS_PROFILE_LOCAL_ADMIN.DEPARTMENT.ID
Выдаёт ошибку ORA-00942: table or view does not exist


Полная выборка:
SELECT SYS_PROFILE_LOCAL_ADMIN.ID, B4_USER.ID, SYS_OPERATOR.DEPARTMENT_ID
FROM SYS_PROFILE_LOCAL_ADMIN, B4_USER, SYS_OPERATOR
WHERE B4_USER.DEPARTMENT_ID = SYS_PROFILE_LOCAL_ADMIN.DEPARTMENT.ID AND
(SELECT SYS_PFROFILE_LOCAL_ADMIN_ROLE.ID
FROM SYS_PFROFILE_LOCAL_ADMIN_ROLE
WHERE SYS_PROFILE_LOCAL_ADMIN.ID IS NULL AND
(SELECT SYS_OPERATOR.DEPARTMENT_ID,SYS_PROFILE_LOCAL_ADMIN.ID, SYS.PROFILE_LOCAL_ADMIN.NAME, SYS_PFROFILE_LOCAL_ADMIN_ROLE.ID
FROM SYS_OPERATOR, SYS_PROFILE_LOCAL_ADMIN, SYS_PFROFILE_LOCAL_ADMIN_ROLE
WHERE SYS_PROFILE_LOCAL_ADMIN.ID = SYS_PROFILE_LOCAL_ADMIN_ROLE.PROFILE_LOCAL_ADMIN_ID))
Выдаёт ошибку ORA-00936: Missing expression
Запрос по удалению:
DELETE SYS_PFROFILE_LOCAL_ADMIN_ROLE.ID
FROM SYS_PFROFILE_LOCAL_ADMIN_ROLE

Вот варианты коллег:
Выборка:
SELECT TO_CHAR(bd.SHORT_NAME),
U.LOGIN,
RTRIM(XMLAGG(XMLELEMENT("B4_ROLE",R.NAME||', ')).EXTRACT('//text()'), ', ') AS ROLES
FROM B4_USER U
JOIN B4_USER_ROLE UR
ON UR.USER_ID = U.ID
JOIN B4_ROLE R
ON R.ID = UR.ROLE_ID
JOIN SYS_OPERATOR so
ON (so.LAST_NAME||' '||so.FIRST_NAME||' '||so.MIDDLE_NAME) = U.NAME
JOIN BP_DEPARTMENT bd ON so.DEPARTMENT_ID = bd.ID


WHERE R.ID NOT IN
(SELECT DISTINCT larole.ROLE_ID
FROM SYS_PROFILE_LOCAL_ADMIN la JOIN SYS_PROFILE_LOCAL_ADMIN_ROLE larole
ON la.ID = larole.PROFILE_LOCAL_ADMIN_ID
JOIN B4_ROLE br ON larole.ROLE_ID = br.ID
WHERE la.NAME = 'Локальный администратор ТОФК')
AND R.NAME NOT IN 'Локальный администратор'
and TO_CHAR(bd.SHORT_NAME) LIKE 'УФК%'


GROUP BY TO_CHAR(bd.SHORT_NAME), U.LOGIN,
U.NAME
ORDER BY U.LOGIN
Выдает ORA-00942: table or view does not exist

Удаление:
DELETE SYS_PFROFILE_LOCAL_ADMIN_ROLE.ID FROM B4_USER_ROLE WHERE ID IN
(SELECT distinct ur.ID
FROM
(select * FROM B4_USER WHERE
LOGIN NOT LIKE '00100%'
AND LOGIN NOT LIKE 'bars%'
AND LOGIN NOT LIKE 'megar%'
AND LOGIN NOT LIKE '9500%'
AND LOGIN NOT LIKE 'A7081%'
AND LOGIN NOT LIKE 'A9122%'
AND LOGIN NOT LIKE 'A9123%'
AND LOGIN NOT LIKE 'А7081%'
AND LOGIN NOT LIKE 'А9122%'
AND LOGIN NOT LIKE 'А9123%'
AND LOGIN NOT LIKE 'D0004%'
AND LOGIN NOT LIKE 'А6310%'
AND LOGIN NOT LIKE 'A6310%'
AND LOGIN NOT LIKE 'А9377%'
AND LOGIN NOT LIKE 'A9377%') U
JOIN B4_USER_ROLE UR
ON UR.USER_ID = U.IDE R
JOIN B4_ROL
ON R.ID = UR.ROLE_ID
JOIN SYS_OPERATOR so
ON (so.LAST_NAME||' '||so.FIRST_NAME||' '||so.MIDDLE_NAME) = U.NAME

WHERE R.ID NOT IN
(SELECT DISTINCT larole.ROLE_ID
FROM SYS_PROFILE_LOCAL_ADMIN la JOIN SYS_PROFILE_LOCAL_ADMIN_ROLE larole
ON la.ID = larole.PROFILE_LOCAL_ADMIN_ID
JOIN B4_ROLE br ON larole.ROLE_ID = br.ID
WHERE la.NAME = 'Локальный администратор ТОФК')
AND R.NAME NOT IN 'Локальный администратор'
);
COMMIT;
Выдает ORA-00933 SQL command not properly ended
Что не так в моём коде и коде коллег ?
Я и коллеги делали всё в dbForge Studio for Oracle.
24 мар 16, 13:52    [18973075]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по удалению ролей  [new]
const64
Member

Откуда:
Сообщений: 785
WinBlon,

Так по Oracle есть свой раздел форума...
24 мар 16, 14:00    [18973152]     Ответить | Цитировать Сообщить модератору
Все форумы / Вопрос-Ответ Ответить