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

<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

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

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

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

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

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

阅读更多
想对作者说点什么? 我来说一句

批量修改表和存储过程的架构

2012年04月19日 762B 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭