关键词:SqlServer面试题 数据库面试题 DBA面试题
本文地址:http://www.teecool.com/post/2007080503.html
内容正文:
Ghost记录清理和602错误
问:最近,在使用SQL事件探查器监视我的SQL Server数据库时,我定期收到“Error: 602, Severity: 21, State: 13”信息。在SQL Server企业管理器的进程信息窗口中,我找到了一个名为“Ghost Record Cleanup”(幻影记录清除)的后台进程,并且该命令由用户系统所引发。我使用DBCC CHECKDB检查我的数据库,但是没有发现任何异常。请问什么是Ghost Record Cleanup进程?什么是602错误消息?
答:在从数据库中删除行、页或扩展盘区时,SQL Server会将这些对象标记为“幻影”(表示删除操作有待执行),并在稍后使用后台任务清除这些对象,该进程就是Ghost Record Cleanup。Ghost Record Cleanup改善了Delete命令的性能,因为SQL Server无需立即执行物理清除操作。
如需了解出现602错误的原因,您可以在SQL Server错误日志中查找提供ObjectID的一行信息。然后,您可以使用该ObjectID跟踪到导致该错误的数据库或对象。如果该对象仍然存在(例如,它不是诸如临时表的临时对象),您可以对其运行DBCC CHECKTABLE,并通过查询sysindexes验证该对象并未受损。如果对象未受损,则SQL Server错误地发出了602错误消息。多数情况下,SQL Server发布了错误的消息。如需了解602错误所代表的意思,请访问Microsoft产品支持服务网站并搜索“错误消息”和602。搜索将返回一系列说明如何解决602错误及其含义的文章。
—SQL Server 开发团队
--------------------------------------------------------------------------
使用扩展属性创建数据字典工具
问:我正在寻找可以帮助我维护一个SQL Server数据字典的共享软件或低成本工具。我使用过具备该功能的高级数据建模工具。但是,我现在的公司有许多SQL Server数据库,但是没有数据字典,并且也没有购买价格不菲的工具的打算。您知道有哪些给“穷人”用的数据字典工具吗?
答:尽管可能有免费或低成本的共享软件工具,但我对它们不是很熟悉。我建议您尝试使用SQL Server 2000的扩展属性。在SQL Server 2000中,Microsoft添加了扩展属性,用于帮助用户在多个数据库对象上定义和操作用户定义的属性。您可以使用这些用户定义的属性向您的数据库添加元数据,并使用该数据库创建一个直接集成在SQL Server中的“土制”数据字典。
您可以使用系统存储过程sp_addextendedproperty、sp_updateextendedproperty及sp_dropextendedproperty来管理这些属性。此外,您可以使用系统函数fn_listextendedproperty()检索现有的属性值。Microsoft使用扩展属性来写入和管理描述值,它与SQL Server企业管理器表设计视图中的列相关联。
请注意,使用这些存储过程和fn_listextendedproperty()函数创建和管理扩展属性并不是一件轻而易举的事。SQL Server在线书籍中名为“属性管理”的主题提供了有关扩展属性的基本信息。幸运的是,SQL Server杂志上有几篇非常不错的相互文章。有关使用扩展属性的详细信息,请参阅Michelle A. Poolet的“一个商业元数据知识库”,William Vaughn的“管理扩展属性”,以及“技巧:管理基于SQL Server 2000扩展属性的数据字典”。这三篇文章都解释了如何使用扩展属性,并且每篇文章都提供了一个解释器,供您编写自己的“穷人”数据字典之用。
—SQL Server MVP Brian Moran
--------------------------------------------------------------------------
确保所有的非空(Non-NULL)值都是唯一的
问:我的SQL Server表的一列允许NULL值。我希望在其值为非NULL时,该列是唯一的。怎样才能以编程的方式实现这一行为?如果在该列上设置一个UNIQUE 约束,我只能包含一个值为NULL的记录。我正在使用触发器实现这一约束,您可以推荐一个更简单的方法以保证所有的非NULL值唯一吗?
答:SQL Server没有实现非NULL值唯一性的内建机制,因此您需要通过自定义的CHECK约束来实现这一机制。例如,以下一段编码实现了您所需要的功能:
USE tempdb
Create table t1 (c1 int NULL, c2 char(5) NULL)
Create trigger mytrigger on t1 for insert, update as
BEGIN
IF (select max(cnt) from (select count(i.c1)
as cnt from t1, inserted i where t1.c1=i.c1 group
by i.c1) x) > 1
ROLLBACK TRAN
END
在SQL Server 2000中,您还可以使用INSTEAD OF触发器来实现这一功能。有关INSTEAD OF触发器的详细信息,请参阅以下文章。如需访问这些文章,请访问SQL Server 杂志网站,在InstantDoc框中输入InstantDoc号,然后点击Go。相关文章如下:
Tricks with INSTEAD OF Triggers; InstantDoc number 15828
INSTEAD OF Triggers on Views; InstantDoc number 15791
INSTEAD OF Triggers; InstantDoc number 15524
—SQL Server MVPs

