Partition Option & Oracle Server SE One

Partition Option & Oracle Server SE One

Собственно, возник вопрос: а присутствуют ли всякие DBA_TAB_PARTITIONS и иные объекты словаря в SE One? Причина вопроса проста: код заточен на Oracle EE и использует эти представления. После установки обнаружилось, что данные объекты не только присутствуют, но и не пусты. Раз не пусты, то из этого вытекает, что создать сегментированные таблицы возможно, а раз так, то неплохо бы посмотреть, как это происходит.

declare
  v_cnt pls_integer;
begin
  for rec in (select distinct table_owner, table_name from dba_tab_partitions) loop
    execute immediate 'select count(1) from "'||rec.table_owner||'"."'||rec.table_name||'"' into v_cnt;
    if v_cnt > 0 then
      dbms_output.put_line('"'||rec.table_owner||'"."'||rec.table_name||'" - '||v_cnt);
    end if;
  end loop;
end;
/

"SYS"."WRH$_SEG_STAT" – 3138

Как видно, не только есть объект с секциями, но он ещё и не пуст…

Что же происходит при обычном создании сегментированной таблицы? Давайте попробуем:

SQL> create table t (n number) partition by hash(n) partitions 16;
create table t (n number) partition by hash(n) partitions 16
*
ERROR at line 1:
ORA-00439: feature not enabled: Partitioning

Теперь взглянем на файл, где создаётся объект WRH$_SEG_STAT.

Это файл ?/rdbms/admin/catawrtb.sql.

В самом начале присутствует строка:

-- Turn ON the event to disable the partition check
alter session set events '14524 trace name context forever, level 1';

Ну что же, давайте применим:

SQL> connect usr/password@database
Connected.
SQL> alter session set events '14524 trace name context forever, level 1';
Session altered.
SQL> create table t (n number) partition by hash(n) partitions 16;
Table created.
SQL>

Т.о., мы создали сегментированную таблицу на Oracle SE One. Есть только одно НО — это нарушает лицензию Oracle на данный продукт.

Для чего это можно пригодиться?

Представьте, что у вас есть скрипты на установку схемы на Oracle EE с созданием сегментированных таблиц, т.е. требующих наличие Partition Option.

Т.е. вы

  1. выключаете проверку на Partition Option:
    alter system set events '14524 trace name context forever, level 1';
    
  2. создаёте свою схему
  3. реорганизуете сегментированные таблицы в обычные путём dbms_redefinition
  4. возвращаете состояние event-а обратно:
    alter system set events '14524 trace name context off';
    

Ну и напоследок – попробовал выполнить запрос:

select name ,version ,detected_usages
,total_samples ,currently_used ,first_usage_date
,last_usage_date ,aux_count ,last_sample_period
  from dba_feature_usage_statistics
 where last_usage_date is not null
   and name like '%Part%'
;
NAME VERSION DETECTED_USAGES TOTAL_SAMPLES CURRE FIRST_US LAST_USA
AUX_COUNT LAST_SAMPLE_PERIOD
--------------------- ----------- --------------- ------------- ----- -------- -------- -
--------- ------------------
Partitioning (system) 11.2.0.3.0 1 1 TRUE 28.11.12 28.11.12
2,74 0

Данных по использованию Partition Option для пользователя (т.е. строки с Partitioning (user)) в таблице dba_feature_usage_statistics нет, т.е. формально – следов не осталось.

В итоге у нас есть возможность использовать скрипты, ориентированные на Oracle EE, для разворачивания объектов базы данных даже при условии использования Oracle Partition Option с их последующей реорганизацией на регулярные таблицы, чтобы не нарушать лицензии на RDBMS Oracle.