Пользуюсь flyway уже давно. Очень хороший / полный инструмент!
На самом деле я столкнулся с неожиданной ситуацией... У меня есть две схемы:
- Владелец, обрабатывающий таблицы и последовательности
- Пользователь, использующий синонимы для доступа к объектам владельца
Обычай не хочет, чтобы я давал права «предоставить любой синоним / удалить любой синоним» Владельцу. Но я могу предоставить пользователю «предоставить синоним создания».
Так что мне нужно
- Создайте таблицы/последовательности (связанные с владельцем)
- Предоставить выбор, удаление... моей пользовательской схеме (связанной с владельцем)
- Создайте синоним для пользователя для доступа к объектам владельца (связанным с пользователем)
Пункт 3 моя проблема.
Если я дам владельцу «предоставить любой синоним» и использую заполнители пролетного пути, я могу сделать что-то вроде этого:
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;
}
});
}
Есть ли другой способ разрешить эту ситуацию?
Спасибо!