Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.misc -> Re: Delete Trigger, undo delete the deleted record

Re: Delete Trigger, undo delete the deleted record

From: GA <grahamallan60_at_hotmail.com>
Date: Thu, 6 Mar 2003 20:35:03 -0000
Message-ID: <3e67b11b$0$230$cc9e4d1f@news.dial.pipex.com>


Veit

There are several ways of doing this, one option is to use an 'INSTEAD OF DELETE' trigger. This trigger will then fire on a delete to update some of the fields to null. INSTEAD OF DELETE triggers cannot be created on a table so you will need to use a view to access the data. For example:

SQL>
SQL> DROP TABLE emps;

Table dropped.

SQL>
SQL> DROP VIEW employees;

View dropped.

SQL>
SQL> CREATE TABLE emps AS SELECT e.*,'A' AS STATUS FROM scott.emp e;

Table created.

SQL>
SQL> CREATE VIEW employees AS SELECT * FROM emps WHERE status = 'A';

View created.

SQL>
SQL> CREATE OR REPLACE TRIGGER iod_employees   2 INSTEAD OF DELETE ON employees
  3 FOR EACH ROW
  4 BEGIN
  5 UPDATE emps

  6       SET ENAME = NULL
  7           ,JOB = NULL
  8           ,MGR = NULL
  9           ,HIREDATE = NULL
 10           ,SAL = NULL
 11           ,COMM = NULL
 12           ,DEPTNO = NULL
 13           ,status = 'E'
 14      WHERE empno = :old.empno;

 15 END iod_employees;
 16 .
SQL> / Trigger created.
SQL>
SQL>
SQL>
SQL> SELECT * FROM employees;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM
DEPTNO S
---------- ---------- --------- ---------- --------- ---------- ---------- - --------- -

      7369 SMITH CLERK 7902 17-DEC-80 800 20 A

      7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 A

      7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30 A

      7566 JONES MANAGER 7839 02-APR-81 2975 20 A

      7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30 A

      7698 BLAKE MANAGER 7839 01-MAY-81 2850 30 A

      7782 CLARK MANAGER 7839 09-JUN-81 2450 10 A

      7788 SCOTT ANALYST 7566 09-DEC-82 3000 20 A

      7839 KING PRESIDENT 17-NOV-81 5000 10 A

      7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30 A

      7876 ADAMS CLERK 7788 12-JAN-83 1100 20 A

      7900 JAMES CLERK 7698 03-DEC-81 950 30 A

      7902 FORD ANALYST 7566 03-DEC-81 3000 20 A

      7934 MILLER CLERK 7782 23-JAN-82 1300 10 A

14 rows selected.

SQL>
SQL> DELETE FROM employees WHERE empno = 7839;

1 row deleted.

SQL>
SQL> SELECT * FROM employees;

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO S
---------- ---------- --------- ---------- --------- ---------- ---------- - --------- -

      7369 SMITH CLERK 7902 17-DEC-80 800 20 A

      7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 A

      7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30 A

      7566 JONES MANAGER 7839 02-APR-81 2975 20 A

      7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30 A

      7698 BLAKE MANAGER 7839 01-MAY-81 2850 30 A

      7782 CLARK MANAGER 7839 09-JUN-81 2450 10 A

      7788 SCOTT ANALYST 7566 09-DEC-82 3000 20 A

      7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30 A

      7876 ADAMS CLERK 7788 12-JAN-83 1100 20 A

      7900 JAMES CLERK 7698 03-DEC-81 950 30 A

      7902 FORD ANALYST 7566 03-DEC-81 3000 20 A

      7934 MILLER CLERK 7782 23-JAN-82 1300 10 A

13 rows selected.

SQL>
SQL> SELECT * FROM emps;

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO S
---------- ---------- --------- ---------- --------- ---------- ---------- - --------- -

      7369 SMITH CLERK 7902 17-DEC-80 800 20 A

      7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 A

      7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30 A

      7566 JONES MANAGER 7839 02-APR-81 2975 20 A

      7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30 A

      7698 BLAKE MANAGER 7839 01-MAY-81 2850 30 A

      7782 CLARK MANAGER 7839 09-JUN-81 2450 10 A

      7788 SCOTT ANALYST 7566 09-DEC-82 3000 20 A

      7839
E

      7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30 A

      7876 ADAMS CLERK 7788 12-JAN-83 1100 20 A

      7900 JAMES CLERK 7698 03-DEC-81 950 30 A

      7902 FORD ANALYST 7566 03-DEC-81 3000 20 A

      7934 MILLER CLERK 7782 23-JAN-82 1300 10 A

14 rows selected.

SQL>
SQL> COMMIT; Commit complete.

SQL> spool off

(This example looks better in monspace font)

In this example the trigger intercepts the delete command and updates the fields on the base table to NULL. I have also added a flag field to stop the deleted record appearing in the view, this could be omitted or not shown in the view.

The trigger could also performs an insert of the deleted data into a audit or backup table

I hope that this gives you some ideas

PS any one want the original file for this script send me an email.

Regards

Graham Allan

"Veit Schopper" <decoder01_at_gmx.at> wrote in message news:b47ia9$1spj66$1_at_ID-78777.news.dfncis.de...
> hello NG
> an application deletes an record of a table.
> i need a trigger (delete) on this table, which not delete this record, but
> change the data from this record (Set some fields to NULL)
>
> thaaanx
> best regards veit
>
>
Received on Thu Mar 06 2003 - 14:35:03 CST

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US