В базах данных триггеры — это операторы / код, которые выполняются всякий раз, когда происходит событие. После создания триггера для определенного события в таблице код, указанный в триггере, выполняется каждый раз, когда происходит событие. Вы можете создать несколько триггеров на одной таблице.
В этой главе рассказывается, как создавать и удалять триггеры с помощью Apache Derby.
Создание триггера
Вы можете создать триггер в Derby с помощью оператора CREATE TRIGGER.
Синтаксис
Ниже приводится синтаксис запроса 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
пример
Предположим, мы создали таблицу с именем Emp в Derby, как показано ниже.
CREATE TABLE Emp ( Id INT NOT NULL, Name VARCHAR(255), Salary INT NOT NULL, Location VARCHAR(255) );
И вставил в него 5 рядов.
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, и мы намереваемся сохранить в ней удаленные строки из таблицы Emp.
CREATE TABLE BackUp ( Id INT NOT NULL, Name VARCHAR(255), Salary INT NOT NULL, Location VARCHAR(255) );
Следующий запрос создает триггер в таблице запросов DELETE с именем Emp . Он сохраняет удаленные строки Emp в таблицу 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);
Теперь удалите строку из таблицы Emp как —
ij> Delete From Emp where Name = 'Kalyan'; 1 row inserted/updated/deleted ij> Delete From Emp where Name = 'Amit'; 1 row inserted/updated/deleted
Если вы проверяете таблицу BackUp, вы можете наблюдать удаленные строки в ней.
ij> select * from BackUp; ID |NAME |SALARY |LOCATION ------------------------------------------------------------------------- 2 |Kalyan |40000 |Vishakhapatnam 1 |Amit |30000 |Hyderabad 2 rows selected
Удаление триггера
Вы можете удалить триггер в Derby с помощью оператора DROP TRIGGER.
Синтаксис
Ниже приводится синтаксис запроса DROP TRIGGER —
ij> Drop trigger tigger_name;
пример
В следующем примере удаляется созданный выше триггер my_trigger —
ij> Drop trigger my_trigger; 0 rows inserted/updated/deleted
Пример JDBC
Следующая программа JDBC создает и удаляет триггеры в 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(" "); } } }
Выход
При выполнении вышеупомянутой программы генерируется следующий вывод: