Oracle PL/SQL/Trigger/After Delete Trigger

Материал из SQL эксперт
Перейти к: навигация, поиск

Create an after delete trigger

   <source lang="sql">

SQL> -- create demo table SQL> create table Employee(

 2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
 3    First_Name         VARCHAR2(10 BYTE),
 4    Last_Name          VARCHAR2(10 BYTE),
 5    Start_Date         DATE,
 6    End_Date           DATE,
 7    Salary             Number(8,2),
 8    City               VARCHAR2(10 BYTE),
 9    Description        VARCHAR2(15 BYTE)
10  )
11  /

Table created. SQL> SQL> create table employee_audit (

 2     id VARCHAR2(4 BYTE),
 3     salary Number(8,2),
 4     delete_date Date,
 5     deleted_by VARCHAR2(15 BYTE)
 6     )
 7  /

Table created. SQL> SQL> SQL> -- prepare data SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2               values ("01","Jason",    "Martin",  to_date("19960725","YYYYMMDD"), to_date("20060725","YYYYMMDD"), 1234.56, "Toronto",  "Programmer")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("02","Alison",   "Mathews", to_date("19760321","YYYYMMDD"), to_date("19860221","YYYYMMDD"), 6661.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("03","James",    "Smith",   to_date("19781212","YYYYMMDD"), to_date("19900315","YYYYMMDD"), 6544.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("04","Celia",    "Rice",    to_date("19821024","YYYYMMDD"), to_date("19990421","YYYYMMDD"), 2344.78, "Vancouver","Manager")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("05","Robert",   "Black",   to_date("19840115","YYYYMMDD"), to_date("19980808","YYYYMMDD"), 2334.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("06","Linda",    "Green",   to_date("19870730","YYYYMMDD"), to_date("19960104","YYYYMMDD"), 4322.78,"New York",  "Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("07","David",    "Larry",   to_date("19901231","YYYYMMDD"), to_date("19980212","YYYYMMDD"), 7897.78,"New York",  "Manager")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("08","James",    "Cat",     to_date("19960917","YYYYMMDD"), to_date("20020415","YYYYMMDD"), 1232.78,"Vancouver", "Tester")
 3  /

1 row created. SQL> SQL> SQL> SQL> -- display data in the table SQL> select * from Employee

 2  /

ID FIRST_NAME LAST_NAME START_DAT END_DATE SALARY CITY DESCRIPTION


---------- ---------- --------- --------- ---------- ---------- ---------------

01 Jason Martin 25-JUL-96 25-JUL-06 1234.56 Toronto Programmer 02 Alison Mathews 21-MAR-76 21-FEB-86 6661.78 Vancouver Tester 03 James Smith 12-DEC-78 15-MAR-90 6544.78 Vancouver Tester 04 Celia Rice 24-OCT-82 21-APR-99 2344.78 Vancouver Manager 05 Robert Black 15-JAN-84 08-AUG-98 2334.78 Vancouver Tester 06 Linda Green 30-JUL-87 04-JAN-96 4322.78 New York Tester 07 David Larry 31-DEC-90 12-FEB-98 7897.78 New York Manager 08 James Cat 17-SEP-96 15-APR-02 1232.78 Vancouver Tester 8 rows selected. SQL> SQL> SQL> SQL> SQL> SQL> SQL> CREATE OR REPLACE TRIGGER employee_after_delete

 2      AFTER DELETE
 3          ON employee
 4          FOR EACH ROW
 5
 6      DECLARE
 7          v_username varchar2(10);
 8
 9      BEGIN
10
11          -- Find username of person performing the DELETE on the table
12          SELECT user INTO v_username
13          FROM dual;
14
15          -- Insert record into audit table
16          INSERT INTO employee_audit (id, salary, delete_date, deleted_by)
17                              VALUES ( :old.id, :old.salary, sysdate, v_username );
18
19      END;
20      /

Trigger created. SQL> SQL> delete from employee; 8 rows deleted. SQL> SQL> select * from employee_audit; ID SALARY DELETE_DA DELETED_BY


---------- --------- ---------------

01 1234.56 09-SEP-06 sqle 02 6661.78 09-SEP-06 sqle 03 6544.78 09-SEP-06 sqle 04 2344.78 09-SEP-06 sqle 05 2334.78 09-SEP-06 sqle 06 4322.78 09-SEP-06 sqle 07 7897.78 09-SEP-06 sqle 08 1232.78 09-SEP-06 sqle 8 rows selected. SQL> SQL> drop table employee_audit; Table dropped. SQL> SQL> SQL> SQL> -- clean the table SQL> drop table Employee

 2  /

Table dropped. SQL> SQL>

      </source>
   
  


This is an example of a DML trigger.

   <source lang="sql">

SQL> SQL> CREATE TABLE major_stats (

 2    major          VARCHAR2(30),
 3    total_credits  NUMBER,
 4    total_students NUMBER);

Table created. SQL> SQL> INSERT INTO major_stats (major, total_credits, total_students) VALUES ("Computer Science", 22, 3); 1 row created. SQL> SQL> INSERT INTO major_stats (major, total_credits, total_students) VALUES ("History", 12, 3); 1 row created. SQL> SQL> INSERT INTO major_stats (major, total_credits, total_students) VALUES ("Economics", 15, 2); 1 row created. SQL> SQL> INSERT INTO major_stats (major, total_credits, total_students) VALUES ("Music", 11, 2); 1 row created. SQL> SQL> INSERT INTO major_stats (major, total_credits, total_students) VALUES ("Nutrition", 16, 2); 1 row created. SQL> SQL> SQL> CREATE TABLE students (

 2    id               NUMBER(5) PRIMARY KEY,
 3    first_name       VARCHAR2(20),
 4    last_name        VARCHAR2(20),
 5    major            VARCHAR2(30),
 6    current_credits  NUMBER(3)
 7    );

Table created. SQL> SQL> SQL> CREATE OR REPLACE TRIGGER UpdateMajorStats

 2    AFTER INSERT OR DELETE OR UPDATE ON students
 3  DECLARE
 4    CURSOR c_Statistics IS
 5      SELECT major, COUNT(*) total_students,
 6             SUM(current_credits) total_credits
 7        FROM students
 8        GROUP BY major;
 9  BEGIN
10    DELETE FROM major_stats;
11
12    FOR v_StatsRecord in c_Statistics LOOP
13      INSERT INTO major_stats (major, total_credits, total_students)
14        VALUES (v_StatsRecord.major, v_StatsRecord.total_credits,
15                v_StatsRecord.total_students);
16    END LOOP;
17  END UpdateMajorStats;
18  /

Trigger created. SQL> SQL> INSERT INTO students (id, first_name, last_name, major,current_credits)

 2                VALUES (10001, "Scott", "Lawson","Computer Science", 11);

1 row created. SQL> SQL> INSERT INTO students (id, first_name, last_name, major, current_credits)

 2                VALUES (10002, "Mar", "Wells","History", 4);

1 row created. SQL> SQL> INSERT INTO students (id, first_name, last_name, major,current_credits)

 2                VALUES (10003, "Jone", "Bliss","Computer Science", 8);

1 row created. SQL> SQL> INSERT INTO students (id, first_name, last_name, major,current_credits)

 2                VALUES (10004, "Man", "Kyte","Economics", 8);

1 row created. SQL> SQL> INSERT INTO students (id, first_name, last_name, major,current_credits)

 2                VALUES (10005, "Pat", "Poll","History", 4);

1 row created. SQL> SQL> INSERT INTO students (id, first_name, last_name, major,current_credits)

 2                VALUES (10006, "Tim", "Viper","History", 4);

1 row created. SQL> SQL> INSERT INTO students (id, first_name, last_name, major,current_credits)

 2                VALUES (10007, "Barbara", "Blues","Economics", 7);

1 row created. SQL> SQL> INSERT INTO students (id, first_name, last_name, major,current_credits)

 2                VALUES (10008, "David", "Large","Music", 4);

1 row created. SQL> SQL> INSERT INTO students (id, first_name, last_name, major,current_credits)

 2                VALUES (10009, "Chris", "Elegant","Nutrition", 8);

1 row created. SQL> SQL> INSERT INTO students (id, first_name, last_name, major,current_credits)

 2                VALUES (10010, "Rose", "Bond","Music", 7);

1 row created. SQL> SQL> INSERT INTO STUDENTS (id, first_name, last_name, major,current_credits)

 2                VALUES (10011, "Rita", "Johnson","Nutrition", 8);

1 row created. SQL> SQL> INSERT INTO students (id, first_name, last_name, major,current_credits)

 2                VALUES (10012, "Sharon", "Clear","Computer Science", 3);

1 row created. SQL> SQL> select * from major_stats; MAJOR TOTAL_CREDITS TOTAL_STUDENTS


------------- --------------

Computer Science 22 3 Economics 15 2 Nutrition 16 2 History 12 3 Music 11 2 SQL> SQL> drop table students; Table dropped. SQL> drop table major_stats; Table dropped.

</source>