我们的系统,是支持同一台机器上安装多套的。
安装方法就是鼠标右键“复制”、“粘贴”(启动时会自动附加目录下的.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 则可以在构造函数里赋值,是动态常量。
用法上的区别,已经知道了,那效率上呢?
我不知道,不过我猜静态的应该比动态的节省内存。
结果东西做好之后,老程序员说还有一个很麻烦的问题。
客户如果长时间不用这套软件,.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 存的才是逻辑地址。
忧伤......
小工具的主要功能都实现了(就差图文并茂的操作说明),我寻思着取个啥名咧?
----【数据库整理小工具】。
老程序员一瞅,不行,叫【数据库一键修复】,立马感觉上了一个层次!
----什么是工作经验?介就是工作经验呐!~~~