2016-10-19 17 views
0

ユニットテストを実行するためのOracleデータベーススキーマのHSQLバージョンがあります。HSQLトリガは、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

あなたは、次のエラーメッセージが表示されます。SQLクライアントのCREATE TRIGGERを実行すると:あなたはAFTERトリガーで列を変更しようとしているため

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

これがあります。列の値を変更することは、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;
関連する問題