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