Apache Derby - Auslöser

In Datenbanken sind Trigger die Anweisungen / der Code, die bei jedem Auftreten eines Ereignisses ausgeführt werden. Sobald Sie einen Trigger für ein bestimmtes Ereignis in einer Tabelle erstellen, wird der im Trigger angegebene Code jedes Mal ausgeführt, wenn das Ereignis auftritt. Sie können mehrere Trigger für eine einzelne Tabelle erstellen.

In diesem Kapitel erfahren Sie, wie Sie mit Apache Derby Trigger erstellen und löschen.

Auslöser erstellen

Sie können einen Trigger in Derby mit der Anweisung CREATE TRIGGER erstellen.

Syntax

Es folgt die Syntax der CREATE TRIGGER-Abfrage.

CREATE TRIGGER trigger_name
{ NO CASCADE BEFORE | AFTER }
{INSERT [OR] | UPDATE [OR] | DELETE}[OF col_name]
ON table_name
[REFERENCING OLD AS o NEW AS n]
[FOR EACH ROW]
Statement

Beispiel

Angenommen, wir haben eine Tabelle mit dem Namen Emp in Derby erstellt, wie unten gezeigt.

CREATE TABLE Emp (
   Id INT NOT NULL,
   Name VARCHAR(255),
   Salary INT NOT NULL,
   Location VARCHAR(255) );

Und 5 Zeilen eingefügt.

INSERT INTO Emp(Id, Name, Salary, Location) VALUES
(1, 'Amit', 30000, 'Hyderabad'), (2, 'Kalyan', 40000, 'Vishakhapatnam'),
(3,'Renuka', 50000, 'Delhi'), (4, 'Archana', 15000, 'Mumbai'), (5, 'Trupthi',
45000, 'Kochin');

Wenn wir eine andere Tabelle mit dem Namen BackUp haben und beabsichtigen, gelöschte Zeilen aus der Emp-Tabelle darin zu speichern.

CREATE TABLE BackUp (
   Id INT NOT NULL,
   Name VARCHAR(255),
   Salary INT NOT NULL,
   Location VARCHAR(255)
);

Die folgende Abfrage erstellt einen Trigger für die Abfragetabelle DELETE mit dem Namen Emp. Es speichert die gelöschten Zeilen vonEmp zur Tabelle Backup.

ij> CREATE TRIGGER my_trigger
AFTER DELETE ON Emp
REFERENCING OLD AS oldRow
FOR EACH ROW MODE DB2SQL
INSERT INTO BackUp
VALUES (oldRow.Id, oldRow.Name, oldRow.Salary, oldRow.Location);

Löschen Sie nun eine Zeile aus der Emp-Tabelle als -

ij> Delete From Emp where Name = 'Kalyan';
1 row inserted/updated/deleted
ij> Delete From Emp where Name = 'Amit';
1 row inserted/updated/deleted

Wenn Sie die BackUp-Tabelle überprüfen, können Sie die darin gelöschten Zeilen beobachten.

ij> select * from BackUp;
ID |NAME |SALARY |LOCATION
-------------------------------------------------------------------------
2 |Kalyan |40000 |Vishakhapatnam
1 |Amit |30000 |Hyderabad

2 rows selected

Auslöser löschen

Sie können einen Trigger in Derby mit der Anweisung DROP TRIGGER löschen.

Syntax

Es folgt die Syntax der DROP TRIGGER-Abfrage -

ij> Drop trigger tigger_name;

Beispiel

Das folgende Beispiel löscht den oben erstellten Trigger my_trigger -

ij> Drop trigger my_trigger;
0 rows inserted/updated/deleted

JDBC-Beispiel

Das folgende JDBC-Programm erstellt und löscht Trigger in Derby.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Triggers_Example {
   public static void main(String args[]) throws SQLException, ClassNotFoundException {
      //Registering the driver
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
      //Getting the Connection object
      String URL = "jdbc:derby:TestDataBase;create=true";
      Connection conn = DriverManager.getConnection(URL);

      //Creating the Statement object
      Statement stmt = conn.createStatement();

      //Creating the Emp table
      stmt.execute("CREATE TABLE Emp ( "
         + "Id INT NOT NULL, "
         + "Name VARCHAR(255), "
         + "Salary INT NOT NULL, "
         + "Location VARCHAR(255))");

      //Insert values in to the EMp table
      String query = "INSERT INTO Emp(Id, Name, Salary, Location) VALUES \r\n"
         +"(1, 'Amit', 30000, 'Hyderabad'), "
         + "(2, 'Kalyan', 40000, 'Vishakhapatnam'), "
         + "(3,'Renuka', 50000, 'Delhi'), "
         + "(4, 'Archana', 15000, 'Mumbai'), "
         + "(5, 'Trupthi', 45000, 'Kochin')";
         stmt.execute(query);

      //Creating the BackUp table
      stmt.execute("CREATE TABLE BackUp ( "
         + "Id INT NOT NULL, "
         + "Name VARCHAR(255), "
         + "Salary INT NOT NULL, "
         + "Location VARCHAR(255))");

      //Creating a trigger
      String createTrigger = "CREATE TRIGGER my_trigger "
         + "AFTER DELETE ON Emp "
         + "REFERENCING OLD AS oldRow "
         + "FOR EACH ROW MODE DB2SQL "
         + "INSERT INTO BackUp "
         + "VALUES (oldRow.Id, oldRow.Name, oldRow.Salary, oldRow.Location)";
      stmt.execute(createTrigger);
      System.out.println("Trigger created");

      //Deleting records from Emp table
      stmt.executeUpdate("Delete From Emp where Name = 'Kalyan'");
      stmt.executeUpdate("Delete From Emp where Name = 'Amit'");
      //Getting the contents of BackUp table
      ResultSet rs = stmt.executeQuery("SELECT * from BackUp");
      while(rs.next()){
         System.out.println(rs.getInt("Id"));
         System.out.println(rs.getString("Name"));
         System.out.println(rs.getString("Salary"));
         System.out.println(rs.getString("Location"));
         System.out.println(" ");
      }
   }
}

Ausgabe

Bei Ausführung des obigen Programms wird die folgende Ausgabe generiert:

Trigger created
2
Kalyan
40000
Vishakhapatnam
1
Amit
30000
Hyderabad