0

ずっとフライウェイを使っています。非常に素晴らしい/完全なツールです!

私は実際に予期しない状況に直面しています...私には2つのスキーマがあります:

  • テーブルとシーケンスを処理する所有者
  • シノニムを使用して所有者オブジェクトにアクセスするユーザー

カスタムでは、所有者に「シノニムの作成/シノニムの削除」権限を与えることを望んでいません。しかし、「同義語の作成を許可」をユーザーに提供できます。

だから私はする必要があります

  1. テーブル/シーケンスを作成します (所有者に接続)
  2. 選択、削除...をユーザースキーマに付与します(所有者に接続されています)
  3. ユーザーが所有者オブジェクトにアクセスするためのシノニムを作成します (ユーザーに接続)

ポイント3は私の問題です。

'grant any synonym' を所有者に与え、フライウェイ プレースホルダーを使用すると、次のようなことができます。

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;
        }
    });

}

この状況を解決する別の方法はありますか?

ありがとうございました!

4

2 に答える 2

0

-Dflyway.schemas=OWNER_NAMEフライウェイ走行時に使用。

于 2016-11-07T20:19:48.663 に答える