2016-10-19 1 views
0

У меня есть версия схемы базы данных Oracle для HSQL для выполнения модульных тестов.HSQL Trigger генерирует SQL-ошибку: -458, SQLState: S1000/java.lang.ArrayIndexOutOfBoundsException

Мне нужно обновить колонку при обновлении текущей меткой времени.

Триггер, который я внедрил, загружается без жалобы движком hsql, но он падает во время выполнения, когда я пытаюсь обновить строки.

Вот тестовый пример образец, который вы можете запустить в проекте сконфигурированный с пружиной и JUnit:

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); 
    }    
} 

Что с этим триггером? Почему это сгенерировало ArrayIndexOutOfBoundException?

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; 

ответ

2

При запуске CREATE TRIGGER в клиенте SQL, вы увидите следующее сообщение об ошибке:

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

Это потому, что вы пытаетесь изменить столбец в AFTER триггера. Изменение значений столбцов возможно только в триггере BEFORE. Поэтому вы должны использовать:

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;