利用OBJECT,第1张

利用OBJECT,第2张

作为一名数据库管理员,我总是尽力在代码迁移之前给出提交给开发环境的代码的完整画面。但是,我不得不承认,我不能保证不会发生任何可能损害开发系统的事情。发生这种情况时,可能的补救措施是恢复到目标代码的先前版本,这可能是存储过程、函数等。

如果可能的话,你不想做但又不得不做的就是从备份的数据库中恢复代码,但是如果备份的数据库存储在磁带上,这种方法可能会用的时间太长。如果数据库很大,恢复将需要很长时间,更不用说你必须找到一个足够大的服务器来存储备份的文件。但是,有更好的办法。

我很久以前找到的一个解决方案是将数据库代码备份到一个独立的数据表中,这样如果我们开发的代码出现错误,我们可以从数据表中恢复错误的过程或函数。这个方法确实节省了很多时间。

在SQL Server 2000中,这种方法可以这样实现:对一个特殊的数据库进行syscomments数据表的完整备份,然后将备份的数据表放入存档表中。我通常会保存最近两周的重要流程代码。这种技术的问题是,如果代码对象非常大,可能需要重构代码。因为如果代码太大,它将被存储在syscomments表的不同行中,有时这可能是一个令人头疼的问题。

SQL Server 2005的新功能之一是可以使用系统函数返回对象的完整代码。这个系统函数将使存档您的过程代码变得非常简单。

对象定义

SQL Server 2005新增的系统函数OBJECT_DEFINITION根据提供给该函数的对象ID返回对象的TSQL代码。为了更好的理解这个函数的工作过程,我举个例子。首先,我们用以下脚本创建一个用户定义的函数:

创建函数udf_Multiply

(@Val1 INT,

@Val2 INT

)

返回整数

如同

开始

DECLARE @RetVal INT

SET @RetVal = (@Val1 * @Val2)

RETURN(@RetVal)

END

这是一个非常简单的小函数。因为它只处理两个参数,所以足以向我们展示OBJECT_DEFINITION函数是如何工作的。测试系统功能的脚本如下:

声明@ObjectID INT

SET @ ObjectID = OBJECT _ ID(' UDF _ Multiply ' ')

select _ definition(@ objectid)

在这个例子中,我们实际上使用了两个系统函数。首先,我们需要获得前面创建的udf_Multiply函数的OBJECT_ID。在SQL Server数据库引擎中,OBJECT_ID是对象的系统标识符。然后我们把这个ID传递给系统函数OBJECT_DEFINITION,它会返回提供给它的ID对象的代码,也就是返回值是我们之前为udf_Multiply函数写的TSQL代码。

现在我们已经很好地理解了OBJECT_DEFINITION函数的工作原理,让我们来看看如何使用这个函数将过程代码归档到我们的数据库中。首先,运行列表A中的脚本程序,在测试数据库中创建20个存储过程。

声明@i INT
SET @i = 1

WHILE @ I BEGIN EXECUTE
(' ' IF OBJECT _ ID(' ' ' USP _ test PROCEDURE ' '+@ I+' ' ' ')> 0
DROP PROCEDURE USP _ test PROCEDURE ' '+@ I+' ' ' ')
EXECUTE(' CREATE PROCEDURE USP _ test PROCEDURE ' '+@ I+' '
AS BEGIN PRINT ' ')此过程的名称为' ' '+
Cast(OBJECT _ name(@ procid)AS varchar(20))end ' ')
set @ set在创建动态sql语句时,我习惯使用系统存储过程sp_executesql,因为它可以很好地缓存系统中的SQl语句。然而,在我们的例子中,EXECUTE命令可以很好地完成任务。
现在,我们的数据库中有了一些对象,我们可以创建归档数据库中的存储过程所需的对象和代码。清单B中的脚本可以为我们做到这一点。

IF OBJECT _ ID(' code archive ' ',' ' U ' ')> 0
DROP TABLE code archive

CREATE TABLE code archive
(ArchiveID INT IDENTITY(1,1)主键,
ObjectName SYSNAME,
object description VARCHAR(60),
ObjectType CHAR(2),
object definition VARCHAR(MAX),
ObjectID INT,
CreationDate DATETIME,
ModifiedDate DATETIME,
EntryDate DATETIME DEFAULT(GETDATE())
)

INSERT INTO code archive
(OBJECT name,ObjectDescription,
ObjectType,ObjectDefinition,
ObjectID,CreationDate,modified date
)
SELECT so . name,so.type_desc,so.type,
OBJECT _ DEFINITION(OBJECT _ id),
so.object_id,so.create_date,so . modify _ date
FROM sys . objects so
WHERE so。[type]
IN(' C ',' D ',' P ',' FN ',' R ',' RF ',' TR ',' IF ',' TF ',' V ')

存档方案首先需要一个表来存储我们的定义代码。如上面的表脚本所示,我们将ObjectDefinition代码存储在表的Object Definition字段中,这是一个VARCHAR(MAX)数据类型的字段。VARCHAR(MAX)是SQL Server 2005中的一种新数据类型,最多可存储2GB的有效数据。这样,我们就不局限于文本数据类型或在单个数据页面上保存数据。这种数据类型在存储我们的对象时没有问题。

在上面的脚本中,关于插入CodeArchive表有一些值得注意的地方。首先,查询中包含的数据类型。OBJECT_DEFINITION函数中使用的这些对象类型将返回值。a列入清单。

下面列出了对象类型以供参考。其次,脚本调用方法。我一般使用SQL Server的计划任务调度方式来执行类似的脚本(可以根据工作需要重复运行脚本)。不管你用什么调度方式,总之你需要按照一定的规则运行脚本,这样你就可以在需要的时候恢复你的进程代码。

OBJECT_DEFINITION函数使用的对象类型列表:

t:检查约束条件。

d:默认。

P: tsql存储过程。

FN: TSQL数字用户定义函数。

r:规则。

RF:复制过滤过程。

Tr: tsql触发器。

If: tsql嵌入式函数。

Tf: tsql数值函数。

五:观点。

存档要求

希望这篇文章对你有帮助。如果你没有用过新的函数OBJECT_DEFINITION,你自己试试吧。然而,在您的开发环境中建立一些代码备份系统的重要性怎么强调都不为过。实际上,我有一个类似的备份系统用于我们的开发环境。

如果您可以建立一个类似于本文中提到的恢复系统,那么您可以在本地或远程备份您的过程代码。当你需要恢复代码的时候,你可以很方便的去做,而不用去搜索备份文件去找你想要恢复的代码。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 利用OBJECT

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情