2016-10-19 2 views
0

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; 

Antwort

2

Wenn Sie den CREATE TRIGGER in einem SQL-Client ausgeführt werden Sie die folgende Fehlermeldung angezeigt:

attempt to assign to non-updatable column: LAST_UPDATE [SQL State=0U000, DB Errorcode=-2500]

Dies ist, weil Sie eine Spalte in einem AFTER Trigger zu ändern versuchen. Das Ändern von Spaltenwerten ist nur in einem BEFORE Trigger möglich. So sollten Sie verwenden:

CREATE TRIGGER updTimestamp BEFORE UPDATE OF DATA ON TEST 
REFERENCING NEW AS newrow OLD AS oldrow 
FOR EACH ROW 
    SET newrow.LAST_UPDATE = current_timestamp;
Verwandte Themen