在大的公司里面,往往数据库和表都非常的多,一张表的字段也是会有几十个。如果这么多的表和字段没有说明注释的话,查看起来会一头雾水,新来的或者别的部门的同事看到表和字段会完全不知道是干嘛的,只能靠名称来猜。为了避免这种情况,在数据库的设计的时候就要去写说明。在之前传统的开发中一般会写个数据字段的文档,但是这显然不符合节奏快,需求多,老变更的敏捷公司。对于数据库数据来说,普通开发人员是不应该有线上数据库权限的,最多也只能有一个查看的权限,更多的操作(新增字段,修改字段)都应该交给专业的DB团队去操作。所以普通的大公司都会有自己开发的在线查看数据库字段和在线执行SQL语句的系统。

近几日工作比较清闲,就这么重复的造了下轮子,自己按照原有的需求写了一个简单的系统。在线访问页面地址:http://www.pcstx.cn

  先给大家看下界面:

这是查看字段的界面。可以在线修改表的描述和字段的说明。

这是在线执行SQL语句的界面。可以执行多条SQL语句。这边显示的比较简单。

web.config里面可以配置是读取连接字符串还是通过登陆输入。

整个项目代码比较简单,就是查询系统表。页面用到ligerUI,数据库访问层用的是Dapper。在缓存上面,只是在左侧树上面做了缓存,对于大的项目表字段也应该使用缓存也能弄一个导出的功能。

连接字符串单独的写到了 App_Data\connectionStrings.config 里面。分为读写连接和只读连接,目的是为了在执行SQL语句的地方不能执行非查询操作。这边控制就靠数据库的权限了。

代码里面一些主要的SQL语句:

查询服务器中所有数据库名称

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

  

实现代码也比较简单,在此提供我写的代码供大家吐槽。

点我下载

简单的SQL Server在线查看和执行系统的更多相关文章

  1. SQL Server:查看SQL日志文件大小命令:dbcc sqlperf(logspace)

      SQL Server:查看SQL日志文件大小命令:dbcc sqlperf(logspace) DBA 日常管理工作中,很重要一项工作就是监视数据库文件大小,及日志文件大小.如果你管理数据库的有很 ...

  2. SQL Server 在线进程分析处理

    SQL Server 在线进程分析处理 前言 数据库在线进程处理在很多时候需要人为干预已达到预期管理目标,下面整理一下常用的在线进程管理方法,便于后续工作使用. 一.查看目标数据库在线进程,并杀死指定 ...

  3. 最简单删除SQL Server中所有数据的方法

     最简单删除SQL Server中所有数据的方法 编写人:CC阿爸 2014-3-14 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间 ...

  4. 在SQL Server中查看对象依赖关系

    原文 在SQL Server中查看对象依赖关系 Viewing object dependencies in SQL Server   Deleting or changing objects may ...

  5. SQL Server——死锁查看

    一.通过语句查看 --查询哪些死锁SELECT request_session_id spid, OBJECT_NAME( resource_associated_entity_id ) tableN ...

  6. SQL Server如何查看存储过程的执行计划

    有时候,我们需要查看存储过程的执行计划,那么我们有什么方式获取存储过程的历史执行计划或当前的执行计划呢? 下面总结一下获取存储过程的执行计划的方法. 1:我们可以通过下面脚本查看存储过程的执行计划,但 ...

  7. 一些简单的SQL Server服务器监控

    1:磁盘活动的一些监控 指标 吞吐量:IOPS,存储子系统每秒能提供多少次I/O 吞吐量,MB/S,I/O子系统每秒能提供多少MB 延时:每个I/O请求占用多少时间 队列长度:队列中有多少IO请求在等 ...

  8. 最简单删除SQL Server中所有数据的方法(不用考虑表之间的约束条件,即主表与子表的关系)

    其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入死循环,二是这里使用了微软未正式公开的sp_MSF ...

  9. SQL Server如何查看当前数据库连接的SPID

    使用SQL Server系统变量@@SPID即可: SELECT @@SPID

随机推荐

  1. Android异常:异步任务导致的窗口句柄泄漏问题

    05-05 10:36:41.009: E/WindowManager(4243): Activity com.tao.MyActivity has leaked window com.android ...

  2. BZOJ1975 [Sdoi2010]魔法猪学院

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  3. 核心概念 —— 服务容器

    1.简介 Laravel 服务容器是一个用于管理类依赖和执行依赖注入的强大工具.依赖注入听上去很花哨,其实质是通过构造函数或者某些情况下通过 set 方法将类依赖注入到类中. 让我们看一个简单的例子: ...

  4. 在VS2010中使用附加进程的方式调试IIS中的页面

    h3{background:#333333; } 准备篇-配置IIS环境 在发布网站之前,需要安装iis环境! 之后点击确定即可! 发布网站至IIS-附加到进程调试 1.       用VS2010将 ...

  5. Linux C编程--fork()详解

    以下给出说明: fork函数 #include <sys/types.h>  #include <unistd.h> pid_t fork(void); fork调用失败则返回 ...

  6. PHP学习笔记 - 进阶篇(9)

    PHP学习笔记 - 进阶篇(9) 图形图像操作 GD库简介 GD指的是Graphic Device,PHP的GD库是用来处理图形的扩展库,通过GD库提供的一系列API,可以对图像进行处理或者直接生成新 ...

  7. Objective-C 【单个对象内存管理(野指针&内存泄露)】

    ------------------------------------------- 单个对象内存管理 (1)野指针 ①定义了一个指针变量,但是并没有赋初值,它随机指向一个东西 ②某指针变量指向的内 ...

  8. windows下redis服务安装

    1.redis简介redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(so ...

  9. 深入探析koa之中间件流程控制篇

    koa被认为是第二代web后端开发框架,相比于前代express而言,其最大的特色无疑就是解决了回调金字塔的问题,让异步的写法更加的简洁.在使用koa的过程中,其实一直比较好奇koa内部的实现机理.最 ...

  10. SEO前端优化

    精减代码 清除网页中一些冗余的代码,网上有这样的工具,可以辅助完成,如果需要的话,我们可以把代码中的注释去掉,甚至空行之类的也去掉,尽量的减少代码量,从而减小页面体积. CSS Sprites 通俗点 ...