FoxBase!
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

www.foxbase.ru



Смотрите также:



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

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