msgbartop
Блог Oracle разработчика
msgbarbottom
foxbase

22.07.2010 Oracle CoreApp. Регистрация подсистем

Начиная с этой статьи мы будем добавлять некоторую функциональность в CoreApp. Сегодня мы создадим компонент, который будет хранить информацию об установленных в системе подсистемах и версиях этих подсистем и зарегистрируем в этом компоненте сам CoreApp. 

Регистрационные данные из этого компонента в дальнейшем будут использоваться в системной форме «About», где пользователь сможет увидеть список установленных подсистем и текущую версию каждой подсистемы. 

С практической точки зрения мы создадим две таблицы и один PL/SQL пакет, а также добавим их вызовы в соответствующие файлы _make.sql и _drop.sql, а также сделаем рабочими файлы setup.sql и clear.sql для подсистемы CoreApp.

Примем соглашение об именовании объектов базы данных. Все объекты будут иметь префикс c_, что позволит автоматически идентифицировать принадлежность объекта к ядру системы CoreApp.

Для регистрации подсистем создадим простую таблицу c_products со следующими атрибутами:

Атрибут
Описание
Код
Код подсистемы
Наименование
Название подсистемы
Префикс
Префикс подсистемы
Копирайт
Информация об авторских правах
Описание
Описание подсистемы

Для создания таблицы напишем SQL скрипт c именем c_products.sql, который поместим в каталог \coreapp\server\tabs\

Скрипт будет иметь следующий вид:

@dba\c_def;

create table c_products
(
  code      varchar2(32) not null,
  name      varchar2(64) not null,
  prefix    varchar2(32),
  copyright varchar2(32),
  descr     varchar2(2000)
)
tablespace &ts_data;

comment on table  c_products           is ‘Products’;
comment on column c_products.code      is ‘Code’;
comment on column c_products.name      is ‘Name’;
comment on column c_products.prefix    is ‘Product prefix’;
comment on column c_products.copyright is ‘Copytight information’;
comment on column c_products.descr     is ‘Description’;

alter table c_products
  add constraint c_products_PK
    primary key (code)
    using index
    tablespace &ts_indx;

alter table c_products
  add constraint c_products_uk_name
    unique (name)
    using index
    tablespace &ts_indx;

В дальнейшем мы будем придерживаться такого стиля написания скриптов.

В самом начале скрипта идет вызова файла \coreapp\server\dba\c_def.sql, в котором определены системные переменные. Заметьте, что вызов выглядит как @dba\c_def, т.е. подразумевается, что для SQL*Plus корневым всегда является каталог \coreapp\server\. 
В случае создания таблицы нам необходимы переменные, в которых хранятся имена табличных пространств для данных и индексов, которые используются при создании таблицы, первичного ключа и уникального индекса. 

Для хранения информации о версиях зарегистрированной подсистемы создадим таблицу c_product_vers со следующими атрибутами:

Атрибут
Описание
Код
Код подсистемы
Версия
Номер версии подсистемы
Дата релиза
Дата выпуска версии 
Дата установки
Дата установки подсистемы
Описание
Описание версии

Скрипт будет иметь следующий вид:

@dba\c_def;

create table c_product_vers
   (code   varchar2(32)                   not null,
    vers   varchar2(64)                   not null,
    date_r date                           not null,
    date_i date           default sysdate not null,
    descr  varchar2(2000)
   )
   tablespace &ts_data;

comment on table  c_product_vers        is ‘Program product versions’;
comment on column c_product_vers.code   is ‘Code’;
comment on column c_product_vers.vers   is ‘Version number’;
comment on column c_product_vers.date_r is ‘Release date’;
comment on column c_product_vers.date_i is ‘Installation date’;
comment on column c_product_vers.descr  is ‘Description’;

alter table c_product_vers
    add constraint c_product_vers_pk
        primary key (code, vers)
        using index
        tablespace &ts_indx;

alter table c_product_vers
    add constraint c_product_vers_fk
        foreign key (code)
        references c_products(code)
        on delete cascade;

В этой таблице есть внешний ключ c_product_vers_fk на таблицу c_products c  on delete cascade, что приведет к автоматическому удалению записей о версиях при удалении записи о подсистеме. 

Хочется отметить, что использование on delete cascade - это очень порочная практика, которая может стать миной замедленного действия при эксплуатации ваших приложений, о чем  я подробно писал в статье Блокировки Oracle при неиндексированных внешних ключах. Однако в данном случае созданные нами таблицы никогда не будут подвергаться модификации в многопользовательской среде, поэтому автор счел возможным использование on delete cascade. 

В процессе использования созданных таблиц нам потребуется некоторый набор функция, который мы реализуем в PL/SQL пакете c_product, файлы которого будут храниться в каталоге \coreapp\server\pckg\ 
Инсталляция каждого пакета будет состоять из двух файлов, имена которых будут совпадать с именем PL/SQL пакета. Первый файл будет содержать спецификацию пакета и имеет расширение *.pkd (package definition), второй файл будет содержать реализацию процедур и функций и имеет расширение *.pki (package implementation)

PL/SQL пакет c_product содержит реализацию трех простых функций:
  • INSTALLED - Проверяет, установлена ли в системе подсистема с заданным кодом
  • GET_VERS - Возвращает актуальную версию подсистемы с заданным кодом
  • GET_NAME - Возвращает наименование подсистемы с заданным кодом. 
Реализация функций пакета тривиальна, поэтому в статье не приводятся. Исходный код пакета находится в текущем архиве проекта в файле coreapp.zip 

Для последовательного создания и, при необходимости, удаления таблиц и пакетов, а также для запуска инсталляции или удаления CoreApp были созданы файлы \tabs\_make.sql, \tabs\_drop.sql, \pckg\_make.sql, \pckg\_drop.sql, setup.sql, clear.sql. Их назначение описано в статье Установка и деинсталляция Oracle CoreApp

Вызов создания таблиц в файле \tabs\_make.sql выглядит следующим образом:

prompt Create table c_products …
@@c_products;

prompt Create table c_product_vers …
@@c_product_vers;

Вызов удаления таблиц в файле \tabs\_drop.sql выглядит следующим образом:

prompt Drop table c_products …
drop table c_products cascade constraint purge;

prompt Drop table c_product_vers …
drop table c_product_vers cascade constraint purge;

Вызов создания пакетов в файле \pckg\_make.sql выглядит следующим образом:

prompt Create package c_product …
@@c_product.pkd;

Вызов удаления пакетов в файле \pckg\_drop.sql выглядит следующим образом:

prompt Drop package c_products …
drop package c_product;

Файл setup.sql на данный момент выглядит следующим образом:

@dba\c_def
connect &owner/&owner_pswd@&tns_name
@dba\stamp

set echo off

spool setup_&tSTAMP..log

@tabs\_make
@pckg\_make

insert into c_products values (’CoreApp’,'Core of system’,'CoreApp’,'Vitaly Khozhainov, www.foxbase.ru’,'CoreApp subsystem objects and libraries’);
insert into c_product_vers values (’CoreApp’,'1.0′,to_date(’12.07.2010′,’dd.mm.yyyy’),sysdate,’First production release’);
commit;

@dba\cmp_all

spool off

В этом файле мы перед началом процесса установки CoreApp создаем лог-файл, вызываем  _make.sql файлы создания таблиц и пакетов CoreApp, регистрируем CoreApp в таблицах регистрации подсистемы, вызываем перекомпиляцию невалидных пакетов схемы данных (если таковые будут).

Если мы хотим удалить CoreApp, то вызываем файл clear.sql:

@dba\stamp
set echo off
spool clear_&tSTAMP..log

delete c_products where code=’CoreApp’;
commit;

@pckg\_drop
@tabs\_drop

spool off

Здесь просто удаляем регистрационную информацию (что немного излишне, так как все таблицы потом удалятся. Но для удаления подсистем, основанных на CoreApp это будет правильно) и удаляем все объекты базы данных, относящиеся к CoreApp. Естественно, создаем лог-файл процесса удаления подсистемы. 

Сегодня в каталог \coreapp\server\ были добавлены три полезных файла:
  • login.sql
  • prmpt.sql
  • sqlplus.cmd

Файл login.sql при запуске SQL*Plus автоматически ищется в каталоге по умолчанию, и, если он найден, то выполняются находящиеся в нем команды в синтаксисе SQL*Plus. В этом файле содержатся некоторые настройки для SQL*Plus, которые вы можете при необходимости изменить. 

Для формирования внешнего вида «подсказки» в SQL*Plus применяется файл prmpt.sql, в котором формируется «подсказка-prompt»  как имя залогиненного пользователя и глобальное имя базы данных. Этот файл вызывается из  login.sql

Для быстрого запуска sqlplusw.exe из каталога по умолчанию  \coreapp\server\ используется файл sqlplus.cmd, в котором записана команда запуска sqlplusw с автоматическим логином под именем владельца схемы coreapp

Процесс инсталляции серверной части CoreApp состоит в запуске SQL*Plus файлом sqlplus.cmd и выполнении команды @setup, после чего смотрим процесс выполнения инсталляции в лог-файле. Удаление CoreApp производится выполнением команды @clear в SQL*Plus. 
Естественно, что перед установкой CoreApp должны быть выполнены необходимые действия по созданию табличных пространств и владельца схемы с данными. 
Удаление надо выполнять с осторожностью, так как удаляются все объекты CoreApp.

Обновленную версию CoreApp вы можете скачать по этой ссылке: coreapp.zip


Оставьте свой комментарий

Вы должны быть авторизированны, чтобы оставить комментарий.