使用触发器在 oracle db 中备份

Posted

技术标签:

【中文标题】使用触发器在 oracle db 中备份【英文标题】:Backup in oracle db using triggers 【发布时间】:2018-07-25 21:49:00 【问题描述】:

我有2个相同的表,只是把table1和table2的名字改了,当table1输入3条记录时,这个表的信息必须复制到表2,表1必须再次为空。

CREATE TABLE TABLA1(
ID_1 NUMBER PRIMARY KEY, NOMBRE VARCHAR2(40));

CREATE TABLE TABLA2(
ID_1 NUMBER PRIMARY KEY, NOMBRE VARCHAR2(40));

SELECT * FROM TABLA1;
SELECT * FROM TABLA2;


SET SERVEROUTPUT ON;
CREATE OR REPLACE TRIGGER DISP_BACKUP
BEFORE INSERT ON TABLA1
FOR EACH ROW
DECLARE
CURSOR CUR_CUENTA IS SELECT * FROM TABLA1;
--CURSOR CUR_CUENTA IS SELECT COUNT(*) FROM TABLA1;
var_rows := SQL%ROWCOUNT;
--CURCHOISE SQL%ROWCOUNT;
BEGIN
dbms_output.put_line('NUMERO DE REGISTROS EN TABLA 1' || CUR_CUENTA%ROWCOUNT 
);
--OPEN CUR_CUENTA;
IF CUR_CUENTA%ROWCOUNT > 3 THEN
IF INSERTING THEN
INSERT INTO TABLA2 (ID_1,NOMBRE) VALUES (:NEW.ID_1,:NEW.NOMBRE);
END IF;
DELETE FROM TABLA1;
END IF;
END;
/

【问题讨论】:

你好像忘了问你的问题。 代码不起作用,触发器内部的逻辑不起作用。我尝试使用 %rowcount 来计算 3 条记录,但我无法使其工作。 您还没有从游标中获取,因此它的行数将为零。但无论如何它不会做你想做的事,如果你查询触发器所针对的表,你会得到一个变异表错误。您也只计算现有行,而不是触发 triiger 的行;并且您只是将那个(不是全部)复制到另一张表中。这看起来很奇怪,而不是您应该在触发器中执行的操作 - 尽管您可以尝试使用语句后触发器。 如果这是什么备份方式? TABLA2 中的记录不是TABLA1 的备份,因为您继续从TABLA1 中删除这些记录。单组记录不是备份。 【参考方案1】:

您将需要使用语句触发器而不是行触发器 - 否则您无法访问定义触发器的表。您可能还想使用AFTER INSERT 而不是BEFORE INSERT 触发器:

CREATE OR REPLACE TRIGGER DISP_BACKUP
  AFTER INSERT ON TABLA1
DECLARE
  TYPE typRowIDCollection IS TABLE OF ROWID;

  colROWIDs   typRowIDCollection;
BEGIN
  SELECT ROWID
    BULK COLLECT INTO colROWIDs
    FROM TABLA1;

  dbms_output.put_line('NUMERO DE REGISTROS EN TABLA 1' || colROWIDs.COUNT);

  IF colROWIDs.COUNT >= 3 THEN
    FORALL i IN colROWIDs.FIRST..colROWIDs.LAST
      INSERT INTO TABLA2 (ID_1, NOMBRE)
        SELECT ID_1, NOMBRE
          FROM TABLA1
          WHERE ROWID = colROWIDs(i);

    FORALL i IN colROWIDs.FIRST..colROWIDs.LAST 
      DELETE FROM TABLA1 WHERE ROWID = colROWIDS(i);
  END IF;
END DISP_BACKUP;

应该这样做。

【讨论】:

以上是关于使用触发器在 oracle db 中备份的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 触发器触发器应用场景--数据的备份和同步

Oracle Db 11g 触发器语法

oracle触发器

oracle中的trigger有几种啊

Oracle 中的触发器有几种?

自动备份Oracle 11g数据库