Apache Derby - Kích hoạt

Trong cơ sở dữ liệu, trình kích hoạt là các câu lệnh / mã được thực thi bất cứ khi nào một sự kiện xảy ra. Khi bạn tạo trình kích hoạt cho một sự kiện cụ thể trên bảng, mã được chỉ định trong trình kích hoạt sẽ được thực thi mỗi khi sự kiện xảy ra. Bạn có thể tạo nhiều trình kích hoạt trên một bảng.

Chương này hướng dẫn bạn cách tạo và thả trình kích hoạt bằng Apache Derby.

Tạo trình kích hoạt

Bạn có thể tạo một trình kích hoạt trong Derby bằng cách sử dụng câu lệnh CREATE TRIGGER.

Cú pháp

Sau đây là cú pháp của truy vấn CREATE TRIGGER.

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

Thí dụ

Giả sử, chúng ta đã tạo một bảng có tên Emp trong Derby như hình dưới đây.

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

Và chèn 5 hàng trong đó.

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

Nếu chúng ta có một bảng khác có tên BackUp và mục đích của chúng tôi là lưu trữ các hàng đã xóa khỏi bảng Emp trong này.

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

Truy vấn sau tạo một trình kích hoạt trên bảng truy vấn DELETE có tên Emp. Nó lưu trữ các hàng đã xóa củaEmp vào bảng Sao lưu.

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

Bây giờ, xóa một hàng khỏi bảng Emp dưới dạng -

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

Nếu bạn xác minh bảng BackUp, bạn có thể quan sát các hàng đã xóa trong đó.

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

2 rows selected

Xóa trình kích hoạt

Bạn có thể xóa một trình kích hoạt trong Derby bằng cách sử dụng câu lệnh DROP TRIGGER.

Cú pháp

Sau đây là cú pháp của truy vấn DROP TRIGGER -

ij> Drop trigger tigger_name;

Thí dụ

Ví dụ sau đây xóa trình kích hoạt my_trigger được tạo ở trên -

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

Ví dụ về JDBC

Sau chương trình JDBC tạo và xóa các trình kích hoạt trong 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(" ");
      }
   }
}

Đầu ra

Khi thực hiện chương trình trên, kết quả sau được tạo:

Trigger created
2
Kalyan
40000
Vishakhapatnam
1
Amit
30000
Hyderabad