DBOD v3 - работа над ошибками
В ходе демонстрации опций БД у нас произошли три сбоя. Ошибки возникли по двум причинам. Как я и обещал: более подробно расскажу об этих причинах.
1) При демонстрации доступа к архиву Flashback Archive, пользователем, который не является владельцем базовой таблицы, возникла странная ошибка ORA-00942.
Давайте посмотрим повнимательнее, что произошло:
--выдаем права пользователю SCOTT на чтение исторических данных
SQL> conn ttdemo/ttdemo
Connected.
SQL> GRANT FLASHBACK ON plans TO scott;
Grant succeeded.
После этого пользователь SCOTT пытается прочитать архивные данные:
SQL> conn scott/tiger
Connected.
SQL> SELECT COUNT(*) FROM ttdemo.plans AS OF TIMESTAMP sysdate - 600/(24*3600)
*
ERROR at line 4:
ORA-00942: таблица или представление пользователя не существует
Анализ показывает, что SQL-engine честно переписал запрос, перенаправив его на архивную таблицу (вернее на две таблицы: ttdemo.SYS_FBA_TCRV_66452 и ttdemo.SYS_FBA_HIST_66452), но пользователь SCOTT НЕ имеет к ним прав!
То есть баг заключется в том, что операция GRANT FLASHBACK ON plans TO scott; "забывает" дать права на FBA-таблицы.
На самом деле проблема зарыта более глубоко: в общем случае FBA-таблиц может еще не существовать, т.е. процесс FBDA еще не успел их создать (как вы помните: для таблиц архива используется отложенное создание сегмента); и непонятно как давать гранты на несуществующий объект...
Путь обхода этой проблемы заключается в явной выдаче прав на FBA-таблицы пользователю (перечень нужных FBA-таблиц можно узнать по внутреннему номеру в представлении USER_FLASHBACK_ARCHIVE_TABLES).
SQL> conn ttdemo/ttdemo
Connected.
SQL> GRANT SELECT ON SYS_FBA_TCRV_66452 TO scott;
Grant succeeded.
SQL> GRANT SELECT ON SYS_FBA_HIST_66452 TO scott;
Grant succeeded.
После этого все работает как надо:
SQL> conn scott/tiger
Connected.
SQL> SELECT COUNT(*) FROM ttdemo.plans AS OF TIMESTAMP sysdate - 600/(24*3600)
COUNT(*)
----------
40
1 row selected.
2) Второй сбой произошел при демонстрации создания зашифрованного табличного пространства (Tablespace TDE). Кстати говоря, по этой же причине произошел сбой и в демонстрации Николая Данюкова.
Перед созданием зашифрованного табличного пространства я попытался создать wallet:
SQL>
SQL> alter system set encryption key authenticated by "dbod-3";
alter system set encryption key authenticated by "mode3"
*
ERROR at line 1: ORA-28353: сбой при открытии футляра
При этом я удалил все зашифрованные табличные пространства.
Удаление wallet-а вроде бы решило эту проблему:
SQL> alter system set encryption key authenticated by "dbod-3";
System altered.
Но теперь создание зашифрованного табличного пространства вызывает ошибку:
SQL> CREATE TABLESPACE ttdemo_secure
DATAFILE '/oradata/orcl/ttdemo_secure01.dbf' SIZE 20M REUSE
ENCRYPTION USING '3DES168' DEFAULT STORAGE (ENCRYPT);
2 3 CREATE TABLESPACE ttdemo_secure
*
ERROR at line 1:
ORA-28374: типизированный главный ключ не найден в футляре
Произошло следующее: в команде создания wallet-а я установил новый пароль, но старый пароль видимо остался в "мозгах" экземпляра (точнее в его разделяемой памяти). :-)
Решение простое: нужно удалить зашифрованные табличные пространства, закрыть wallet-а и его удалить, после этого нужно перегрузить экземпляр.
После этого все работает как часы !
Читать дальше...