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