2014-01-14 73 views
1

我有一個項目名稱下拉列表,並根據所選值生成架構下拉列表。如何在運行時創建多個模式連接?

生成架構列表後,會出現一個'選擇文件'選項,其中選擇要在多個架構上運行的腳本名稱。

項目列表值和架構列表值都存儲在數據庫中。數據庫中還有另一個存儲架構憑據的表。

我想知道如何在這些多個模式上創建連接,以及如何在從該模式下拉列表中選擇的多個模式中運行腳本。

我已經使用iBatis框架使用scriptrunner方法在一個模式中執行代碼。

表1:ProjectName

PROJECT_PK, 
PROJECT_CODE, 
PROJECT_NAME 

表2:ComponentName

COMPONENT_PK, 
COMPONENT_CODE, 
COMPONENT_NAME, 
PROJECT_PK 

表3:SchemaName(此表包含其他模式的憑證)

SCHEMA_PK, 
SCHEMA_NAME, 
PASSWORD, 
ORACLE_SID, 
HOST_NAME, 
PORT_ID 

表4:PROJECT_DETAIL

PROJECT_DETAIL_PK, 
COMPONENT_PK, 
SCHEMA_PK 

表5:COMPONENT_DETAILS

COMPONENT_DETAILS_PK, 
PROJECT_PK, 
SCHEMA_PK 

我附上場景圖像。

enter image description here

+1

在數據庫中的情況下可以被廣泛理解意思是'數據定義語言';特別是在你談論模式的地方。 (目前還不清楚您將針對所選模式運行的SQL腳本是DML還是DDL,儘管這可能無關緊要,但您給出的印象是DDL)。 –

+0

對於混淆感到抱歉,但我在括號中寫了DDL,這裏的意思是dropdownlist。sql腳本可能包含任何DML,DDL或DCL – saurabhk

+0

存儲模式密碼似乎不是一個好主意;當你閱讀這些內容時你有什麼聯繫,或者有誰能看到它們?始終以具有所有模式特權的相同用戶身份進行連接似乎更安全,更輕鬆;那麼可以在執行每個腳本之前[更改當前的模式](http://stackoverflow.com/a/20531823/266304)?該用戶將不得不非常有權在不同的架構中運行DDL。 –

回答

0

我建議你創建一個「超級模式」與所有其他模式此時,相應的補助,併爲這個「超級模式」的JDBC連接。這將使你需要一些篡改SQL腳本 - 你需要將它與一些標記寫入輕易替代的模式,像

ALTER TABLE ${SCHEMA_MARKER}.INVOICES ADD CLIENT_ADRRESS Varchar2(35); 

而且你的Java代碼將用它替換您的目標模式。有了一些想象力,你可以擴展這個想法來在所有模式上執行批量DDL腳本。

順便說一下,我明白你的問題,你有許多具有相同結構的模式。我被迫曾經與這樣一個傳統結構合作,所以我知道公司結構中有很多動力;儘管如此,我必須推薦你重新設計這樣的系統。例如,在你的超模式上創建物化視圖,複製你的模式結構,但在每個表主鍵中都有一個新的字段(這個新字段將填補空白,使得在任何模式中爲初學者分離數據)。

這肯定會使您的查詢緩存遭受的損失少得多,並且會使需要使用該「分佈式」數據的任何新軟件的開發變得更容易。

0

在Oracle中,架構基本上是一個用戶。因此,要在模式SX中創建表FOO,您只需以用戶SX的身份登錄並執行create table FOO (...)(不指定模式)。 Oracle中的用戶==模式約定將確保這可以工作。

以用戶身份登錄SX,讓您的DataSource的持有和使用getConnection(String username, String password)而不是默認的getConnection()

兩種方式是添加在腳本中的佔位符,你處理首先生成有效的SQL的。以Jorge_B的答案爲例。

最後,您可以更改使用ALTER SESSION默認模式(見Default Schema in Oracle Connection URL)。這種方法的問題是,你必須使用帶有DataSource Web容器時關閉連接之前恢復模式 - 在這種情況下,連接是不會關閉的,所以下一個代碼塊請求的連接將獲得一個與一個意想不到的默認模式 - >很難找到錯誤。

0

這裏是DAO類,用於在運行時在同一個數據庫上創建多個模式連接。

我們需要在運行時通過輸入模式名稱,並呼籲在一些小服務程序。

架構細節即用戶名,密碼,主機ID,端口號和SID將被存儲在其中,雖然連接將創建數據庫表。

所創建的連接都存儲在這裏在其可以在稍後的時間點使用所述列表。

憑證DTO這裏是映射到數據庫中的數據庫表和使用DDL速記爲「下拉列表」是混亂的對象,然後

Connection conn=DBUtil.getConnection(constants.DB_DS_NAME); 
     Statement stmt=null; 
     stmt=conn.createStatement(); 
     ResultSet rs= null; 
     Connection [] con=new Connection[schemaname.length]; 
     int i,j; 
     String [] url=new String[schemaname.length]; 
     String [] username=new String[schemaname.length]; 
     String [] password=new String[schemaname.length]; 
     List<CredentialDTO> creDTOlist=new ArrayList<CredentialDTO>(); 
     String query1="insert into dba_project_master VALUES(9,'abc','abc','abc','abc',40)"; 
     String query2="CREATE TABLE EMP(EMPNO NUMBER(4,0) NOT NULL ENABLE,ENAME VARCHAR2(10 BYTE),JOB VARCHAR2(9 BYTE), SAL NUMBER(7,2),DEPTNO NUMBER(2,0))"; 

     try 
     { 
      for(i=0;i<schemaname.length;i++){ 
       String query=" select * from dba_schema_details where schema_name="+DBUtil.enquoteString(schemaname[i]); 
       rs=stmt.executeQuery(query); 

       while(rs.next()){ 
        CredentialDTO creDTO=new CredentialDTO(); 
        creDTO.setSCHEMA_PK(rs.getString("SCHEMA_PK")); 
        creDTO.setSCHEMA_NAME(rs.getString("SCHEMA_NAME")); 
        creDTO.setPASSWORD(rs.getString("PASSWORD")); 
        creDTO.setORACLE_SID(rs.getString("ORACLE_SID")); 
        creDTO.setHOST_NAME(rs.getString("HOST_NAME")); 
        creDTO.setPORT_ID(rs.getString("PORT_ID")); 
        creDTOlist.add(creDTO); 
       } 
      } 
       System.out.println("creDTOlist size:"+creDTOlist.size()); 
       //create URL for the schema name 
       int m=creDTOlist.size(); 
       Iterator<CredentialDTO> LItr= creDTOlist.iterator(); 
       String [] username1=new String[m]; 
       String [] password1=new String[m]; 
       i=0; 
       while(LItr.hasNext()){ 

        System.out.println("iteration "+i); 
        CredentialDTO temp = LItr.next(); 
        String URL="jdbc:oracle:thin:@"+temp.getHOST_NAME()+":"+temp.getPORT_ID()+":"+temp.getORACLE_SID(); 
        System.out.println("URL:"+URL); 
        username1[i]=temp.getSCHEMA_NAME(); 
        System.out.println("iteartion "+i+" username="+username1[i]); 
        password1[i]=temp.getPASSWORD(); 
        System.out.println("iteartion "+i+" password="+password1[i]); 
        Class.forName("oracle.jdbc.OracleDriver"); 
        con[i]=DriverManager.getConnection(URL, username1[i], password1[i]); 
        System.out.println("Connection Name:" +con[i]); 
        Statement st1=con[i].createStatement(); 
        con[i].setAutoCommit(false); 
        st1.addBatch(query1); 
        st1.addBatch(query2); 
        int [] update=st1.executeBatch(); 
        i++; 
       } 
      } 
      catch(Exception ex){ 
        ex.printStackTrace(); 
      }finally 
     { 
      if (conn != null) try{conn.close();} catch(SQLException ignore) {} 
      if (stmt!= null) try{stmt.close();} catch(SQLException ignore) {} 
      if (rs != null) try{rs.close();} catch(SQLException ignore) {} 
     } 
     return creDTOlist; 

    } 

} 
相關問題