我想创建一个触发器,在插入另一个表之后,它会截断另一个表,之后将第一个表中的数据插入到截断的表中。我已经管理了插入部分,但我不知道如何将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;
答案 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,则会有
如果您创建了两个过程,一个用于INSERT而另一个用于TRUNCATE,将具有:
但在将其设为自主之前,请多考虑两次。它是双面剑,在回滚的情况下可能会损害您的业务逻辑,因为您无法回滚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;