2014-04-03 30 views
1

我在這裏設置在Java/Spring中使用liquibase變更集的模式。 直到它與表/密鑰創建工作。但它不適用於自定義SQL。如何使用參數在觸發器中設置模式?

@Bean 
@DependsOn("dataSource") 
public SpringLiquibase liquibase() { 
    SpringLiquibase liquibase = new SpringLiquibase(); 
    liquibase.setDataSource(dataSource); 
    liquibase.setChangeLog("classpath:META-INF/liquibase/application-changes.xml"); 
    liquibase.setContexts("default"); 
    liquibase.setDefaultSchema(databaseProperties.getJdbcSchema()); 
    return liquibase; 
} 

現在我需要在Postgresql中管理大對象,所以我想添加下列變更集。但是我有問題,因爲它沒有使用參數,所以我不得不在SQL文件中添加「my_schema」。有沒有人知道這個解決方法或解決方案?

<changeSet id="xxx-0.0.1-SNAPSHOT-postgres" runInTransaction="true" failOnError="true" 
    onValidationFail="HALT" dbms="postgresql"> 
    <sql > 
     CREATE TRIGGER t_table BEFORE UPDATE OR DELETE ON my_schema.table 
     FOR EACH ROW EXECUTE PROCEDURE my_schema.lo_manage(content); 
    </sql> 
</changeSet> 
+1

也許http://forum.liquibase.org/topic/setting-default-schema-working-for-xml-refactorings-but-not-sql? – pozs

回答

2

由於@pozs指出,這裏有一個解決方案: https://forum.liquibase.org/topic/setting-default-schema-working-for-xml-refactorings-but-not-sql

這樣做這項工作的代碼將

@Bean 
@DependsOn("dataSource") 
public SpringLiquibase liquibase() { 
    SpringLiquibase liquibase = new SpringLiquibase(); 
    liquibase.setDataSource(dataSource); 
    liquibase.setChangeLog("classpath:META-INF/liquibase/application-changes.xml"); 
    liquibase.setContexts("default"); 
    liquibase.setDefaultSchema(databaseProperties.getJdbcSchema()); 
    liquibase.setChangeLogParameters(createChangeLogParameters()); 
    return liquibase; 

}

private Map<String, String> createChangeLogParameters() { 
    Map<String, String> map = new HashMap<String, String>(); 
    map.put("defaultSchema", databaseProperties.getJdbcSchema()); // needed on SQL in <sql> tags. 
    return map; 
} 

而且這裏的Liquibase:

<changeSet id="xxx-0.0.1-SNAPSHOT-postgres" runInTransaction="true" failOnError="true" 
onValidationFail="HALT" dbms="postgresql"> 
<sql > 
    CREATE TRIGGER t_table BEFORE UPDATE OR DELETE ON ${defaultSchema}.table 
    FOR EACH ROW EXECUTE PROCEDURE ${defaultSchema}.lo_manage(content); 
</sql> 

相關問題