Начиная с этой статьи мы будем добавлять некоторую функциональность в 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.zip
Оставьте свой комментарий
Вы должны быть авторизированны, чтобы оставить комментарий.