Apache Derby - Tetikleyiciler

Veritabanlarında tetikleyiciler, bir olay meydana geldiğinde yürütülen ifadeler / kodlardır. Bir tablodaki belirli bir olay için bir tetikleyici oluşturduğunuzda, tetikleyicide belirtilen kod, olay her gerçekleştiğinde yürütülür. Tek bir tabloda birden çok tetikleyici oluşturabilirsiniz.

Bu bölüm, Apache Derby kullanarak tetikleyicilerin nasıl oluşturulacağını ve bırakılacağını öğretir.

Bir tetikleyici oluşturmak

Derbide CREATE TRIGGER deyimini kullanarak bir tetikleyici oluşturabilirsiniz.

Sözdizimi

CREATE TRIGGER sorgusunun sözdizimi aşağıdadır.

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

Misal

Diyelim ki, aşağıda gösterildiği gibi Derby'de Emp adlı bir tablo oluşturduk.

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

Ve içine 5 satır ekledim.

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');

BackUp adında başka bir tablomuz varsa ve niyetimiz Emp tablosundan silinmiş satırları bunda saklamaktır.

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

Aşağıdaki sorgu, adlı DELETE sorgu tablosunda bir tetikleyici oluşturur Emp. Silinen satırları depolarEmp Yedekleme tablosuna.

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);

Şimdi, Emp tablosundan bir satırı şu şekilde silin -

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

Yedekleme tablosunu doğrularsanız, içindeki silinmiş satırları gözlemleyebilirsiniz.

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

2 rows selected

Bir tetikleyiciyi silme

DROP TRIGGER deyimini kullanarak Derby'de bir tetiği silebilirsiniz.

Sözdizimi

DROP TRIGGER sorgusunun sözdizimi aşağıdadır -

ij> Drop trigger tigger_name;

Misal

Aşağıdaki örnek, yukarıda oluşturulan my_trigger tetikleyicisini siler -

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

JDBC örneği

Aşağıdaki JDBC programı, Derby'de tetikler oluşturur ve siler.

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(" ");
      }
   }
}

Çıktı

Yukarıdaki programı çalıştırırken aşağıdaki çıktı üretilir -

Trigger created
2
Kalyan
40000
Vishakhapatnam
1
Amit
30000
Hyderabad