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