在大的公司裏面,每每數據庫和表都很是的多,一張表的字段也是會有幾十個。若是這麼多的表和字段沒有說明註釋的話,查看起來會一頭霧水,新來的或者別的部門的同事看到表和字段會徹底不知道是幹嗎的,只能靠名稱來猜。爲了不這種狀況,在數據庫的設計的時候就要去寫說明。在以前傳統的開發中通常會寫個數據字段的文檔,可是這顯然不符合節奏快,需求多,老變動的敏捷公司。對於數據庫數據來講,普通開發人員是不該該有線上數據庫權限的,最多也只能有一個查看的權限,更多的操做(新增字段,修改字段)都應該交給專業的DB團隊去操做。因此普通的大公司都會有本身開發的在線查看數據庫字段和在線執行SQL語句的系統。web
近幾日工做比較悠閒,就這麼重複的造了下輪子,本身按照原有的需求寫了一個簡單的系統。在線訪問頁面地址:http://www.pcstx.cnsql
先給你們看下界面:數據庫
這是查看字段的界面。能夠在線修改表的描述和字段的說明。緩存
這是在線執行SQL語句的界面。能夠執行多條SQL語句。這邊顯示的比較簡單。服務器
web.config裏面能夠配置是讀取鏈接字符串仍是經過登錄輸入。app
整個項目代碼比較簡單,就是查詢系統表。頁面用到ligerUI,數據庫訪問層用的是Dapper。在緩存上面,只是在左側樹上面作了緩存,對於大的項目表字段也應該使用緩存也能弄一個導出的功能。設計
鏈接字符串單獨的寫到了 App_Data\connectionStrings.config 裏面。分爲讀寫鏈接和只讀鏈接,目的是爲了在執行SQL語句的地方不能執行非查詢操做。這邊控制就靠數據庫的權限了。code
代碼裏面一些主要的SQL語句:orm
查詢服務器中全部數據庫名稱blog
string dbSQL = "select dbid as id,name,crdate as createDate,type='database',connName='"+connectionStringName+@"' from master..sysdatabases with(nolock) where dbid > 4 order by name;--用戶庫";
查詢數據庫中全部的表名
string tableSQL = @"select t.object_id as id,t.name as name,t.create_date as createdate, t.modify_date as modifydate,s.value as note,databaseName='{0}', type='table',connName='{1}' from [{0}].sys.objects t with(nolock) left join [{0}].sys.extended_properties s with(nolock) on t.object_id=s.major_id and s.minor_id=0 where [type] = 'u' and is_ms_shipped=0 order by name;"; dbName=dbName.Replace('\'',' '); tableSQL = string.Format(tableSQL, dbName,connectionStringName);
查詢表中全部字段的相關信息
string rowSQL = @" SELECT id=C.column_id,name=C.name,primaryKey=ISNULL(IDX.PrimaryKey,N''), rowType=T.name,lenght=C.max_length,isNull=C.is_nullable,defaultValue=ISNULL(D.definition,N''), note=ISNULL(PFD.[value],N''), type='row' FROM [{0}].sys.columns C with(nolock) INNER JOIN [{0}].sys.objects O with(nolock) ON C.[object_id]=O.[object_id] AND O.type='U' AND O.is_ms_shipped=0 INNER JOIN sys.types T with(nolock) ON C.user_type_id=T.user_type_id LEFT JOIN sys.default_constraints D with(nolock) ON C.[object_id]=D.parent_object_id AND C.column_id=D.parent_column_id AND C.default_object_id=D.[object_id] LEFT JOIN sys.extended_properties PFD with(nolock) ON PFD.class=1 AND C.[object_id]=PFD.major_id AND C.column_id=PFD.minor_id LEFT JOIN -- 索引及主鍵信息 ( SELECT IDXC.[object_id],IDXC.column_id,PrimaryKey=IDX.is_primary_key FROM sys.indexes IDX with(nolock) INNER JOIN sys.index_columns IDXC with(nolock) ON IDX.[object_id]=IDXC.[object_id] AND IDX.index_id=IDXC.index_id ) IDX ON C.[object_id]=IDX.[object_id] AND C.column_id=IDX.column_id WHERE O.name=@tableName -- 若是隻查詢指定表,加上此條件 ORDER BY O.name,C.column_id "; rowSQL = string.Format(rowSQL, dbName);
修改字段說明
string sql = @" if exists ( select * FROM [{0}].sys.extended_properties PFD with(nolock) left join [{0}].sys.columns C with(nolock) ON PFD.class=1 AND C.[object_id]=PFD.major_id AND C.column_id=PFD.minor_id left JOIN [{0}].sys.objects O with(nolock) ON C.[object_id]=O.[object_id] AND O.type='U' AND O.is_ms_shipped=0 where C.name='{2}' and O.name='{1}' ) begin USE [{0}]; EXEC sp_updateextendedproperty N'MS_Description', '{3}', N'user', N'dbo', N'table', N'{1}', N'column', N'{2}' end else begin USE [{0}]; EXECUTE sp_addextendedproperty N'MS_Description', '{3}', N'user', N'dbo', N'table', N'{1}', N'column', N'{2}' end "; //判斷是否存在,不存在新增,存在修改 dbName = dbName.Replace('\'', ' '); sql = string.Format(sql, dbName, TableName, rowName, Description);
實現代碼也比較簡單,在此提供我寫的代碼供你們吐槽。