我现在使用flyway很长时间了。非常好/完整的工具!
我实际上面临着一个意想不到的情况......我有两个模式:
- 处理表格和序列的所有者
- 使用同义词访问所有者对象的用户
习俗不希望我授予所有者“授予创建任何同义词/删除任何同义词”的权利。但我可以向用户提供“授予创建同义词”。
所以我需要
- 创建表/序列(与所有者连接)
- 将 Select、Delete... 授予我的用户架构(与所有者连接)
- 为用户创建同义词以访问所有者对象(与用户连接)
第3点是我的问题。
如果我向所有者提供“授予任何同义词”并使用 flyway 占位符,我可以执行以下操作:
CREATE OR REPLACE SYNONYM ${user}.WORKITEMINFO FOR WORKITEMINFO;
但是我不能 ;)
所以我实现的解决方案是使用连接到用户模式的另一个数据源来使用 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;
}
});
}
有没有其他方法可以解决这种情况?
谢谢!