我現在很長一段時間都在使用flyway。非常好/完整的工具!如何使用Flyway 2.0.1處理Oracle同義詞?
實際上,我面臨着一個意想不到的情況......我有兩個模式:
- 所有者pocessing表和序列
- 使用同義詞訪問所有者的用戶對象
該定製不希望我向所有者授予「授予創建任何同義詞/刪除任何同義詞」權限。 但我可以向用戶提供「授予創建同義詞」。
所以我需要
- 創建表/序列(與業主連接)
- 格蘭特選擇,刪除...到我的用戶模式(與業主連接)
- 創建用戶訪問所有者對象的同義詞(與用戶連接)
第3點是我的問題。
如果我給了「授予任何同義詞」的所有者和使用飛路佔位符,我可以做這樣的事情:
CREATE OR REPLACE SYNONYM ${user}.WORKITEMINFO FOR WORKITEMINFO;
,但我不能;)
所以我實施的解決方案是使用連接到User模式的另一個DataSource的Java遷移。 (我MigrationUtils.replacePlaceholders可以讓我訪問任何flyway.properties屬性佔位符)
private final static String[] queries =
{"CREATE OR REPLACE SYNONYM TASK_COMMENT FOR ${flyway.user}.TASK_COMMENT"}
@Override
public void migrate(final Connection connection) throws Exception {
final DataSource dataSource = MigrationUtils.getUserDataSource();
final Connection connectionForMigrations = dataSource.getConnection();
final JdbcTemplate jdbcTemplate = new JdbcTemplate(connectionForMigrations);
new TransactionTemplate(connectionForMigrations).execute(new TransactionCallback<Void>() {
@Override
public Void doInTransaction() {
try {
for (final String query : queries) {
final String replacedQuery = MigrationUtils.replacePlaceholders(query);
LOG.debug("Executing SQL: " + replacedQuery);
jdbcTemplate.executeStatement(replacedQuery);
}
} catch (final SQLException exc) {
throw new FlywayException("Could not drop synonym", exc);
}
return null;
}
});
}
有另一種方式來解決這種情況呢?
謝謝!
爲什麼沒有創建同義詞聲明工作? – 2013-05-12 17:44:43
創建同義詞的作品,但我也需要刪除同義詞。真正的問題是,我的客戶不希望我向所有者提供「授予任何同義詞」。 – 2013-05-13 07:23:52