Apache Derby - Gatillos
En las bases de datos, los disparadores son declaraciones / código que se ejecuta cada vez que ocurre un evento. Una vez que crea un disparador para un evento en particular en una tabla, el código especificado en el disparador se ejecuta cada vez que ocurre el evento. Puede crear varios activadores en una sola tabla.
Este capítulo le enseña cómo crear y eliminar activadores con Apache Derby.
Creando un disparador
Puede crear un disparador en Derby utilizando la instrucción CREATE TRIGGER.
Sintaxis
A continuación se muestra la sintaxis de la consulta 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
Ejemplo
Supongamos que hemos creado una tabla llamada Emp en Derby como se muestra a continuación.
CREATE TABLE Emp (
Id INT NOT NULL,
Name VARCHAR(255),
Salary INT NOT NULL,
Location VARCHAR(255) );
E insertó 5 filas en él.
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');
Si tenemos otra tabla llamada BackUp y nuestra intención es almacenar filas eliminadas de la tabla Emp en esta.
CREATE TABLE BackUp (
Id INT NOT NULL,
Name VARCHAR(255),
Salary INT NOT NULL,
Location VARCHAR(255)
);
La siguiente consulta crea un disparador en la tabla de consulta DELETE llamado Emp. Almacena las filas eliminadas deEmp a la mesa 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);
Ahora, elimine una fila de la tabla Emp como -
ij> Delete From Emp where Name = 'Kalyan';
1 row inserted/updated/deleted
ij> Delete From Emp where Name = 'Amit';
1 row inserted/updated/deleted
Si verifica la tabla BackUp, puede observar las filas eliminadas en ella.
ij> select * from BackUp;
ID |NAME |SALARY |LOCATION
-------------------------------------------------------------------------
2 |Kalyan |40000 |Vishakhapatnam
1 |Amit |30000 |Hyderabad
2 rows selected
Eliminar un disparador
Puede eliminar un disparador en Derby utilizando la instrucción DROP TRIGGER.
Sintaxis
A continuación se muestra la sintaxis de la consulta DROP TRIGGER:
ij> Drop trigger tigger_name;
Ejemplo
El siguiente ejemplo elimina el activador my_trigger creado anteriormente:
ij> Drop trigger my_trigger;
0 rows inserted/updated/deleted
Ejemplo de JDBC
El siguiente programa JDBC crea y elimina disparadores en 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(" ");
}
}
}
Salida
Al ejecutar el programa anterior, se genera la siguiente salida:
Trigger created
2
Kalyan
40000
Vishakhapatnam
1
Amit
30000
Hyderabad