Ich habe eine HSQL-Version eines Oracle-Datenbank-Schemas, um Komponententests durchzuführen.HSQL-Trigger generiert SQL-Fehler: -458, SQLState: S1000/java.lang.ArrayIndexOutOfBoundsException
Ich muss eine Spalte aktualisieren mit aktuellen Zeitstempel aktualisieren.
Der Trigger, den ich implementiert habe, wird von der hsql-Engine ohne Beanstandung geladen, stürzt aber zur Laufzeit ab, wenn ich versuche, Zeilen zu aktualisieren.
Hier ist ein Beispiel Testfall, die Sie in einem Projekt mit Feder und junit konfigurierte laufen können:
public class UtSqlTriggerTest {
@Test public void testTrigger() throws SQLException {
ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
resourceDatabasePopulator.addScript(new InMemoryResource(
"CREATE TABLE TEST (ID NUMERIC NOT NULL PRIMARY KEY,DATA VARCHAR(200), LAST_UPDATE TIMESTAMP);\n" +
"CREATE TRIGGER updTimestamp AFTER UPDATE OF DATA ON TEST\n" +
"REFERENCING NEW AS newrow OLD AS oldrow\n" +
"FOR EACH ROW\n" +
"SET newrow.LAST_UPDATE = current_timestamp;"));
Connection connection = DriverManager.getConnection("jdbc:hsqldb:file:/opt/db/testdb;shutdown=true", "SA", "");
resourceDatabasePopulator.populate(connection);
JdbcTemplate tjdbc = new JdbcTemplate(new SingleConnectionDataSource(connection, true));
tjdbc.update("INSERT INTO TEST(ID, DATA) VALUES (0, 'HELLO')");
tjdbc.update("UPDATE TEST SET DATA = 'HELLO WORLD' WHERE ID = 0");
tjdbc.queryForObject("SELECT LAST_UPDATE FROM TEST WHERE ID = 0", Date.class);
}
}
Was mit diesem Trigger falsch? Warum wurde ArrayIndexOutOfBoundException generiert?
CREATE TRIGGER updateDateAjoutFichier AFTER UPDATE OF DATA ON TEST
REFERENCING NEW AS newrow OLD AS oldrow
FOR EACH ROW
SET newrow.LAST_UPDATE = current_timestamp;