Страница 1 из 1

Экспорт словаря

Добавлено: 25 апр 2019, 08:51
Ogeeon
Здравствуйте, уважаемые коллеги.
У нас "Галактика" крутится на оракле, мы периодически чистим журнал с загрузкой удалённых записей в первасивоскую базу.
Проблема такого подхода в том, что в словаре отсутствует куча "своих" таблиц, т.к. мы докомпилировали словарь.
Я пытался решить её так: поднял копию базы на тестовом сервере, truncate-нул таблицы скриптом, который сформировал вот так:

Код: Выделить всё

SELECT 'TRUNCATE TABLE GAL.' || XF$NAME||';' from GAL.X$FILES WHERE XF$CODE >200 OR XF$CODE=48 OR XF$CODE=63
union all
SELECT 'TRUNCATE TABLE GAL.x$journal;' from dual
union all
SELECT 'TRUNCATE TABLE GAL.SYS#MEMO;' from dual
union all
SELECT 'TRUNCATE TABLE GAL.' || table_name || ';' from dba_tables where owner='GAL' and table_name like 'J$%'
union all
SELECT 'TRUNCATE TABLE GAL.' || table_name || ';' from dba_tables where owner='GAL' and table_name like 'TMP#%'
union all
SELECT 'commit;' from dual;
потом утилитой exp_dbi вот с такими параметрами

Код: Выделить всё

[Export]
OutFile=d:\dictexp\currdict.dbi
Title='Current dict'
ExpType=0
Components=*
AllowUserTables=ON
создаю файл, который подсовываю утилите btrvinst.
Но она то падает с рантаймом, то говорит, что не может создать DSN: "Database is not compatible for create DSN. Not encoding in DB."
Может, есть более адекватный способ решить эту задачу? Или я чего-то перемудрил?

Re: Экспорт словаря

Добавлено: 26 апр 2019, 00:38
edward_K
С первасива галактика начиналась. Может быть хватит просто словарные таблы подгрузить из папки dict? с ключами nfs.
Возможно нужно порядок изменить. Про dbi как то был вроде другой способ - через ASQL, но точно не помню. И таблы может не нужно удалять кодами 48 и 63.

Re: Экспорт словаря

Добавлено: 26 апр 2019, 04:19
Ogeeon
Может быть хватит просто словарные таблы подгрузить из папки dict?
У нас сейчас самый свежий словарь - на оракле. Экспортировать я могу, но импорт проходит только в варианте "без замещения". Это не дело.
А Events и Countourevents я чистил, чтобы expdbi их не экспортировала. Всё равно они не нужны для моей цели.

Re: Экспорт словаря

Добавлено: 29 апр 2019, 08:20
Ogeeon
edward_K писал(а): Про dbi как то был вроде другой способ - через ASQL
Где бы посмотреть? Потому что ASQL это вроде как оболочка для выполнения запросов. В .dbf я могу и из Support'a выгрузить по одной таблице.

Re: Экспорт словаря

Добавлено: 30 апр 2019, 16:40
edward_K

Re: Экспорт словаря

Добавлено: 06 май 2019, 05:27
Ogeeon
Спасибо, но я именно так и делаю. Приведя параметры exp_dbi в первом сообщении, я опустил список таблиц. Кроме прочего, данные из не-системных таблиц мне не нужны.

Re: Экспорт словаря

Добавлено: 27 май 2019, 04:23
Ogeeon
Разобрался, как решить свою задачу. Я просто оставлю это здесь ©
1. Выгружаем из рабочей базы описания таблиц:

Код: Выделить всё

select 'INSERT INTO X__FILES(XF$CODE, XF$NAME, XF$OWNERNAME, XF$TITLE, XF$LOC, XF$LOC2, XF$FLAGS, XF$FORMAT, XF$ATTR, XF$PAGESIZE, XF$RECORDFIXED, XF$RECORDSIZE, XF$CHECKSUM, XF$PRIMARYKEYNO, XF$COMPONENT, XF$FLAGS2) VALUES (' || XF$CODE ||', '''|| XF$NAME ||''', '''|| XF$OWNERNAME ||''', '''|| replace(XF$TITLE, '''', '''''') ||''', '''|| XF$LOC ||''', '''|| XF$LOC2 ||''', '|| XF$FLAGS ||', '|| XF$FORMAT ||', '|| XF$ATTR ||', '|| XF$PAGESIZE ||', '|| XF$RECORDFIXED ||', '|| XF$RECORDSIZE ||', '|| XF$CHECKSUM ||', '|| XF$PRIMARYKEYNO ||', '''|| XF$COMPONENT ||''', '|| XF$FLAGS2 ||');' 
from gal.x$files f where XF$CODE>=1000;
select 'INSERT INTO X__FIELDS(XE$CODE, XE$FILECODE, XE$NAME, XE$TITLE, XE$DATATYPE, XE$OFFSET, XE$SIZE, XE$PREC, XE$DEC, XE$ATTR) VALUES (' || XE$CODE ||', '|| XE$FILECODE ||', '''|| XE$NAME ||''', '''|| replace(XE$TITLE, '''', '''''') ||''', '|| XE$DATATYPE ||', '|| XE$OFFSET ||', '|| XE$SIZE ||', '|| XE$PREC ||', '|| XE$DEC ||', '|| XE$ATTR ||');' 
from gal.x$fields f where XE$FILECODE>=1000;
2. Устанавливаем через btrvinst тестовую базу.
3. Внешней утилитой (мне нравится DbVisualizer - даже в бесплатной версии хороший инструмент; но это уж точно дело вкуса) подключаемся к этой тестовой базе и выполяем очистку таблиц

Код: Выделить всё

delete from X__FILES where XF$CODE >= 1000;
delete from X__FIELDS where XE$FILECODE >= 1000;
и загрузку подготовленных описаний.
4. Осталось подменить папку Dict в той базе, куда загружается журнал.

Всё. Собственные таблицы видны, структура галактических актуализирована.