2012-05-16 3 views
2

У меня есть таблица A, которая постоянно обновляется (вставляет операторы) одним приложением. Я хочу создать другую таблицу B, которая состоит всего из нескольких столбцов таблицы A. Для этого я подумал о создании триггера, который запускался после вставки в таблице A, но я не знаю, как написать инструкцию insert внутри триггера. Я не эксперт по базам данных, так что может быть, я пропустил что-то простое. Пожалуйста помоги.Создание триггера резервного копирования в Oracle

Вот мой триггер код:

CREATE OR REPLACE TRIGGER "MSG_INSERT_TRIGGER" 

AFTER 
insert on "ACTIVEMQ_MSGS" 

DECLARE 
PRAGMA AUTONOMOUS_TRANSACTION; 
begin 
execute immediate 'truncate table MSG_BACKUP'; 
insert into MSG_BACKUP select * from ACTIVEMQ_MSGS; 
COMMIT; 
end; 
+1

Почему 'ПРАГМА AUTONOMOUS_TRANSACTION;', или вы скопировали, что с какой-то другой код, не зная, что он делает? Вы действительно хотите обрезать таблицу резервного копирования и вставить все ACTIVEMQ_MSGS после каждой вставки? Является ли ваше фактическое требование вставить одну строку (с подмножеством столбцов) в 'MSG_BACKUP' после того, как в ACTIVEMQ_MSGS произошла вставка? – Phil

+0

Привет, Фил, у тебя все получилось. Я скопировал его здесь и там. Да, я хочу вставить одну строку в MSG_BACKUP после того, как в ACTIVEMQ_MSGS произошла вставка. – user381878

ответ

3

Это не кажется хорошей идея: каждый раз, когда новая запись получает вставляется в таблице А, удалите все из таблицы B и скопировать все записи из таблицы А. Это будет огромная проблема с производительностью, как только в таблице будет много записей.

Не было бы достаточно создать представление на нужных столбцах таблицы A?

Если нет, то есть вы все равно хотите «занести» все вставки в другой стол, а затем вы идете. (Я полагаю, вы хотите скопировать следующие поля: f1, f2, f3)

CREATE OR REPLACE TRIGGER TR_AI_ACTIVEMQ_MSGS 
AFTER INSERT ON ACTIVEMQ_MSGS 
FOR EACH ROW 
BEGIN 
    INSERT INTO MSG_BACKUP (f1, f2, f3) 
    VALUES (:new.f1, :new.f2, :new.f3);    
END TR_AI_ACTIVEMQ_MSGS; 
+0

Спасибо, bpgergo, Это именно то, что я искал. Могу ли я подтвердить, если в этом триггере только новый вставленный запрос в таблицу ACTIVEMQ_MSGS будет скопирован в MSG_BACKUP? – user381878

+0

Я немного запутался из-за этого «ДЛЯ КАЖДОЙ РУКИ». – user381878

+0

'для каждой строки' объясняется здесь http://stackoverflow.com/a/8474790/176569 – bpgergo

1

Внутри Oracle вызвать значения записей доступны в де: новый псевдо запись. Добавленное утверждение может выглядеть следующим образом:

insert into B (column1, column2) 
values (:new.tableA_col1,:new.tableA_col2) 
+0

Спасибо Рене. :) – user381878

Смежные вопросы