Резервное копирование в oracle db с помощью триггеров

У меня есть 2 одинаковые таблицы, просто измените имя table1 и table2, когда 3 записи вводятся в table1, информация из этой таблицы должна быть скопирована в таблицу 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;
/

Похоже, вы забыли задать свой вопрос.

PM 77-1 25.07.2018 23:50

код не работает, логика внутри триггера не работает. Я пытаюсь использовать% rowcount для подсчета 3 записей, но не могу заставить его работать.

Carlos RdeV 25.07.2018 23:53

Вы не сделали выборку из курсора, поэтому его количество строк будет равно нулю. Но он все равно не будет делать то, что вы хотите, и если вы запросите таблицу, с которой работает триггер, вы получите ошибку мутирующей таблицы. Вы также подсчитываете только существующие строки, а не тот, который запускает триигр; и вы копируете только этот (а не все) в другую таблицу. Это кажется действительно странным, и вы не должны делать этого в триггере - хотя, возможно, вы могли бы попробовать с триггером после утверждения.

Alex Poole 26.07.2018 00:07

Если каким образом это резервная копия? Записи в TABLA2 не являются резервной копией TABLA1, потому что вы продолжаете удалять эти записи из TABLA1. Единый набор записей не является резервной копией.

APC 26.07.2018 07:06
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
307
1

Ответы 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;

Это должно сделать это.

Другие вопросы по теме