Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / экспорт таблицы в триггере / 4 сообщений из 4, страница 1 из 1
21.08.2012, 15:23
    #37924759
Rust()
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
экспорт таблицы в триггере
Есть такая задача: периодически экспортировать таблицу (журнал аудита) в архивные файлы (с возможностью обратного импорта) по достижению максимального числа записей в таблице.
Решение предполагаю такое:
на таблицу стоит триггер после вставки записи, в котором проверяется превышение максимального числа записей. Если число превышено - выполняется команда экспорта в файл половины таблицы и экспортированная часть удаляется.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
CREATE TABLE "EVENTS"  (
		  "ID_EVENT" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (  
		    START WITH +1  
		    INCREMENT BY +1  
		    MINVALUE +1  
		    MAXVALUE +9223372036854775807  
		    NO CYCLE  
		    CACHE 20  
		    NO ORDER ) , 
		  "DATE_EVENT" TIMESTAMP NOT NULL WITH DEFAULT CURRENT TIMESTAMP , 
		  "IP_ADDRESS" VARCHAR(30) NOT NULL , 
		  "ID_USER" BIGINT NOT NULL , 
		  "ID_TYPE_EVENT" INTEGER NOT NULL , 
		  "ECP_EVENT" BLOB(5000) LOGGED COMPACT , 
		  "DESCRIPTION" VARCHAR(512) , 
		  "RESULT" SMALLINT NOT NULL WITH DEFAULT 0 , 
		  "IS_PERS_DATA" CHAR(1) NOT NULL WITH DEFAULT 'F' )   
		 IN "USERSPACE1" @ 




CREATE TRIGGER INSERT_EVENT AFTER INSERT ON EVENTS REFERENCING NEW AS new_row FOR EACH ROW MODE DB2SQL BEGIN ATOMIC
declare maxcount bigint default 1000;
declare count bigint default 0;
declare bkpath varchar(256) default 'c:\bkup';

set count = (select count(*) from EVENTS);

if ( count > maxcount) then
	call ADMIN_CMD('EXPORT TO "'|| bkpath  ||'" OF DEL SELECT * FROM EVENTS order by id_event fetch first '|| maxcount/2 ||'  ROWS ONLY');
		
    -- удаление экспортированных данных
end if;
end@



При добавлении записи ругается на триггер:
Код: sql
1.
2.
3.
Ошибка в триггерном операторе SQL в триггерной процедуре 
"INSERT_EVENT".  Код ошибки SQLCODE "-3015", состояние 
SQLSTATE "     ", элементы сообщения "-751".  SQLSTATE=09000



Неужели в триггере не возможно выполнить экспорт данных? Может существуют другие варианты решения задачи?
...
Рейтинг: 0 / 0
21.08.2012, 15:59
    #37924877
mustaccio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
экспорт таблицы в триггере
Можно попробовать обернуть вызов ADMIN_CMD в отдельную процедуру, объявленную с опцией AUTONOMOUS, и вызывать из триггера эту процедуру. Однако правильнее было бы рассинхронизировать событие и его обработку: к примеру, триггер вставляет запись в таблицу событий, а отдельная процедура, вызываемая планировщиком (Administrative Task Scheduler), периодически читает таблицу событий и обрабатывает новое событие.
...
Рейтинг: 0 / 0
21.08.2012, 16:08
    #37924914
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
экспорт таблицы в триггере
Rust()Неужели в триггере не возможно выполнить экспорт данных? Может существуют другие варианты решения задачи?
Export делает commit, поэтому его нельзя в триггере использовать.
Если версия DB2 >= 9.7, то можно использовать модули UTL_FILE и DBMS_SQL .
Если нет - можно на внешнем языке написать свой export.
...
Рейтинг: 0 / 0
22.08.2012, 08:27
    #37925560
Rust()
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
экспорт таблицы в триггере
Mark Barinstein,

Спасибо, будем смотреть.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / экспорт таблицы в триггере / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]