powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / экспорт таблицы в триггере
4 сообщений из 4, страница 1 из 1
экспорт таблицы в триггере
    #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
экспорт таблицы в триггере
    #37924877
mustaccio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать обернуть вызов ADMIN_CMD в отдельную процедуру, объявленную с опцией AUTONOMOUS, и вызывать из триггера эту процедуру. Однако правильнее было бы рассинхронизировать событие и его обработку: к примеру, триггер вставляет запись в таблицу событий, а отдельная процедура, вызываемая планировщиком (Administrative Task Scheduler), периодически читает таблицу событий и обрабатывает новое событие.
...
Рейтинг: 0 / 0
экспорт таблицы в триггере
    #37924914
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rust()Неужели в триггере не возможно выполнить экспорт данных? Может существуют другие варианты решения задачи?
Export делает commit, поэтому его нельзя в триггере использовать.
Если версия DB2 >= 9.7, то можно использовать модули UTL_FILE и DBMS_SQL .
Если нет - можно на внешнем языке написать свой export.
...
Рейтинг: 0 / 0
экспорт таблицы в триггере
    #37925560
Rust()
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

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


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