2013-05-10 4 views
0

나는 오랫동안 이동 경로를 사용하고 있습니다. 아주 좋은/완벽한 도구!Flyway 2.0.1로 Oracle 동의어를 처리하는 방법은 무엇입니까?

는 실제로 예상치 못한 상황에 직면하고있어

... 나는 두 스키마가 : 테이블과 시퀀스는 소유자에 액세스 할 수 동의어를 사용하는 사용자는 을

  • 객체 을 pocessing

    • 소유자

      사용자 지정 사용자가 '동의어 만들기/동의어 삭제'권한을 소유자에게 부여하지 않기를 바랍니다. 하지만 사용자에게 '동의어 생성 동의어'를 제공 할 수 있습니다.

      그래서 나는 만들기

    • 삭제,
    • 그랜트 선택 (소유자와 연결) 테이블/시퀀스 만들기 ... 내 사용자의 스키마 (소유자와 연결)

      1. 필요 User와 연결된 Owner 객체에 대한 동의어

      포인트 3은 제 문제입니다.

      나는 주인에게 '동의어를 부여'와 이동 경로의 자리 표시자를 사용하여, 나는 그런 일 할 수있는 줄 경우

      CREATE OR REPLACE SYNONYM ${user}.WORKITEMINFO FOR WORKITEMINFO; 
      

      을하지만 난 못해, 난이 구현)

      그래서 솔루션을 User 스키마에 연결된 다른 DataSource를 사용하여 Java 마이그레이션을 사용하는 것입니다.

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

      이 문제를 해결하는 또 다른 방법이 있나요 (내 MigrationUtils.replacePlaceholders 나를 자리로 flyway.properties의 모든 속성에 대한 액세스 권한을 얻을 수 있습니다)?

      감사합니다.

  • +0

    왜 동의어 구문을 작성하는 것이 정확하지 않습니까? –

    +0

    동의어 만들기가 작동하지만 동의어를 삭제해야합니다. 진정한 문제는 고객이 소유자에게 '동의어 드롭 어구 동의어'를 제공하지 않기를 바랍니다. –

    답변

    0

    가장 좋은 방법은 응용 프로그램에서 스키마 이름을 한정하는 것입니다.

    create or replace trigger USERX.a_logon_USERX 
    after logon on USERX 
    BEGIN 
        EXECUTE IMMEDIATE ('ALTER SESSION SET current_schema=standard'); 
    END; 
    
    : 그건 불가능하고, 응용 프로그램이 "소유자"개체에 액세스 할 경우에만 SQL (안 PL/SQL)을 사용하는 경우

    , 당신은 후 로그온 트리거의 기본 스키마를 변경하여 모든 동의어를 피할 수

    그러나 응용 프로그램이 PL/SQL 블록 ("begin ... end;")을 데이터베이스로 보낼 때이 기술이 실패한다는 것을 이해하는 것이 다소 어렵습니다. PL/SQL이 컴파일되어 현재 스키마를 고려할 수 없습니다.

    0

    flyway를 실행하는 동안 -Dflyway.schemas=OWNER_NAME을 사용하십시오.