2013-05-10 43 views
0

我現在很長一段時間都在使用flyway。非常好/完整的工具!如何使用Flyway 2.0.1處理Oracle同義詞?

實際上,我面臨着一個意想不到的情況......我有兩個模式:

  • 所有者pocessing表和序列
  • 使用同義詞訪問所有者的用戶對象

該定製不希望我向所有者授予「授予創建任何同義詞/刪除任何同義詞」權限。 但我可以向用戶提供「授予創建同義詞」。

所以我需要

  1. 創建表/序列(與業主連接)
  2. 格蘭特選擇,刪除...到我的用戶模式(與業主連接)
  3. 創建用戶訪問所有者對象的同義詞(與用戶連接)

第3點是我的問題。

如果我給了「授予任何同義詞」的所有者和使用飛路佔位符,我可以做這樣的事情:

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

} 

有另一種方式來解決這種情況呢?

謝謝!

+0

爲什麼沒有創建同義詞聲明工作? – 2013-05-12 17:44:43

+0

創建同義詞的作品,但我也需要刪除同義詞。真正的問題是,我的客戶不希望我向所有者提供「授予任何同義詞」。 – 2013-05-13 07:23:52

回答

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被編譯,因此不能考慮當前的模式。

0

使用-Dflyway.schemas=OWNER_NAME當您運行飛路。