扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:Tim Chapman 来源:TechRepublic.com 2007年3月12日
关键字: DBA SQL Server 数据库
做为数据库管理员,我经常在提交用于生产环境的编码前进行仔细的检查。而且,无论我多么不愿意承认,我都无法发现全部可能干扰生产环境的问题。
发生这种情况时,补救方法就是将对象编码恢复到之前的状况,这种阶段可能是保存过的程序、查看结果或者某种功能。可能您最不愿意做的就是使用数据库备份对其进行恢复。由于数据库是保存在磁带上,那么找到备份可能要花很长的时间,如果数据库规模巨大,恢复也需要相当长的时间。而且您还需要找到一台足以保存下备份文件的服务器。显然我们需要找到个更好的办法。
很早以前我曾经做过一个解决方案能将数据库保存在单独的表单上,因此编写中的编码出现问题时,我能够用这些表单恢复程序或功能。这个解决方案曾经一次又一次的节省了我大量的时间。
在SQL Server 2000下使用这个解决方案需要每天夜里复制指定数据库的syscomment并将副本存入归档表单中。我一般会将这些程序编码保存两个星期。这项技术唯一的阻碍是如果编码对象较大,就必须要重新编写编码,因为编码可能会被保存在syscomment的不同行中,这样就比较痛苦。
SQL Server 2005的新功能之一就是能够完全恢复系统功能中的某个目标代码。这个功能将极大简化程序编码的归档工作。
OBJECT_DEFINITION功能
SQL Server 2005系统中新的OBJECT_DEFINITION功能能够恢复功能对象ID的TSQL编码。为了让您对这一功能有所认识,首先我们来看一些例子。首先,我会创建一个用户定义的功能。这一功能的脚本如下:
CREATE FUNCTION udf_Multiply
(
@Val1 INT,
@Val2 INT
)
RETURNS INT
AS
BEGIN
DECLARE @RetVal INT
SET @RetVal = (@Val1 * @Val2)
RETURN(@RetVal)
END
这是个很傻的功能因为它只能将两个数字相乘,但是它能很好的演示出OBJECT_DEFINITION的工作原理。对这一系统功能进行测试的脚本如下。
DECLARE @ObjectID INT
SET @ObjectID = OBJECT_ID('udf_Multiply')
SELECT OBJECT_DEFINITION(@ObjectID)
在本例中,我们实际用到了两个系统功能。首先,我们为我们所创建的功能找到了能够标识SQL服务器数据库引擎中对象的OBJECT_ID。然后我们将这一ID输入系统功能OBJECT_DEFINITION,然后就能返回所提供的ID所对应的对象编码。这一功能所返回的值就是我们之前为udf_Multiply 功能所编写的TSQL编码。
现在我们已经知道了OBJECT_DEFINITION的工作原理。让我们来看看如何运用这一功能来对阶段性代码进行归档记录。首先,运行列表A里的脚本在测试数据库中创建20个程序。
你会在上面的脚本中看到我们所运用的是动态SQL语句。一般来说,当我创建SQL语句时,我更愿意使用系统保存的sp_executesql程序,它能够很好的缓存系统中的SQL语句。
不过,在这个例子中,EXECUTE 语句就能够很好的完成任务。
现在数据库中已经有了对象,我们可以创建一些所需的对象和代码来记录这些程序。列表B中的脚本能够帮我们完成这项任务。
我们的归档解决方案首先需要一个能够保存代码定义的表格。正如你在上面的表格脚本里所看到的,我们在ObjectDefinition 区域内,以VARCHAR(MAX)数据类型保存对象定义。这种SQL Server 2005类型的数据能够最多存储2G数据。这样数据的保存就不再局限于TEXT格式和单张数据页。这种数据类型完全可以保存对象代码。
有些考虑对于输入CodeArchive 表的脚本来说是没有意义的。首先是查询所涉及的类型,OBJECT_DEFINITION 能够返回值的对象类型, OBJECT_DEFINITION根据这些对象类型返回值。下面给出了一个包括这些对象类型的列表。其次是调用脚本的方式。我一般会对SQL服务器进行设置,每天晚上执行一次与此类似的代码。(你可以根据自己业务需求调整频次)无论怎样进行,都需要定期运行这个脚本,这样才能保证在需要的时候能够恢复阶段性编码。
以下是OBJECT_DEFINITION可以调用的对象类型:
T: 约束检查
D: 默认
P: TSQL保存的程序
FN: TSQL标量用户定义功能
R: 规则
RF: 复制过滤程序
TR: TSQL触发器
IF: TSQL Inline功能
TF: TSQL值功能
V: 查看
如果您还没有尝试过新的OBJECT_DEFINITION功能,希望这篇文章能帮助您尝试一下。
无论怎么强调代码备份系统在生产环境中的重要性都不算过分。在我的产品开发环境中,始终都备有这样一个系统。如果你也能建立一个类似的系统,对开发过程中阶段性的代码进行本地或者远程备份,那么当你必须修复代码时你就能轻松应对,而不必费心劳力的用备份进行恢复。
(责任编辑:张思童)
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者