專利名稱::關系數據庫管理系統中用于支持動態運行時間對象定義的方法和裝置的制作方法
技術領域:
:本發明涉及數據庫系統和方法。
背景技術:
:訪問關系數據庫的應用程序通過名字來引用數據庫中的對象(表,列等等)。這樣就會在應用程序和數據庫對象之間產生緊耦合。當對數據庫或應用程序進行更新時這種緊耦合會造成復雜化。在多個應用程序引用相同的對象以及應用程序本身在安裝位置于不同的時間更新時,這種復雜化情況會進一步加重。以上問題的傳統解決方式是使用關系數據庫所通常提供的“視圖”結構。但是,由于眾所周知的更新視圖的缺陷并且視圖在其定義中通常包括非標準SQL語法,因此使用數據庫視圖也是有問題的。能夠在不同廠商的關系數據庫上運行是一種理想的性能。
發明內容本發明致力于實現一種能在關系數據庫中進行動態運行時間對象定義的方法和裝置。在本發明的一個示范性實施例中,在應用程序和數據庫對象之間引入一個數據和處理層。該層可以中介對物理層的訪問并使得應用程序可以嵌入邏輯名而不是物理名。如果需要的話,在應用程序運行時,本發明還允許對該層的維護能夠動態發生。中介層最好能夠在多種關系數據庫上運行,并克服關系數據庫廠商引入的對SQL所做的特定廠商擴展。本發明的一個示范性實施例是通過PlatinumTechnology公司的POEMS數據交換機(也叫做“DEX”)和POEMS服務處理機“ptsprdbm”來實現的。DEX存儲中介層所使用的數據,處理工作由ptsprdbm服務處理機來完成。在該實施例中,DEX中介層可以看作是提交給DEX的消息與DEX的物理表布局之間的一種映射。這種映射允許與物理表的復關聯,因此便使更高的層與物理實現的改變隔離開來。同樣,中介還定義邏輯事務,這些邏輯事務把一個或多個應用程序請求與要在表或表系上執行的操作關聯起來。在一個示范性實施例中,每一個應用程序都會產生一個或多個請求,它們被發送到DEX。對于每個請求,DEX返回一個結果。可以有一個或多個ptsprdbm進程同時運行。每個應用程序請求由一個ptsprdbm服務處理機進程處理。中介層數據存儲在DEX的元數據主題區域內。運行在相同機器上的所有ptsprdbm實例都引用相同的元數據。元數據把應用程序的請求映射到物理表上。因此應用程序不需要知道物理表的標識符。物理表會隨時間變化,并且如果保持了元數據映射,應用程序就將與這些變化隔離開來。例如,客戶機程序可以通過一條消息請求與被稱之為“機器”的邏輯實體有關的數據。邏輯名“機器”可以與被稱之為“機器”的物理表相對應,也可以不相對應。中介層的責任是把邏輯事務名正確地轉換為物理表名和列。在另一個例子中,客戶機程序可以提交一條被映射到名為“機器的ipaddress”的邏輯事務的消息,這里“機器名”=absun10。在這個例子中,所引用的元素應當認為是必須轉換成物理對象的邏輯對象。這種需要是因為所請求的數據同樣會改變格式。例如在版本1的POEMS中,對于每個機器而言物理數據庫只存儲一個ip_address。但是在版本2的POEMS中,對于每臺機器而言,物理數據庫則可以存儲一列ip_address。這會造成一個不同的結果集合返回給客戶機程序,可能會中斷客戶機應用程序。使用中介數據,為版本2定義一個該服務處理機知道怎么處理的新的邏輯事務,這樣就可以返回給客戶機程序一個正確的結果集合。按照本發明使用中介數據層的一個優點在于應用程序可以定義包含有新的邏輯事務的新消息并使得DEX服務處理機能夠正確地處理這些新消息而不用對現有的服務處理機作出修改。應用程序只需要在DEX元數據表中加入一行來定義一個新的邏輯事務。服務處理機知道如何把這些新消息映射到加入到元數據表中的邏輯事務數據并因此為這些新消息構建正確的SQL命令。對物理數據庫的改變也可以以類似方式進行處理。一個新的邏輯事務可以被定義為把舊的消息映射到一個新的表格布局上。這可以通過為每個事務使用一個版本號來完成,或通過從元數據中刪除原始事務來完成。元數據還可被用于把用戶所創建的表集成到DEX中。用戶可以使用標準SQL創建一個表,然后在DEX元數據表中加入行來描述這個新表。用戶還可以創建per_triggers以便在現有的表被更新時,新表能夠被自動更新。圖1是根據本發明的一個示范性系統的框圖;圖2是根據本發明的一個示范性進程的流程圖。具體實施例方式圖1是根據本發明的一個系統的示范性實施例的框圖,該系統通過POEMS數據交換機(DEX)1000來實現。POEMSDEX在PLATINUM條款公共服務參考指南這本書中進行了描述。DEX1000包括多個物理表1500,并且可以與一個或多個應用程序100交互。應用程序100的例子包括ProVisionDirector和TSReorg。按照本發明,在應用程序100和DEX1000的物理表1500之間提供一個中介層1100。中介層1100包括一個或多個POEMS關系數據庫服務處理機(ptsprdbm)進程1150的實例和元數據主題區域1200。中介數據1250存儲在元數據主題區域1200中。中介數據1250如下所述由ptsprdbm服務處理機1150使用。中介層1100提供提交給DEX1000的消息與DEX的物理表布局之間的映射。這種映射允許與物理表的復關聯,因此便使更高的層與物理實現的改變隔離開來。多個邏輯名可以引用相同的物理對象并且邏輯名還可以隨時間而變化。同樣,中介還定義邏輯事務,這些邏輯事務把一個或多個應用程序請求(例如PEC消息)與要在表或表系上執行的操作關聯起來。一個操作對應于數據操縱語言(DML)動詞插入、更新、選擇和刪除中的一個。每個應用程序100創建一個或多個請求并把這些請求發送給DEX1000。DEX1000為每個接收到的請求返回一個結果。一個或多個ptsprdbm服務處理機程序1150可以在任一時間同時運行。每個應用程序請求由一個ptsprdbm進程1150處理。所有在同一臺機器上運行的ptsprdbm實例都引用相同的元數據。物理表可以有一個或多個。元數據把來自應用程序的請求映射到向物理表的請求。因此應用程序100不需要知道物理表1500的標識符。物理表1500可以隨時間變化,并且如果保持了元數據映射,應用程序就將與這些變化隔離開來。中介元數據1250可以進行更新,例如通過更新POEMS或應用程序100來對其進行更新。例如,一個新的應用程序100可以具有與置入元數據主題區域1200的應用程序相關的新的中介數據。這種功能所提供的靈活性在于使用本發明系統的各種產品可以單獨進行發展,而不需要所有的應用程序同時進行更新。最好,這種更新由服務處理機1150執行,這一點與向應用程序100提供對中介元數據1250的直接訪問相反。轉換發生在DEX服務處理機1150中。服務處理機1150使用中介數據1250來執行這種轉換。服務處理機1150最好使用一種標準的、開放式接口,如開放式數據庫連接性(ODBC),來連接元數據主題區域1200和/或應用程序100。在另一個可供選擇的實施例中,定制的POEMSODBC驅動程序把服務處理機1150的轉換層封裝起來。然后,該驅動程序就可以由第三方應用程序使用以訪問DEX(例如InfoReports)。在一個示范性實施例中,中介數據1250包括如下的表系per_table該表包括表格的總清單。DEX中的每個表在該表格中都有一個表目。per_column該表格包括DEX中每個表格的每個列的表目。與每個列相關聯的屬性是一個表中該列的類型、大小和位置。per_data_type該表包括所有支持的數據類型的總清單。per_key該表包括用于在DEX表上建立主關鍵字和外關鍵字的屬性。per_logical_object該表識別邏輯事務,它被用于查找事務細節以及與該事務相關聯的任何觸發器。per_tran_column該表識別屬于一個邏輯事務的列以及該列是否參與了SQL“where”子句的構建。per_trigger該表把觸發器與一個或多個邏輯事務關聯起來。如下為用于把中介數據1250存儲為元數據的一個示范性模式<prelisting-type="program-listing"><![CDATA[CREATETABLEper_source(per_source_idihtNOTNULL,source_descriptionvarchar(255)NULL,product_idintNULL,per_sourceintNULL,per_last_updatedsmalldatetimeNOTNULL,per_statussmallintNULL,CONSTRAINTXPKper_sourcePRIMARYKEY(per_source_id))CREATETABLEper_tran_col_type(column_typesmallintNOTNULL,column_type_descvarchar(31)NOTNULL,per_sourceintNULL,per_last_updatedsmalldatetimeNOTNULL,per_statussmallintNULL,CONSTRAINTXPKper_tran_col_typePRIMARYKEY(column_type))CREATETABLEper_logical_objectobject_idintNOTNULL,object_namevarchar(30)NOTNULL,per_sourceintNULL,per_last_updatedsmalldatetimeNOTNULL,per_statussmallintNULL,CONSTRAINTXPKper_logical_objectPRIMARYKEY(object_id))CREATETABLEper_tabletable_namevarchar(30)NOTNULL,storage_typechar(10)NULL,subject_areaCHAR(18)NULL,delete_policyCHAR(18)NULL,sequence_nbrnumeric(10,0)NOTNULL,per_sourceintNULL,per_last_updatedsmalldatetimeNOTNULL,per_statussmallintNULL,CONSTRAINTXPKper_tablePRIMARYKEY(table_name))CREATETABLEper_key(tablenamevarchar(30)NOTNULL,kev_idsmallintNOTNULL,key_typechar(1)NOTNULL,fbreign_tablevarchar(30)NOTNULL,per_sourceintNULL,per_last_updatedsmalldatetimeNOTNULL,per_statussmallintNULL,CONSTRAINTXPKper_keyPRIMARYKEY(table_name,key_id))CREATETABLEper_data_typedata_typesmallintNOTNULL,data_type_descvarchar(31)NOTNULL,per_sourceintNULL,per_last_updatedsmalldatetimeNOTNULL,per_statussmallintNULL,經CONSTRAINTXPKper_data_type PRIMARYKEY(data_type) ) CREATETABLEper_column column_namevarchar(30)NOTNULL, table_namechar(18)NULL, table_sequencesmallintNOTNULL, column_sizeintNOTNULL, null_flagsmallintNOTNULL, sequence_flagsmallintNOTNULL, per_sourceintNULL, per_last_updatedsmalldatetimeNOTNULL, per_statussmallintNULL, CONSTRAINTXPKper_column PRIMARYKEY(column_name,table_name) ) CREATETABLEper_key_column column_namevarchar(30)NOTNULL, table_namevarchar(30)NOTNULL, table_namevarchar(30)NOTNULL, key_idsmallintNOTNULL, per_0sourceintNULL, per_last_updatedsmalldatetimeNOTNULL, per_statussmallintNULL, CONSTRAINTXPKper_key_column PRIMARYKEY(column_name,table_name,table_name,key_id) )CREATETABLEper_tran_typetran_typesmallintNOTNULL,tran_type_namevarchar(31)NOTNULL,per_sourceintNULL,per_last_updatedsmalldatetimeNOTNULL,per_statussmallintNULL,CONSTRAINTXPKper_tran_type PRIMARYKEY(tran_type))CREATETABLEper_tranobject_idintNOTNULL,tran_typesmallintNOTNULL,tran_versionchar(10)NOTNULL,per_sourceintNULL,per_last_updatedsmalldatetimeNOTNULL,per_statussmallintNULL,CONSTRAINTXPKper_logical_tra PRIMARYKEY(object_id,tran_type))CREATETABLEper_triggerobject_idintNOTNULL,tran_typesmallintNOTNULL,trigger_sequencesmallintNOTNULL,trigger_obj_namevarchar(30)NOTNULL,trigger_tran_typesmallintNULL,per_sourceintNULL,per_last_updatedsmalldatetimeNOTNULL,per_statussmallintNULL, CONSTRAINTXPKper_trigger_det PRIMARYKEY(object_id,tran_type,trigger_sequence)) CREATETABLEper_logical_column object_idintNOTNULL, logical_col_idsmallintNOTNULL, logical_col_namevarchar(30)NOTNULL, column_namevarchar(30)NOTNULL, table_namevarchar(30)NOTNULL, per_sourceintNULL, per_last_updatedsmalldatetimeNOTNULL, per_statussmallintNULL, CONSTRAINTXPKperlogical_col PRIMARYKEY(object_id,logical_col_id) ) CREATETABLEper_tran_column object_idintNOTNULL, logical_col_idsmaUintNOTNULL, tran_typesmallintNOTNULL, column_typesmallintNOTNULL, join_columnvarchar(30)NULL, join_tablevarchar(30)NULL, where_flagsmallintNOTNULL, order_by_sequencesmallintNOTNULL, group_by_sequencesmallintNOTNULL, sub_tranvarchar(30)NULL, per_sourceintNULL,per_last_updatedsmalldatetimeNOTNULL,per_statussmallintNULL,CONSTRAINTXPKper_trans_detaiPRIMARYKEY(object_id,logical_col_id,tran_type))CREATETABLEper_index_typeindex_typesmallintNOTNULL,index_type_descchar(20)NOTNULL,per_sourceintNULL,per_last_updatedsmalldatetimeNOTNULL,per_statussmallintNULL,CONSTRAINTXPKper_index_type PRIMARYKEY(index_type))CREATETABLEper_index(table_namevarchar(30)NOTNULL,index_sequencesmallintNOTNULL,index_typesmallintNULL,per_sourceintNULL,per_last_updatedsmalldatetimeNOTNULL,per_statussmallintNULL,CONSTRAINTXPKper_index PRIMARYKEY(table_name,index_sequence))CREATETABLEper_index_column(column_sequencesmallintNOTNULL,table_namevarchar(30)NOTNULL,index_sequencesmallintNOTNULL, table_namevarchar(30)NOTNULL, column_namevarchar(30)NOTNULL, per_sourceintNULL, per_last_updatedsmalldatetimeNOTNULL, per_statussmallintNULL, CONSTRAINTXPKper_index_column PRIMARYKEY(column_sequence,table_name,index_sequence) ) CREATETABLEper_config per_versionchar(10)NOTNULL, sp_versionchar(10)NOTNULL, doc_versionchar(10)NOTNULL, install_datesmalldatetimeNULL, per_sourceintNULL, per_last_updatedsmalldatetimeNOTNULL, per_statussmallintNULL, CONSTRAINTXPKper_config PRIMARYKEY(per_version,sp_version,doc_version) ) CREATETABLEper_status( per_status_nbrsmallintNOTNULL, per_status_namehar(31)NOTNULL, per_sourceintNULL, per_last_updatedsmalldatetimeNOTNULL, per_statussmallintNULL, CONSTRAINTXPKper_status PRIMARYKEY(per_status_nbr))]]></pre>圖2所示的流程圖描述了根據本發明的服務處理機1150的示范性操作方法。如圖2所示,在步驟2010中服務處理機1150(的一個實例)接收來自應用程序100的請求。這種請求被封裝在應用程序請求內部的數據結構也就是請求數據結構或RDS中。在步驟2020中,服務處理機對這種應用程序請求進行解包并提取RDS的成員。數據成員包括標識符,標識符在步驟2030中由服務處理機使用來訪問存儲在DEX中的元數據。在步驟2040中,對照元數據對標識符進行處理。更明確一些說,服務處理機使用元數據來對請求內容接觸引用并把請求的內容映射到元數據上。這種處理造成了RDS中的標識符被轉換為物理表1500中使用的標識符。解除引用這一步所返回的結果是一組用于當前的數據庫實例的有效物理名。在步驟2050中,服務處理機獲得該組物理名。然后在步驟2060中服務處理機使用這些數據來構建一個可以直接對數據庫執行的SQL語句。再之后,在步驟2070中服務處理機執行SQL語句并收集SQL語句處理的結果。在步驟2080中,執行SQL語句的結果被重新映射到在步驟2010中所接收到的RDS中的邏輯名中。然后在步驟2090中把這些結果返回給與邏輯名相聯的應用程序,以上邏輯名是應用程序在發出請求時所使用的。以此方式,應用程序便完全與物理數據庫以及其中所使用的標識符隔離開來。在本發明的另一個實施例中,還要存儲與DEX數據有關的附加元數據,包含關于哪個實體對數據具有權威性的信息(也就是說,哪個應用程序擁有物理表中的數據,哪個應用程序就可以對這些數據進行更新或刪除)。在再一個示范性實施例中,顯示信息和格式化信息被存儲起來以用于每個邏輯對象,并且還可以為應用程序使用,用于在監視器或報告中呈現通過中介層訪問的數據。在元數據中存儲顯示信息和格式化信息可以使得使用這些數據的應用程序能夠動態呈現返回給它們的數據。權利要求1.一種用于處理數據庫中數據的系統,該系統包括中介數據存儲器;處理機,其中處理機從應用程序接收處理數據的請求;從所接收的請求中提取邏輯標識符;通過利用邏輯標識符從中介數據存儲器中獲取物理標識符,把邏輯標識符轉換為物理標識符;取出由物理標識符所標識的存儲在物理表中的數據;處理所取出的數據以得到一個結果;利用邏輯標識符把結果返回給應用程序。2.一種用于數據庫系統中處理操作的方法,包括以下步驟從應用程序接收處理數據的請求;從所接收的請求中提取邏輯標識符;把邏輯標識符轉換為物理標識符;取出由物理標識符所標識的存儲在物理表中的數據;處理所取出的數據以得到一個結果;利用邏輯標識符把結果返回給應用程序。3.權利要求2的方法,其中轉換步驟包括利用邏輯標識符從中介數據存儲器中獲取物理標識符。4.權利要求3的方法,其中中介數據被動態更新。5.權利要求3的方法,其中中介數據存儲器包含在數據庫系統的元數據主題區域中。全文摘要一種用于提供關系數據庫中的動態運行時間對象定義的方法和系統。在應用程序(100)和數據庫對象之間引入中介層。該層可以中介對數據庫對象,例如表(1500),的訪問,并允許應用程序嵌入邏輯名而不是物理名。如果需要,在應用程序運行時,可以動態維護中介層。中介層最好可以在多種關系數據庫上運行,克服關系數據庫廠商引入的對SQL的特定廠商擴展。文檔編號G06F17/30GK1332877SQ99815381公開日2002年1月23日申請日期1999年11月30日優先權日1998年11月30日發明者基思·盧易施,埃德·卡里根,杜安·布恩申請人:聯合想象計算機公司