Для архивирования таблиц пользователей предварительно необходимо подготовить список таких таблиц. Например, можно создать таблицу, в которую поместить список таблиц, подлежащих архивированию:
create table BACKTABL(NAME char(32));
insert into BACKTABL values('BACKTABL'); insert into BACKTABL values('TAB1'); insert into BACKTABL values('TAB2'); insert into BACKTABL values('TAB3');
Для каждой из таблиц, резервную копию которой надо получить, вызвать функцию htBackupTable. Копия представляет собой неиндексированную постоянную часть и описатель таблицы, помещенные в другой каталог файловой системы (каталог резервной копии). В копию попадают как данные постоянной части, так и дифференциального файла. Таблица также, при необходимости, может быть переименована. Формат вызова функции htBackupTable:
nRetCode = htBackupTable(sTable, sBackup);
Аргументы:
Аргумент
Тип
Значение
sTable
character
Имя таблицы, резервную копию которой хотим получить
sBackup
character
Имя резервной копии таблицы.
Результат:
Тип
Значение
integer
Код ошибки или 0, если операция завершилась успешно.
Как правило, помимо самой копии интересует также результат выполнения функции архивирования. Для протоколирования операций архивирования можно создать таблицу протокола, в которую и заносить коды завершения операций архивирования. Например:
insert into BACKLOG (DTLOG, TMLOG, TBLOG, ERLOG) select today(), gettick(), NAME, htBackupTable(NAME, @path+NAME) from BACKTABL;
В данном примере помимо архивирования таблиц, имена которых содержатся в таблице BACKTABL в каталог @path выполняется также запись результата архивирования в таблицу BACKLOG.
Более сложные действия необходимо проделать, чтобы получить согласованную копию таблиц. Для этого необходимо объявить транзакцию по всем таблицам, согласованную копию которых собираемся получить. И только после этого выполнить функцию htBackupTable для каждой таблицы.
Например:
begin work TRN1 table BACKTABL, TAB1, TAB2, TAB3;
insert into BACKLOG (DTLOG, TMLOG, TBLOG, ERLOG)
select today(), gettick(), NAME, htBackupTable(NAME, @path+NAME) from BACKTABL;
if(lastsqlerr() != 0 or lasthterr() != 0) { rollback work TRN1; quit; }