0

我现在使用flyway很长时间了。非常好/完整的工具!

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

  • 处理表格和序列的所有者
  • 使用同义词访问所有者对象的用户

习俗不希望我授予所有者“授予创建任何同义词/删除任何同义词”的权利。但我可以向用户提供“授予创建同义词”。

所以我需要

  1. 创建表/序列(与所有者连接)
  2. 将 Select、Delete... 授予我的用户架构(与所有者连接)
  3. 为用户创建同义词以访问所有者对象(与用户连接)

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

}

有没有其他方法可以解决这种情况?

谢谢!

4

2 回答 2

0

最好的方法是在应用程序中限定模式名称。

如果这是不可能的并且应用程序仅使用 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 块(“begin ... end;”)发送到数据库时,很难理解这种技术会失败。PL/SQL 已编译,因此无法考虑当前模式。

于 2013-05-12T21:05:27.427 回答
0

-Dflyway.schemas=OWNER_NAME在您运行飞行路线时使用。

于 2016-11-07T20:19:48.663 回答