今天接到一位开发同事报告说无法打开数据库列表。错误包括称:某个新建的DB没权限访问。但是其他的新建DB是没有包同样的问题,都可以正常使用。
根据情况我操作了一遍果然如此。思考了一下,未弄清什么回事。没有办法,启用法宝sql server profilter抓取sql。
拿到sql 以后发现,该数据库多出一下语句:
use [db_name]
SELECT dtb.collation_name AS [Collation], CAST(DATABASEPROPERTYEX(dtb.name, 'Version') AS int) AS [Version]
, dtb.compatibility_level AS [CompatibilityLevel]
FROM master.sys.databases AS dtb where name = db_name()
通过这个语句的前一SQL语句发现原来,sys.databases系统视图中的collation_name 列的值为 NULL。
查看sql server 2008 帮助文档发现:(以下为摘自帮助文档)
Microsoft SQL Server 实例中的每个数据库都对应一行。
如果数据库没有处于 ONLINE 状态,或者将 AUTO_CLOSE 设置为 ON 并且数据库关闭,则某些列的值可能为 NULL。如果数据库处于 OFFLINE 状态,则低权限的用户无法看到对应行。若要在数据库处于 OFFLINE 状态的情况下查看对应行,用户必须至少具有 ALTER ANY DATABASE 服务器级权限或master 数据库中的 CREATE DATABASE 权限。
选项 | 说明 | 默认值 |
---|---|---|
AUTO_CLOSE |
当设置为 ON 时,数据库将在最后一个用户退出后完全关闭,它占用的资源也将释放。当用户尝试再次使用该数据库时,该数据库将自动重新打开。 当设置为 OFF 时,最后一个用户退出后数据库仍保持打开。 |
无论使用什么操作系统,当使用 SQL Server 2000 Desktop Engine 或 SQL Server Express 时,对于所有数据库均为 True,而使用所有其他版本时,对于所有数据库均为 False。 |
(帮助文档结束)
就是说改列为空有两可能。
1、数据库 OFFLIN。
2、数据库设为“AUTO_CLOSE().
打开数据库的属性面板-》OPTION。其中的 set auto_closed 为"true”。问题答题清晰。连到该数据库库后问题解决。