30 дек. 2013 г.

Oracle Database 12c R1: ACCESSIBLE BY Clause in PL/SQL

Как Вы хорошо знаете, в PL/SQL нет возможности ограничить область видимости подпрограмм. Если создана PL/SQL-процедура (пакет, функция или объектный тип), то она видима в любом другом PL/SQL-объекте и в анонимном блоке, то есть может вызываться в любом месте!

До Oracle Database версии 12c R1 стандартными средствами СУБД, невозможно реализовать декларативную проверку на возможность вызова PL/SQL-процедур только в определенном месте. Например, было нельзя деклативно реализовать такую проверку: процедуры отвечающие за интерфейс пользователя, имеют право вызывать только процедуры бизнес-логики, и не могут напрямую обращаться к слою доступа к данным, иначе это может привести нарушению логической целостности данных.

В версии 12с эта проблема была устранена: при создании программной единицы PL/SQL можно указывать фразу ACCESSIBLE BY, после которой следует список PL/SQL-объектов, в которых разрешен вызов данной программной единицы.

По умолчанию, отсутствие фразы ACCESSIBLE BY подразумевает возможность вызова PL/SQL-программной единицы в произвольном месте, то есть поведение будет аналогичным как для предыдущих версий СУБД Oracle Database.

Рассмотрим уже знакомый Вам пример.
В приложении, работу с репозитарием объектов инкапсулирует объектный тип TObjectRepository. Этот объектный тип могут использовать только следующих три объектных типа:

  • TPersistent - абстрактный тип, его наследники обладают свойством сохранять и читать свое состояние из БД;
  • TDictionary - инкапсулирует работу с справочниками, в связи с особой ролью системных справочников, может напрямую обращаться к API поддержки репозитория;
  • TGroup - инкапсулирует функционал группировки объектов в группы, тоже напрямую может работать с фабрикой объектов.
В всех других программных единицах PL/SQL, обращение к типу TObjectRepository запрещено.

Итак, при создании спецификации типа TObjectRepository указываем фразу ACCESSIBLE BY

SQL> create or replace type TObjectRepository force 
  accessible by (TPersistent,TDictionary,TGroup) under TObject 
(
  static procedure registerObject(v_pObject in out nocopy TObject),

  static procedure unregisterObject(v_pObject in out nocopy TObject)

)
not final;
/

Type created.

SQL> 

Стоит отметить, что в вышеуказанном примере, типов TPersistent,TDictionary и TGroup еще не существует!

Попробуем обратится к типу TObjectRepository в неразрешенной процедуре:

SQL> create or replace procedure test_accb1 is
  v_xObject TObjectRepository;
begin
  null;
end;
/

Warning: Procedure created with compilation errors.

SQL> show errors;
Errors for PROCEDURE TEST_ACCB1:

LINE/COL ERROR
-------- -----------------------------------------------------------------
2/13  PL/SQL: Item ignored
2/13  PLS-00904: insufficient privilege to access object
  TOBJECTREPOSITORY

SQL>
Как видите, проверка производится уже на этапе компиляции. Следует отметить важное замечание: после того как для PL/SQL-программой единицы указана фраза ACCESSIBLE BY, становится невозможеным обращение к ней в анонимном блоке:

SQL> declare
  v_xObject TObjectRepository;
begin
  null;
end;
/
  v_xObject TObjectRepository;
            *
ERROR at line 2:
ORA-06550: line 2, column 13:
PLS-00904: insufficient privilege to access object TOBJECTREPOSITORY
ORA-06550: line 2, column 13:
PL/SQL: Item ignored
Поэтому, не следует применять ограничение видимости для PL/SQL-программных единиц которые применяются в вызовах верхнего уровня (top calls).

Как обстоит дело насчет проверки в runtime, то есть в время выполнения PL/SQL?
Давай-те попробуем "обмануть" компилятор и сделаем обращение к типу TObjectRepository в динамическом PL/SQL:


create or replace type body TPersistent is

  member procedure save(self in out nocopy TPersistent) is
  begin
    execute immediate 'declare v_xObject TObjectRepository; begin null; end;';
  end;

... ... ... 
При этом обращение к типу TObjectRepository происходит внутри разрешенного типа TPersistent! Однако проверка видимости все равно срабатывает:

SQL> declare
  v_xObject TPersistent;
begin
  v_xObject := new TPersistent(1);
  v_xObject.save();
end;
/
  declare
*
ERROR at line 1:
ORA-06550: line 1, column 19:
PLS-00904: insufficient privilege to access object TOBJECTREPOSITORY
ORA-06550: line 1, column 19:
PL/SQL: Item ignored
ORA-06512: at "SCOTT.TPERSISTENT", line 5
ORA-06512: at line 5
Из вышеприведенного примера следует второй важный вывод: проверка на разрешение видимости осуществляется только для текущего уровня вложенности вызов, и не учитывает более высокие уровни вызовов.
Ну и наконец, пробуем сделать обращение к типу TObjectRepository разрешенное внутри типа TPersistent:

SQL> create or replace type body TPersistent is

  member procedure save(self in out nocopy TPersistent) is
    v_xObject TObjectRepository;
  begin
    null;
  end;

... ... ... 

/

Type body created.

Появившаяся в Oracle Database 12c технология ограничения видимости программных единиц PL/SQL является полезной возможностью, которая позволяет структурировать Ваш код и защищает его от логических ошибок связанных с неверным местом вызова.

20 дек. 2013 г.

RuOUG: Oracle Database 12c High Availability New Features

19 декабря в офисе компании-дистрибьютора Марвел в рамках Российской группы пользователей Oracle (Russian Oracle User Group - RuOUG) состоялся практический семинар посвященный новым возможностям Oracle Database 12c в области обеспечения высокой доступности.
Огромная благодарность компании Марвел и лично директору направления Oracle Дмитрию Никитову за предоставленное помещение и оборудование.

На фотографии Вы видите 3-х докладчиков семинара, cлева направо: Андрей Забелин (Oracle), Андрей Басов (Марвел), Евгений Горбоконенко (Инфосистемы Джет). Ну я четвертым докладчиком был ваш покорный слуга :-)!

В лучших традициях предыдущих семинаров этот практикум был насыщен практическими занятиями: после каждой презентации проводилась лабораторная работа по соответствующей тематике.
На мой взгляд, семинары в подобном формате дают хорошую возможность углубится в новые технологии Oracle Database 12c.

Рис.1 Для проведения лаб. работ было создана 161 виртуальная машина VBox

Программа семинара выглядела следующим образом:

1 Новая архитектура Oracle RAC 12c: Flex RAC, Flex ASM
  Андрей Басов (Марвел)
2 Oracle Database 12с: Transaction Guard и Application Continuity
  Игорь Мельников (Oracle)
3 Oracle Database 12с Global Data Services
  Андрей Забелин (Oracle)
4 Oracle Active Dataguard 12с – новые возможности
  Евгений Горбоконенко (Инфосистемы Джет)

Немного фактов:

  • все практические занятия проводились в среде Oracle Database 12.1.0.1 работающей под управлением Oracle Linux 6 Update 5 for x86-64;
  • всего было создано 161 (!!!) виртуальная машина VirtualBox для проведения занятий;
  • суммарно образы ВМ заняли 2,5 Тб дискового пространства;
  • для запуска виртуальных машин был использован 4-х процессорный сервер Sun X2-4 с 128Гб оперативной памяти на борту;
  • пиковая загрузка хост-сервера была зафиксирована в момент проведения лабораторной работы по Active DataGuard FarSync

Фото 1. На презентации Евгения Горбоконенко про Active Dataguard Far Sync 12c

Также хотелось бы поблагодарить всех участников RuOUG, кто пришел на этот семинар. Этот семинар проводился впервые и возникли неизбежные технические проблемы и мелкие недочеты в лабораторных работах. Но опытных профессионалов это не испугало! :-)
Конечно, в будущем, мы учтем все замечания и пожелания.

Фото 2. Хост-сервер для виртуальных машин

Вы здесь вы можете скачать и посмотреть мою лабораторную работу по использованию технологии Transaction Guard и Application Continuity. Вот собственно сама презентация по этой теме.

Рис 2. Хост-сервер: идут лабораторные работы по Active Dataguard Far Sync

В будущем планируется повторение этого семинара на площадке представительства Oracle в СНГ. Также мы планируем проведение семинаров в подобном формате и по другим интересным технологиям Oracle 12c, прежде всего по Pluggable Database.


Следите за объявлениями!
Увидимся в Oracle Database 12c! :-)

13 нояб. 2013 г.

Oracle Database 12c R1: новое в Edition Base Redefinition

В последнее время к мне, один за другим, обратилось уже три крупных российских ISV-разработчика приложений с вопросами по технологии Edition Base Redefinition [EBR]. Причем все они разрабатывают ПО для банков. Я думаю, что Вы поняли, чем вызван их интерес. Ведь каждое обновление приложения - это вынужденный простой для заказчика, что особенно болезненно для банковского сектора. Вообще говоря, минимизация плановых простоев - это важная задача в любой организации.






Технология версионирования PL/SQL-объектов Edition Base Redefinition появилась в Oracle Database версии 11.2. EBR позволяет проводить обновление приложения (вернее изменять код его хранимых процедур) "на лету", без остановки приложения. При этом, компиляция новой версии PL/SQL-объекта (пакета, объектного типа, функции или процедуры) производится в новой версии; работающие в этот момент пользователи НЕ получают исключение "ORA-04068 existing state of packages has been discarded", а продолжают работу с старой версией PL/SQL-кода.

Помимо чисто технических вопросов, главные вопросы, которые задавали мне представители этих компаний, звучали примерно так: "Есть ли примеры крупных внедрений этой технологии, что будет с этой технологией в дальнейшем, и можно ли воообще полагаться на нее?".

Что касается примеров использования этой технологии.
В сентябре этого года была выпущена новая версия ERP-системы от Oracle - Oracle E-Business Suite 12.2. Начиная с версии 12.2, процедура "наката" обновлений на Oracle EBS происходит без остановки, на уровне БД это достигается с помощью технологии EBR. Oracle EBS - это очень сложное приложение, которое содержит десятки тысяч таблиц и миллионы строк PL/SQL-кода. На мой взгляд, использование EBR в таком приложении, говорит о зрелости технологии. Конечно, поставщик технологии (то есть Oracle Corp.), а EBR не является готовым продуктом, а представляет собой базовую технологию, не использовал бы ее в своем основном приложении, если бы не был уверен в ее надежности и не имел бы планов по ее дальнейшему развитию.

Рис.1 Дистрибутив Oracle EBS 12.2 доступен на сайте edelivery.oracle.com

По поводу дальнейшего развития технологии EBR.
В недавно вышедшей СУБД Oracle Database 12c R1, технология EBR получила свое дальнейшее развитие - в ней появились очень полезные новые возможности. Давайте рассмотрим их более подробно.

1. Потенциальная версионируемость отдельного объекта, а не всех объектов схемы.
  1.1 В Oracle Database 11g версионируемость включается для всех объектов схемы

В версии Oracle Database 11.2 потенциальная версионируемость включалась на уровне всей схемы. То есть, когда Вам нужно было включить версионирование объектов, это производилось на уровне всей схемы:

[oracle@**** ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Sun Nov 1 12:50:56 2013

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

rem --Включаем возможность версионирования в схеме RSCOTT: в 11gR2 включается для всех объектов схемы!
SQL> ALTER USER rscott ENABLE EDITIONS;

User altered.
Таким образом, при помощи команды "ALTER USER <имя_схемы> ENABLE EDITIONS" версионируемость включалась для всех объектов схемы! Как Вы помните, неверсионируемый объект не может зависеть от версионируемого объекта. Если, например, мы создадим объектный тип PL/SQL в схеме, для которой включена потенциальная версионируемость, то мы не сможем создать таблицы с столбцом этого объектного типа (поскольку таблицы не версионируются!):
SQL> conn rscott/rtiger
Connected.
SQL> CREATE TYPE TMyType AS OBJECT
  2  (
  3    Id NUMBER(9)
  4  );
  5  /

Type created.

SQL> CREATE TABLE MyTable 
  2  ( 
  3    Id TMyType
  4  );
CREATE TABLE MyTable
*
ERROR at line 1:
ORA-38818: illegal reference to editioned object RSCOTT.TMYTYPE
В вышеприведенном примере объектный тип TMyType потенциально может иметь другие версии, поэтому невозможно использовать его в качестве типа для столбца таблицы, несмотря на то, что мы не собираемся иметь другие версии этого типа. Это происходит потому-что потенциальная версионируемость была включена для всех объектов схемы RSCOTT. По этой причине, кстати, в версии 11.2 нельзя было создавать очереди Advanced Queuing с типом из схемы для которой включено версионирование:
SQL> BEGIN
  dbms_aqadm.create_queue_table(queue_table        => 'MY_QUEUE',
                                queue_payload_type => 'TMyType');
END;
/

BEGIN
*
ERROR at line 1:
ORA-38818: illegal reference to editioned object RSCOTT.TMYTYPE
ORA-06512: at "SYS.DBMS_AQADM", line 81
ORA-06512: at line 2

Для решения вышеописанной проблемы, в Oracle Database 11.2 приходилось использовать обходной путь (workaround), заключающийся в выводе НЕверсионируемых объектов в отдельную схему, для которой версионируемость не включалась:
[oracle@**** ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Sun Nov 1 13:11:26 2013

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

rem -- Создаем отдельную схему для неверсионируемых объектов:
SQL> CREATE USER rscott_nonvers IDEBTIFIED BY rtiger_nonvers;

User created.

SQL> GRANT connect, resource, create synonym TO rscott_nonvers;

Grant succeeded.

rem --Создаем неверсионируем тип TMyType
SQL> CONN rscott_nonvers/rtiger_nonvers
Connected.

SQL> CREATE TYPE TMyType AS OBJECT
  2  (
  3    Id NUMBER(9)
  4  );
  5  /

Type created.

rem -- Не забываем дать права на этот тип пользователю RSCOTT
SQL> GRANT execute ON TMyType TO rscott; 

Grant succeeded.


SQL> CONN rscott/rtiger
Connected.
SQL> 
rem -- Для удобства создаем локальный синоним на тип TMyType в схеме RSCOTT_nonvers
SQL> CREATE SYNONYM TMyType FOR rscott_nonvers.TMyType;

Synonym created.
rem -- Наконец, успешно создаем таблицу c столбцом неверсионируемого типа TMyType!
SQL> CREATE TABLE MyTable
  2  (
  3    Id TMyType
  4  );

Table created.

SQL>   
  1.2 В Oracle Database 12с версионируемость включается для уровне объекта

Начиная с Oracle Database версии 12.1 в вышеприведенных дополнительных действиях нет необходимости, поскольку теперь потенциальная версионируемость PL/SQL-объекта может включаться для отдельного объекта. При создании PL/SQL-объекта указывается ключевое слово EDITIONABLE, если объект потенциально может версионироваться, NONEDITIONABLE - если объект не будет версионироваться:

[oracle@****]$ sqlplus rscott/rtiger

SQL*Plus: Release 12.1.0.1.0 Production on Mon Nov 2 11:09:43 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Last Successful login time: Mon Nov 02 2013 11:08:16 +04:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> 
rem -- Cоздаем неверсионируемый тип 
SQL> CREATE NONEDITIONABLE TYPE TMyType AS OBJECT
  2  (
  3    Id NUMBER(9)
  4  );
  5  /

Type created.
rem -- Cоздаем таблицу c столбцом неверсионируемого типа TMyType!
SQL> CREATE TABLE MyTable
  2  (
  3    Id TMyType
  4  );

Table created.
2. Ограничение версий для выражений вычисляемых столбцов в таблицах и материализованных представлениях
  2.1 Особенности использования виртуальных столбцов в Oracle Database 11g

Еще начиная с версии 11g Release 1, в СУБД Oracle появилась поддержка виртуальных столбцов, то есть столбцов, которые заданы вычисляемым выражением. В выражении виртуального столбца также могут участвовать хранимые PL/SQL-функции, как например в следующем случае:

[oracle@**** ~]$ sqlplus rscott/rtiger

SQL*Plus: Release 11.2.0.4.0 Production on Wed Nov 6 16:31:47 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning and Real Application Testing options

SQL> CREATE OR REPLACE FUNCTION getMyId RETURN NUMBER 
  DETERMINISTIC IS
BEGIN
  RETURN 1;
END;
 /

Function created.

rem --создаем таблицу с виртуальным столбцом в выражении которого участвует PL/SQL-функция
SQL>  CREATE TABLE myTable
(      
  Id    NUMBER(9),
  MyId  as (getMyId())
);

Table created.
Обратите внимание, что нам удалось создать неверсионируемый объект (таблицу), который зависит от версионируемого объекта (PL/SQL-функции).
Поскольку значение виртуального столбца на диске не сохраняется, мы смогли это сделать!

Занесем одну строку в таблицу и проверим значение виртуального столбца:
SQL> INSERT INTO MyTable(Id) VALUES(0);

1 row created.

SQL> SELECT * FROM MyTable;

 ID  MYID
---------- ----------
  0     1

SQL> 
Как Вы наверно догадались, наc подстерегает одна очевидная опасность: при смене версии функции, виртуальный столбец изменит свое значение!
Например:
SQL> conn / as sysdba
Connected.

rem -- Создаем новую версию
SQL> CREATE EDITION MyVersion1 AS CHILD OF ORA$BASE;

Edition created.

SQL> GRANT USE ON EDITION MyVersion1 TO RSCOTT;

Grant succeeded.
Понятно, что если если наша функция getMyId изменит свое поведение в новой версии, то значение виртуального столбца будет зависеть от текущей версии в сессии пользователя:
SQL> conn rscott/rtiger
Connected.

SQL> ALTER SESSION SET EDITION=MyVersion1;

Session altered.

SQL> create or replace function getMyId return number 
  deterministic is
begin
  return 2;
end;
 /

Function created.

SQL> SELECT * FROM MyTable;

 ID  MYID
---------- ----------
  0     2

rem -- Переключаемся в старую версию:
SQL> ALTER SESSION SET EDITION=ORA$BASE;

Session altered.

SQL> SELECT * FROM MyTable;

 ID  MYID
---------- ----------
  0     1

SQL> 
  2.2 Определение доступных версий для виртуальных столбцов в Oracle Database 12c
Начиная с Oracle Database 12c для виртуальных столбцов можно задавать различные ограничения на используемые версии. С помощь модификатора EVALUATE USING CURRENT EDITION мы жестко фиксируем версию для виртуального столбца на версию, которая была в момент создания таблицы (либо в момент выдачи оператора ALTER TABLE):
[oracle@**** ~]$ sqlplus rscott/rtiger

SQL*Plus: Release 12.1.0.1.0 Production on Wed Nov 6 14:12:11 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Last Successful login time: Wed Nov 06 2013 14:07:51 -05:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options

SQL> CREATE TABLE myTable
(
  Id    NUMBER(9),
  MyId  as (getMyId()) EVALUATE USING CURRENT EDITION
);
 /
Table created.

SQL> INSERT INTO MyTable(Id) VALUES(0);

1 row created.

SQL> SELECT * FROM MyTable;

        ID       MYID
---------- ----------
         0          1

SQL> ALTER SESSION SET EDITION=MyVersion1;

Session altered.

SQL> SELECT * FROM MyTable;

        ID       MYID
---------- ----------
         0          1

SQL>

Как видите, несмотря на переключение версий, виртуальный столбец всегда использует версию которая была в момент выдачи DDL-оператора. Также мы можем явно указать используемую версию для виртуального столбца:
SQL> ALTER TABLE myTable MODIFY MyId as (getMyId())
  EVALUATE USING EDITION MyVersion1;
  /
Table altered.

SQL> ALTER SESSION SET EDITION=ORA$BASE;

Session altered.

SQL>  SELECT * FROM MyTable;

        ID       MYID
---------- ----------
         0          2

Если для виртуального столбца указать EVALUATE USING NULL EDITION, то поведение виртуального столбца будет как в Oracle 11gR2 - значение будет вычисляться в текущей версии в которой происходит обращение к столбцу. Это поведение будет работать по умолчанию, - если фраза EVALUATE USING для столбца не задана:
SQL> ALTER TABLE myTable MODIFY MyId as (getMyId())
  EVALUATE USING NULL EDITION;
/

Table altered.

Дополнительно, c помощью фразы UNUSABLE BEGINNING WITH указывается версия, начиная с которой в иерархии версий, будет запрещено использование виртуального столбца:

SQL> CREATE TABLE myTable
(
  Id    NUMBER(9),
  MyId  as (getMyId()) UNUSABLE BEGINNING WITH EDITION MyVersion1
);
  
Table created.

SQL> INSERT INTO myTable(Id) VALUES(1);

1 row created.

SQL> COMMIT;

Commit complete.

SQL> SELECT * FROM mytable;

        ID       MYID
---------- ----------
         1          1

SQL> ALTER SESSION SET EDITION=myversion1;

Session altered.

SQL> SELECT * FROM mytable;
 SELECT * FROM mytable
*
ERROR at line 1:
ORA-00904: "RSCOTT"."GETMYID": invalid identifier
Наоборот, c помощью фразы UNUSABLE BEFORE, можно указать версию, для всех родительских версий которой будет запрещено использование виртуального столбца.

  2.3 Поддержка версионированных PL/SQL-функций в материализованных представлениях в Oracle Database 12c

До Oracle Database 12c было запрещено использование версионированных PL/SQL-функций в материализованных представлениях:

[oracle@**** ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Sun Nov 11 15:02:16 2013

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> CREATE MATERIALIZED VIEW mymview AS
2  SELECT * FROM all_objects 
3  WHERE getMyId=1;


CREATE MATERIALIZED VIEW mymview AS
          *
ERROR at line 1:
ORA-38818: illegal reference to editioned object RSCOTT.GETMYID
Начиная с Oracle Database 12c стало возможным обращение к версионируемым PL/SQL-объектам внутри материализованного представления. Для этого необходимо при создании материализованного представления указать фразу EVALUATE USING ..., либо фразу UNUSABLE BEGINNING .... Назначение этих модификаторов установки версии для PL/SQL-вызовов внутри материализованных представлений, полностью совпадает с их назначением в рассмотренных ранее примерах версионированиия виртуальных столбцов:
[oracle@**** ~]$ sqlplus rscott/rtiger

SQL*Plus: Release 12.1.0.1.0 Production on Wed Nov 13 13:11:08 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Last Successful login time: Wed Nov 13 2013 13:07:37 -05:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options

SQL> CREATE MATERIALIZED VIEW mview
2 EVALUATE USING EDITION MyVersion1 AS
3 SELECT * FROM all_objects 
4 WHERE getmyid=1;


Materialized view created.

В вышерассмотренном примере, для вызова функции getMyId жестко устанавливается версия MyVersion1.
Как Вы могли заметить, установка версии действует на все PL/SQL-вызовы внутри материализованного представления: в вычисляемых столбцах, и в предикатах фразы WHERE.

  3 Версионирование для публичных синонимов (public synonym)

В Oracle Database 11g Release 2 (11.2) публичный синоним не мог ссылаться на версионируемый объект:

[oracle@**** ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Sun Nov 11 16:23:16 2013

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> CREATE PUBLIC SYNONYM getMyId FOR getMyId;

CREATE PUBLIC SYNONYM getMyId FOR getMyId;
*
ERROR at line 1:
ORA-38818: illegal reference to editioned object RSCOTT.GETMYID
В версии 12с эта проблема решена и теперь публичный синоним может версионироваться. Для создания версионируемого синонима при его создании необходимо указать ключевое слово EDITIONABLE
[oracle@**** ~]$ sqlplus rscott/rtiger

SQL*Plus: Release 12.1.0.1.0 Production on Wed Nov 13 13:54:07 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Last Successful login time: Wed Nov 13 2013 13:11:08 -05:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options

SQL> CREATE EDITIONABLE PUBLIC synonym getMyId FOR getMyId;

Synonym created.

  Заключение

В новейшей версии СУБД Oracle Database - 12c, технология обновления PL/SQL-кода без остановки - Edition Base Redefinition, получила свое дальнейшее развитие. Появились такие мощные возможности, как потенциальное версионирование на уровне отдельного объекта, версионирование виртуальных столбцов, версионирование кода в материализованных представлениях. Также следует отметить очень полезную новую возможность - версионирование публичных синонимов.

28 июн. 2013 г.

Oracle Database 12.1: Invisible columns

В Oracle Database 12c Release 1 появилась новая интересная возможность: невидимые столбцы (Invisible columns). Невидимость столбцов заключается в том, что их не видно в результате операторов доступа к таблице в случае отсутствия явного указания имен столбцов. Следующие операторы не возвращают скрытые столбцы в своем результате:
  • SELECT * FROM <имя_таблицы>;
  • команда DESCRIBE в утилите SQL*Plus;
  • тип записи PL/SQL основанный на структуре таблицы с помощью атрибута %ROWTYPE;
  • функции определения структуры курсора в OCI ( OCIDescribe).
Для определения невидимости столбца, при создании таблицы указывается модификатор INVISIBLE:
C:\>sqlplus test12c/oracle

SQL*Plus: Release 12.1.0.1.0 Production on Mon Jan 7 08:51:04 2013

Copyright (c) 1982, 2012, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> CREATE TABLE customers
  2  (
  3    id          NUMBER(9),
  4    Name        VARCHAR2(64),
  5    Description VARCHAR2(512) INVISIBLE
  6  );

Table created.

SQL> DESC customers
 Name                                      Null?    Type
 ----------------------------------------- -------- ------------
 ID                                                 NUMBER(9)
 NAME                                               VARCHAR2(64)
Уже существующий видимый столбец можно сделать невидимым с помощью оператора ALTER TABLE:
SQL> ALTER TABLE customers MODIFY (Name INVISIBLE);

Table altered.

SQL>
Точно также невидимый столбец можно сделать видимым:
SQL> ALTER TABLE customers MODIFY (Description VISIBLE);

Table altered.

SQL>
Если необходимо вставить значение в невидимый столбец, то в операторе INSERT нужно явно указывать его имя:
SQL> INSERT INTO customers VALUES(1,'Scott','Description for Scott');
INSERT INTO customers VALUES(1,'Scott','Description for Scott')
            *
ERROR at line 1:
ORA-00913: too many values

SQL> INSERT INTO customers(Id,Name, Description)
  2    VALUES(1,'Scott','Description for Scott');

1 row created.

SQL> SELECT * FROM customers;

        ID
----------
DESCRIPTION
--------------------------------------------------
         1
Description for Scott
Обратите внимание, что в операторе SELECT * FROM customers невидимый столбец не просто не выводится, а отсутствует в структуре курсора !
Если в операторе INSERT не указаны имена столбцов, то невидимый столбец будет иметь значение NULL, либо значение по умолчанию, если конечно оно установлено для невидимого столбца:
SQL> INSERT INTO customers VALUES(2,'Description for Tiger');

1 row created.

SQL> SELECT nvl(name,'NULL') FROM customers;

        NVL(NAME,'NULL')
----------------------------
NULL
Из вышеприведенного примера следует, что невидимый столбец Name можно вывести только явно указав его имя в запросе. Как и обычные столбцы, невидимые столбцы:
  • могут быть ключом секционирования в таблице;
  • могут участвовать в вычисляемых выражениях в виртуальном столбце;
  • сами могут быть виртуальными столбцами.
К сожалению, область использования невидимых столбцов имеет некоторые ограничения.
Следующие типы таблиц не могут иметь невидимых столбцов:
  • внешние таблицы (External tables);
  • кластерные таблицы (Cluster tables);
  • временные таблицы
Также атрибуты пользовательских объектных типов PL/SQL не могут быть невидимыми.
Утилита SQL*Plus теперь имеет новый параметр COLINVI[SIBLE] управляющий выводим информации о невидимых столбцах:

SQL> DESC customers
 Name        Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID          NUMBER(9)
 DESCRIPTION         VARCHAR2(512)

SQL> SET COLINVISIBLE ON
SQL> DESC customers
 Name        Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID          NUMBER(9)
 DESCRIPTION         VARCHAR2(512)
 NAME (INVISIBLE)        VARCHAR2(64)

SQL>
При этом параметр COLINVISIBLE влияет только на результат команды DESCRIBE, все операторы SQL и PL/SQL для доступа к невидимым столбцам должны явно содержать его имя:
SQL> SET COLINVISIBLE ON
SQL> declare
  v_xCustomer customers%rowtype;
begin
  v_xCustomer.Name := 'Scott Tiger';
end;
/
  v_xCustomer.Name := 'Scott Tiger';
              *
ERROR at line 4:
ORA-06550: line 4, column 15:
PLS-00302: component 'NAME' must be declared
ORA-06550: line 4, column 3:
PL/SQL: Statement ignored
Интересно заметить, что при включении видимости ранее невидимых столбцов меняется их порядок в операторе SELECT *:
SQL> ALTER TABLE customers MODIFY (Name VISIBLE);

Table altered.

SQL> SELECT * FROM customers;

 ID
----------
DESCRIPTION
--------------------------------------------------------------------------------
NAME
----------------------------------------------------------------
  1
Description for Scott
Scott
то есть меняется значение поля COLUMN_ID в представлениях словаря ALL_TAB_COLUMNS, DBA_TAB_COLUMNS, и USER_TAB_COLUMNS.
Невидимые колонки полезны при плавных обновлениях приложения, когда в новой версии приложения нужно удалить некоторые столбцы.
В сочетании с технологией обновления приложения Edition base redefinition, скрытые столбцы обеспечивают бОльшую гибкость при переходе на новую версию приложения.

26 июн. 2013 г.

Oracle Database 12c R1 released!

Да, да - это не шутка! Наконец-то произошло то чего все мы так долго ждали: Oracle Database 12c Release 1 вышла!

Дистрибутивы для платформ Linux x64, Solaris x64 и Solaris SPARC вы можете скачать с сайта OTN.
Обратите внимание, что 32-х разрядный линукс теперь не поддерживается в качестве платформы для СУБД, - для этой платформы теперь есть только клиентское ПО (Oracle Client 12c R1).

6 мар. 2013 г.

Oracle Database Appliance X3-2

Вчера было объявлено о доступности новой версии Oracle Database Appliance! Версия имеет похожую нумерацию с экзадатой: Х3-2.
Измененеий очень много как с точки зрения "железа", так и с точки зрения софта.

Самое главное изменение в железе: теперь комплекс представляет из себя не моноблок, как раньше, а три отдельных вычислительных блока: два - узлы БД, третий - система хранения (storage). В качестве процессоров теперь используются 8-ядерные процессоры Intel Xeon E5-2690. Объем памяти на каждом узле увеличен до 256Гб. Система хранения представляет собой полку заполненную 24-ю дисками в формате 2,4 дюйма: 20 дисков по 900Гб с скоростью вращения 10000RPM и 4 SSD-диска емкостью по 200Гб каждый.
Как видите, суммарно теперь ODA имеет 18Тб "сырого" дискового пространства. Дополнительно, можно приобрести вторую такую же дисковую полку, и, таким образом, емкоcть дисков составит 36Тб!

Стоимость Oracle Database Appliance X3-2 согласно официальному прайс-листу составляет 60 000USD, стоимость дополнительной дисковой полки - 40 000USD. Причем интересно, что в прайс-листе оставлен и старый вариант ODA (с 6-ти ядерными процессорами на борту).

С точки зрения софта: теперь на Oracle Database Appliance можно запускать виртуальные машины OracleVM!
Об этом подробнее в отдельном посте...