如何处理甲骨文的同义词迁飞2.0.1?(How to handle Oracle synonyms

2019-10-30 06:51发布

我使用的飞行路线很长一段时间了。 非常漂亮的/完整的工具!

实际上,我面临着一个意想不到的情况......我有两个模式:

  • 一个所有者pocessing的表和序列
  • 使用同义词访问所有者对象的用户

自定义不希望我带来的“批创建任何同义词/降大任于同义词的权利给业主。 但我可以提供的“批创建同义词”给用户。

所以,我需要

  1. 创建表/序列(与业主连接)
  2. 格兰特选择,删除...到我的用户模式(与业主相连)
  3. 用于用户访问用户的对象创建一个同义词(与用户连接的)

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

}

还有另一种方法来解决这种情况呢?

谢谢!

Answer 1:

最好的办法是在应用程序中限定架构名称。

如果这是不可能的,且应用程序只使用SQL(不PL / SQL)访问“所有者”的对象,你能避免在同义词全部在后登录触发器更改默认的模式:

create or replace trigger USERX.a_logon_USERX
after logon on USERX
BEGIN
  EXECUTE IMMEDIATE ('ALTER SESSION SET current_schema=standard');
END;

然而,它有点辛苦,把握的是,当应用程序发送PL / SQL块这种技术失败(“开始...结束;”)数据库。 PL / SQL编译,因此可以不考虑当前模式。



Answer 2:

使用-Dflyway.schemas=OWNER_NAME当你运行的飞行路线。



文章来源: How to handle Oracle synonyms with Flyway 2.0.1?