снова ORA-00942

andreymx
Дата: 16.09.2015 13:09:23
такая вот схема:
БД А => есть VIEW ra.view_obs => выданы гранты на схему L@A with grant option
БД E => есть VIEW s.view_mat(внутри таблицы БД E + ra.view_obs@A по паблик линку на L@A)
выданы гранты для чтения view_mat на схему BA@E with grant option

И всё это работало два года
И всё это перестало работать вчера вечером
при заходе в БД А читаем
select * from s.view_mat@link_схему_BA_в БД_E
получаем ORA-00942
Если пересобрать VIEW s.view_mat@E без ra.view_obs@A, то работает, но, ессно, неверно.
Сделал промежуточное решение - создал таблицу s.view_obs@e as select * from ra.view_obs@A; Так работает

Заменили в ra.view_obs всю начинку на select from dual - все равно не работает

Гранты все добавлял - удалял - добавлял - ничего путнего


Оракл 11.2.0.3
Какой-то полтергейст

ЗЫ: все права выдаются на пользователя, не на схему.
ЗЫ1: Судя по логам, за последние сутки причастные к ситуации таблицы не пересоздавались, гранты не менялись
andreymx
Дата: 16.09.2015 13:19:02
и вообще какая-то хрень лезет

-- коннект на схему с основной вьюхой
SQL> conn s/====@E
Connected AS s@E

-- удаляем права на схему, которая смотрит на БД А
SQL> REVOKE SELECT  ON view_mat FROM BA
REVOKE COMPLETE.

-- даём права на схему, которая смотрит на БД А
SQL> GRANT SELECT ON view_mat TO BA WITH GRANT OPTION
GRANT COMPLETE.

-- удаляем права на обычную схему B@E
SQL> REVOKE SELECT  ON view_mat FROM B
REVOKE COMPLETE.

-- даём права на обычную схему B@E
SQL> GRANT SELECT ON view_mat TO B WITH GRANT OPTION
GRANT COMPLETE.


-- читаем вьюху на родной схеме
SQL> SELECT COUNT(*) FROM s.view_mat

  COUNT(*)
----------
       870
1 ROW selected.


-- читаем вьюху на схеме, которая смотрит на БД А
SQL> conn BA/====@E
Connected AS BA@E

SQL> SELECT COUNT(*) FROM s.view_mat
SELECT COUNT(*) FROM s.view_mat
                             *
-- отлуп
ERROR AT line 1
ORA-00942: таблица или представление пользователя не существует


-- читаем вьюху на обычной схеме B@E
SQL> conn B/====@E
Connected AS B@E

SQL> SELECT COUNT(*) FROM s.view_mat

  COUNT(*)
----------
       870
1 ROW selected.


-- читаем вьюху на схеме, которая смотрит на БД А
SQL> conn BA/====@E
Connected AS BA@E

SQL> SELECT COUNT(*) FROM s.view_mat

-- все ок
  COUNT(*)
----------
       870
1 ROW selected.
K790
Дата: 16.09.2015 13:22:34
andreymx,

покажите определение ====@E
также возможно влияние трассировки event= "22827 trace name context forever, level 1"
andreymx
Дата: 16.09.2015 13:26:45
K790
andreymx,

покажите определение ====@E
это пароль схемы
andreymx
Дата: 16.09.2015 13:27:44
K790
также возможно влияние трассировки event= "22827 trace name context forever, level 1"
а я как разраб могу это увидеть где-то? У меня есть админские права, но весьма порезанные
K790
Дата: 16.09.2015 13:31:27
andreymx,

не то скопировал :)
линк link_схему_BA_в БД_E

pfile/spfile
andreymx
Дата: 16.09.2015 17:32:59
K790
andreymx,

не то скопировал :)
линк link_схему_BA_в БД_E

pfile/spfile
к сожалению, я не админ, а простой клепальщик
если уточнишь, что конкретно из pfile/spfile затребовать от админов, я у них попрошу

спасибо
andreymx
Дата: 16.09.2015 18:10:15
andreymx
такая вот схема:
БД А => есть VIEW ra.view_obs => выданы гранты на схему L@A with grant option
БД E => есть VIEW s.view_mat(внутри таблицы БД E + ra.view_obs@A по паблик линку на L@A)
выданы гранты для чтения view_mat на схему BA@E with grant option

И всё это работало два года
И всё это перестало работать вчера вечером
при заходе в БД А читаем
select * from s.view_mat@link_схему_BA_в БД_E
получаем ORA-00942
Если пересобрать VIEW s.view_mat@E без ra.view_obs@A, то работает, но, ессно, неверно.
Сделал промежуточное решение - создал таблицу s.view_obs@e as select * from ra.view_obs@A; Так работает
похоже на оракловый сцукоглюк
--в VIEW s.view_mat поменял в самом внешнем запросе конструкцию
    WHERE sel.id_kp NOT IN (SELECT id_k FROM s.N WHERE prizn IN (13)
                            UNION
                            SELECT id_d FROM s.N WHERE prizn IN (4))
-- на
    WHERE sel.id_kp NOT IN (SELECT id_k FROM s.N WHERE prizn IN (13))
      AND sel.id_kp NOT IN (SELECT id_d FROM s.N WHERE prizn IN (4))
и ошибка ушла

кстати, как раз вчера в другой вьюхе уже думал переписать этот кусок кода


но так и не стал ближе к разгадке сабжа :(