在很多情況下,我們開發都需要有一個快速的代碼生成工具用來提高開發效率,代碼生成工具很多信息都是讀取數據庫的表、視圖等元數據進行對象表信息的完善,有了這些信息,我們就可以在普通的實體類代碼裡面添加屬性字段的中文注釋,或者在Winform或者Web界面的快速生成的時候,可以在查詢框或者界面編輯的時候,充當標簽提示等處理信息。但是,一般情況下視圖的備注信息是沒有的,但是視圖和表之間是存在一定的關系的,雖然不同數據庫系統對於它們的信息對應不一定一致,但是我們可以把它們的對應關系尋找出來就可以給視圖字段增加備注了,這個就是本文介紹的思路和做法了,本篇結合介紹代碼生成工具Databae2Sharp的處理實現進行講解如何獲取視圖中字段對應的備注信息。
我們為了演示視圖的處理,我們需要創建兩個表,以及視圖的信息,首先我們創建一個客戶信息表,如下所示。
我們希望這個T_Customer表中的Creator字段和用戶表進行關聯,然後我們添加一個視圖,其中的視圖代碼如下所示。
SELECT dbo.T_Customer.ID, dbo.T_Customer.Name, dbo.T_Customer.Age, dbo.T_Customer.Creator, dbo.T_Customer.CreateTime, dbo.Users.UserName FROM dbo.T_Customer INNER JOIN dbo.Users ON dbo.T_Customer.Creator = dbo.Users.ID
也就是列出T_Customer的字段,以及一個Users表中的Username字段,相當於關聯了兩個表的視圖,獲取這個表的數據如下所示。
好了,到這裡我們基本就准備好前提條件了,剩下的就是如何獲取這些視圖的信息了。
在SQLServer裡面,我們如果需要獲取用戶視圖的信息,那麼通過系統的視圖就可以獲取到了,如下所示。
這個就是視圖的名稱和視圖SQL代碼了,我們如果需要詳細獲取視圖的字段信息,這些還不夠,我們可以根據視圖信息進一步列出用戶視圖和具體表的關系,如下所示。
從上圖我們就可以看出這個視圖字段和表的字段的一一對應關系了,也就是可以通過具體表的字段信息,包括我們這裡非常關注的備注信息了。
例如根據這些原理,我們視圖就直接從數據庫表字段中提取備注信息了,從而實現視圖備注字段的自動提取,減少人工設置的繁瑣和不便。
在Oracle裡面的視圖字段信息處理,和SQLServer有所不同,因為我們很難找到視圖字段和表字段的一一對應關系的視圖信息,因此有點困難。
在Oracle裡面我們先准備好一個T_Customer表,以及視圖等基礎信息先。
同時創建一個視圖和用戶表發生關聯,和在SQLServer一樣的做法,SQL如下所示。
create or replace view view_customer as select u.fullname, t.id, t.name, t.age, t.creator, t.createtime from t_customer t inner join t_acl_user u on t.creator = u.id;
我們通過Oracle的系統視圖ALL_TAB_COLUMNS或者DBA_TAB_COLUMNS可以獲得視圖的字段信息,如下所示。
不過很不幸,這個視圖的信息沒有和視圖關聯表發生任何的交集,無法獲取到對應的表信息,那麼如何獲取視圖對應表的信息呢,答案是可以通過ALL_DEPENDENCIES這個視圖進行獲取,如下圖所示。
但是這裡也只是獲取到對應的表,沒有和字段關聯,不過這樣基本上也差不多了,因為我們可以獲得視圖字段,以及這個視圖裡面包含的關聯表,那麼基本上它的字段信息也大致鎖定了,除非兩個表之間很多字段名稱相同,難以處理。
結合下面的SQL,我們可以獲得表和字段的信息了,如下所示。
select distinct table_name, column_name from all_tab_columns where table_name in (select referenced_name from all_dependencies where name='VIEW_CUSTOMER' and type = 'VIEW' and referenced_type = 'TABLE') and column_name in (select column_name from all_tab_columns where table_name='VIEW_CUSTOMER') order by table_name;
這樣我們根據視圖對應表的字段信息,匹配它的備注信息就差不多了,最後我們來看看基於Oracle的實現效果。
從上圖我們可以看到,代碼工具Database2Sharp,根據上述介紹的邏輯關系,自動從表對應的字段裡面去匹配對應的備注信息,從而減少手工設置視圖字段備注信息的繁瑣工作,為視圖代碼生成和界面生成提高了速度和效率。
以上的視圖備注信息的提取邏輯,我們可以把它應用在自己的業務處理裡面,實現更加廣泛的應用。
以上視圖備注信息的提取需求,來自一個客戶的建議,非常不錯,在此感謝他為這個細節做出的貢獻。