松原信息网
历史
当前位置:首页 > 历史

如何在SQL Server 2005中对代码进行归档

发布时间:2019-09-13 20:41:27 编辑:笔名

做为数据库管理员,我经常在提交用于生产环境的编码前进行仔细的检查。而且,无论我多么不愿意承认,我都无法发现全部可能干扰生产环境的问题。

发生这种情况时,补救方法就是将对象编码恢复到之前的状况,这种阶段可能是保存过的程序、查看结果或者某种功能。可能您最不愿意做的就是使用数据库备份对其进行恢复。由于数据库是保存在磁带上,那么找到备份可能要花很长的时间,如果数据库规模巨大,恢复也需要相当长的时间。而且您还需要找到一台足以保存下备份文件的服务器。显然我们需要找到个更好的办法。

很早以前我曾经做过一个解决方案能将数据库保存在单独的表单上,因此编写中的编码出现问题时,我能够用这些表单恢复程序或功能。这个解决方案曾经一次又一次的节省了我大量的时间。

在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功能,希望这篇文章能帮助您尝试一下。

无论怎么强调代码备份系统在生产环境中的重要性都不算过分。在我的产品开发环境中,始终都备有这样一个系统。如果你也能建立一个类似的系统,对开发过程中阶段性的代码进行本地或者远程备份,那么当你必须修复代码时你就能轻松应对,而不必费心劳力的用备份进行恢复。

(责任编辑:张思童) 查看本文的国际来源

下壁心肌梗死严重吗
儿童发烧怎么办
薏芽健脾凝胶服用说明
心梗哪家治疗好