首页 > 代码库 > 2014-07-24 MSSQL数据库分离及获取存放地址

2014-07-24 MSSQL数据库分离及获取存放地址

我们的系统,是支持同一台机器上安装多套的。

安装方法就是鼠标右键“复制”、“粘贴”(启动时会自动附加目录下的.mdf)。

 

有的人安装多套以后,想要删除某一套的时候,为了省事儿就自作聪明的鼠标右键“删除”。

这样一来,MSSQL里的数据库就乱了,客户就会打电话过来囧。

我们一没实施,二没客服,就老程序员和我两个程序员......

 

所以我要做一个清理数据库的小工具,处理被客户搞乱的数据库:

首先,通过数据库名称找出所有我们系统的数据库。

然后,遍历每个数据库,分成可以连接的和不可以连接的两种。

最后,可以连接的,进行数据分离;不可以连接的,直接删除。

 

分离数据库T-SQL:

1 USE master; 2 ALTER DATABASE {0} SET single_user WITH ROLLBACK IMMEDIATE ; 3 EXEC sp_detach_db {0},true;  

 

因为这个小工具只有几个固定的T-SQL,所以我直接就写全局变量里了。

但我是用 const 呢?还是用 readonly 呢?

这是个问题(虽然做了三年程序员,但工作中还真没见过这俩玩意儿,惭愧)。

 

于是我百度了一下他俩的区别:

const 必须在声明的时候赋值,是静态常量,readonly 则可以在构造函数里赋值,是动态常量。

 

用法上的区别,已经知道了,那效率上呢?

我不知道,不过我猜静态的应该比动态的节省内存。

因为“动”就表示不确定啊,所以我用的 const O(∩_∩)O~~~
 

结果东西做好之后,老程序员说还有一个很麻烦的问题。

客户如果长时间不用这套软件,.mdf文件的【高级属性】中的【压缩内容以遍节省磁盘空间】会被勾选。

然后就连不上数据库了......

 

看来那些不能连接的数据库,还不能直接删除,得先获取其存放地址,然后判断该文件是否存在。

存在的要告诉客户.mdf文件的存放地址,并图文并茂的展示相应的操作方法;不存在的才能直接删除。 

但是,如何获取数据库的存放地址呢?还得问度娘啊#^_^#~~~

 

获取数据库存放地址T-SQL:

1 USE master; 2 SELECT 3 fs.[filename] 4 FROM sys.databases AS db 5 JOIN sysaltfiles AS fs ON db.[database_id]=fs.[dbid] 6 WHERE db.[name]={0}; 

 

话说一开始我还自作聪明的试了一下

1 SELECT 2 [filename] 3 FROM sysaltfiles 4 WHERE [name]={0}; 

 

结果执行之后,返回结果为零囧。

原来 sysaltfiles 存的是物理地址,sys.databases 存的才是逻辑地址。

忧伤...... 

 

小工具的主要功能都实现了(就差图文并茂的操作说明),我寻思着取个啥名咧?

----【数据库整理小工具】。

 

老程序员一瞅,不行,叫【数据库一键修复】,立马感觉上了一个层次!

----什么是工作经验?介就是工作经验呐!~~~