使用触发器截断表

时间:2017-04-26 06:02:54

标签: oracle oracle11g

我想创建一个触发器,在插入另一个表之后,它会截断另一个表,之后将第一个表中的数据插入到截断的表中。我已经管理了插入部分,但我不知道如何将truncate命令合并到同一个触发器中。

CREATE OR REPLACE TRIGGER TEST_TRIGGER AFTER INSERT ON TEST

FOR EACH ROW
BEGIN

    INSERT INTO TEST2 
       (col1, col2, col3) 
    VALUES 
       (:NEW.col1, :NEW.col2, :NEW.col3);
END;  

3 个答案:

答案 0 :(得分:1)

您可以在目标模式上创建要截断表格的过程。

像这样的过程:

CREATE OR REPLACE procedure target_schema.pr_truncate_table(p_table_name varchar2) is
begin

     execute immediate 'truncate table ' || p_table_name;


 end;
/

然后你可以在触发器上使用它。

答案 1 :(得分:1)

当然在触发器内使用事务声明并不是一个好主意。但我想你在实际和更重要的使用它。

如果您使用DELETE内部触发而不是TRUNCATE,则会有

  • 大表格时性能下降
  • 最重要的是,除非你使用PRAGMA AUTONOMOUS_TRANSACTION,否则你将不得不进行COMMIT,这是不允许的。

如果您创建了两个过程,一个用于INSERT而另一个用于TRUNCATE,将具有:

  • 由于程序有提交(隐式或外部),需要定义触发器PRAGMA AUTONOMOUS_TRANSACTION(再次需要)

但在将其设为自主之前,请多考虑两次。它是双面剑,在回滚的情况下可能会损害您的业务逻辑,因为您无法回滚DDL语句。

我建议使用 dbms_job 并向其提交程序。

答案 2 :(得分:0)

以下是您可以实现目标的剪切使用

create table table1 (id int, age number,name varchar2(100));
create table table2 (id int, age number,name varchar2(100));

create or replace trigger sandeeptest after insert on table1 for each row
declare
PRAGMA AUTONOMOUS_TRANSACTION;
begin
execute immediate 'truncate table  table2';
insert into table2(id,age,name) values (:new.id,:new.age,:new.name);
commit;
end;

insert into table1 (id,age,name) values (1,21,'A');
commit;    -- after commit data is persisted in both the tables

insert into table1 (id,age,name) values (2,21,'B');
rollback;-- even after rollback data is presisted in table2 because we created an autonomous trigger

select * from table1;
select * from table2;