您当前的位置: AG亚游集团 > 数据库教程 > DB2教程 > 利用OBJECT_DEFINITION函数来代码存档

利用OBJECT_DEFINITION函数来代码存档

作者:guanchaofeng 来源:不详 发布时间: 2009-09-30 08:38 点击: 次
作为一名数据库管理员,在进行代码迁移之前,我总是尽力给提交于开发环境的代码一个完整的面貌。但是,不得不承认,我不能保证不发生任何可能破坏开发系统的事情。当这种情况发生时,可能的补救措施是恢复到目标代码的前一版本,目标代码可能是存储过程、函

AG亚游集团,  不幸的是,在Symbian中,除了诺基亚全力以赴积极推进之外,别的厂商不同程度都存在“脚踏两只船”的想法。最夸张的是韩国三星,它脚踏了三条船:Symbian、LINUX和Windows Mobile,而诺基亚的亲密战友——西门子与索爱同时也和微软保持着“亲密”的接触。笔者分析,Symbian如此松散的根本原因在于,这些公司除了拥有共同的敌人“微软”之外,他们之间的竞争从来都没有停止过,表现最激烈的就是摩托罗拉与诺基亚的“冠军”之争。

  在华为换标之际,华为自有的CDMA手机广告也纷纷投向国内主流媒体,一向低调的华为在上加大投入,似意味着华为正改变过去低调务实的作风,期望在电信和终端上都有所作为。女的学什么手艺有前途  固话运营商获准推出多种固定电话资费套餐及按日收取服务费,这意味着原来单调的固话收费模式被打破,有利于固网运营商面对移动运营商采取更灵活的竞争方式。而国家有关部门在此刻批准这一方案,显然是为了缓解月租费问题引发的社会矛盾。

利用OBJECT_DEFINITION函数来代码存档

  作为一名数据库管理员,在进行代码迁移之前,我总是尽力给提交于开发环境的代码一个完整的面貌。但是,不得不承认,我不能保证不发生任何可能破坏开发系统的事情。当这种情况发生时,可能的补救措施是恢复到目标代码的前一版本,目标代码可能是存储过程、函数等等。
  
  如果可能的话,你不想做但又不得不做的事情是从备份的数据库中恢复代码,但是如果备份的数据库存储在磁带上,这种方法可能因花费太长的时间而不能使用。如果数据库庞大的话,要花费相当长的时间来恢复,更不用说你还要找一台足够大的服务器来存储备份的文件。不过,还有更好的方法。
  
  很久前我找到的一种解决方法是备份数据库代码到一个独立的数据表中,这样如果在我们开发的代码发生错误时,就可以从数据表恢复出错的过程或函数。这种方法确实节省了大量的时间。
  
  在SQLServer2000中,这种方法可以这样实现:对特别的数据库做一个完整的syscomments数据表备份,然后将备份的数据表放入档案表中。我通常保存最近两周的重要过程代码。利用这种技术唯一的麻烦是:如果代码对象十分大,那么可能要对代码进行重构。因为如果代码过大将会被存储到syscomments表中不同的行中,有时这可能是件令人感到头痛的事。
  
  SQLServer2005新增加的众多功能之一是可以利用一个系统函数返回某个对象的完整代码,这个系统函数将使得存档你的过程代码变得十分简单。
  
  OBJECT_DEFINITION
  
  SQLServer2005新增的系统函数OBJECT_DEFINITION根据提供给该函数的对象ID返回对象的TSQL代码。为了更好的理解这个函数的工作过程,让我举个例子。首先我们创建一个用户自定义函数,该函数的脚本如下:
  
  CREATEFUNCTIONudf_Multiply(@Val1INT,@Val2INT)RETURNSINTASBEGINDECLARE@RetValINTSET@RetVal=(@Val1*@Val2)RETURN(@RetVal)END
  
  这是一个很简单的小函数。因为它仅仅处理两个参数,但是已足够为我们演示OBJECT_DEFINITION函数是如何工作。测试该系统函数的脚本如下:
  
  DECLARE@ObjectIDINTSET@ObjectID=OBJECT_ID('udf_Multiply')SELECTOBJECT_DEFINITION(@ObjectID)
  
  在这个例子中,我们实际上用了两个系统函数。首先,我们要得到前面创建的udf_Multiply函数的OBJECT_ID,在SQLServer数据库引擎中,OBJECT_ID是一个对象的系统标识符。然后我们将这个ID传给系统函数OBJECT_DEFINITION,这一系统函数将返回提供给它的ID对象的代码,即返回值是我们以前为udf_Multiply函数写的TSQL代码。
  
  既然我们对OBJECT_DEFINITION函数的工作原理有了很好的了解,接下来让我们看看如何利用这个函数来存档我们数据库中的过程代码。首先,运行列表A中的脚本程序在测试数据库中创建20个存储过程。
  
  DECLARE@iINTSET@i=1WHILE@i<=20BEGINEXECUTE('IFOBJECT_ID(''usp_TestProcedure'+@i+''')>0DROPPROCEDUREusp_TestProcedure'+@i+'')EXECUTE('CREATEPROCEDUREusp_TestProcedure'+@i+'ASBEGINPRINT''Thenameofthisprocedureis''+CAST(OBJECT_NAME(@@PROCID)ASVARCHAR(20))END')SET@i=@i+1END
  
  你将看到在上面的脚本中,我们使用了动态SQL语句。当创建动态SQl语句时,我习惯用系统存储过程sp_executesql,因为该过程能够很好地在系统中缓存SQL语句。但是,在我们这一例子中,EXECUTE命令就能很好地完成任务。
  
  现在我们的数据库中已经有了一些对象,我们可以创建用来存档数据库中存储过程需要的对象和代码。在列表B中的脚本可以为我们完成这项工作。
  
  IFOBJECT_ID('CodeArchive','U')>0DROPTABLECodeArchiveCREATETABLECodeArchive(ArchiveIDINTIDENTITY(1,1)PRIMARYKEY,ObjectNameSYSNAME,ObjectDescriptionVARCHAR(60),ObjectTypeCHAR(2),ObjectDefinitionVARCHAR(MAX),ObjectIDINT,CreationDateDATETIME,ModifiedDateDATETIME,EntryDateDATETIMEDEFAULT(GETDATE()))INSERTINTOCodeArchive(ObjectName,ObjectDescription,ObjectType,ObjectDefinition,ObjectID,CreationDate,ModifiedDate)SELECTso.name,so.type_desc,so.type,OBJECT_DEFINITION(object_id),so.object_id,so.create_date,so.modify_dateFROMsys.objectssoWHEREso.[type]IN('C','D','P','FN','R','RF','TR','IF','TF','V')
  
  存档方案首先要求有一个用来存储我们定义代码的表格,和在上面的表格脚本中看到的一样,我们将对象定义代码存入表格的ObjectDefinition域,这是一个VARCHAR(MAX)数据类型的域。VARCHAR(MAX)是SQLServer2005新增的一种数据类型,它可以存储高达2GB的有效数据。这样我们就不在局限于文本数据类型或者将我们的数据保存在一个单个数据页上。这种数据类型存储我们的对象毫无问题。
  
  在上面的脚本中关于插入CodeArchive表有几点值得注意的地方。首先是在查询中包含的数据类型,这些用于OBJECT_DEFINITION函数的对象类型将返回一个值。A列表中包含的。
  
  对象类型列在下面供参考。其次是脚本调用的方法,我通常是利用SQLServer的预定任务调度法执行类似的脚本(你可以按照工作要求反复的运行脚本)。无论用什么调度方法,总之你需要按照一定的规则运行脚本,这样才能在需要时恢复你的过程代码。
  
  OBJECT_DEFINITION函数用到的对象类型列表:
  
  T:检查约束。
  
  D:默认。
  
  P:TSQL存储过程。
  
  FN:TSQL数值用户自定义函数。
  
  R:规则。
  
  RF:复制过滤过程。
  
  TR:TSQL触发器。
  
  IF:TSQL内嵌函数。
  
  TF:TSQL数值函数。
  
  V:视图。
  
  存档需求
  
  希望本文对你有所帮助,如果你还没有使用过OBJECT_DEFINITION这个新函数,你最好亲自试一下。然而,在你的开发环境中设置一些代码备份系统,这样做的重要性在怎么强调也不为过。实际上,我拥有一个类似的备份系统用于我们的开发环境。
  
  如果你能设置一个类似本文提到的恢复系统,就可以进行本地或远程备份你的过程代码,当需要恢复代码时,你将会很方便地进行,而不再用查找备份文件已找到所要恢复的代码。

本文"利用OBJECT_DEFINITION函数来代码存档"由远航站长收集整理而来,仅供大家学习与参考使用。更多AG亚游集团尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 广告合作 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(AG亚游集团). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类AG亚游集团.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4
3月14日四大证券报头版头条内容精华摘要 城市英雄哈德森降临 与球迷狂欢夺冠庆典 三个外国人在杭州的故事:拌面每天必吃 实现足球梦 古巴外交部:初步核实坠毁客机上未发现有中国公民 爵士4年1.02亿续约法国铁塔 保留核心冲季后赛 火箭用最勇士的套路杀人!18中13一波对手哭了 曹德旺说中国减税太慢 财政部官员当场回应 开盘:通胀数据温和 美股周四高开 波兰匈牙利总理:欧盟难民配额制度有损国家主权 AC米兰官方宣布解雇体育总监 为阿森纳CEO腾地? 特朗普捅马蜂窝:欧洲声讨中国反对 美国人也怒了 美媒曝光尴尬细节:特朗普曾令蒂勒森在国宴吃沙拉
这一货币本周暴跌10%!但“苦日子”还没有结束? 整整一年的努力就这么毁了 印度强风暴雨造严重损失 阿联酋将向外籍投资和专业人才发放10年长居签证 许晨妍完成最后一击 江苏女篮69-62击败上海 张业遂:中国既不输入外国模式 也不输出中国模式 内马尔要回巴萨?晒同梅西合影:将有大事发生! 新京报:“共享护士”有违规执业的“死穴” 建设“美丽中国” 这座城市就是最好的样本 欧盟拒绝美零关税恩赐 但德国心怀异念 应对美国制裁 伊朗拟激励私人投资者接管国家项目 广州下赛季不再有3外援 本土球员能顶得上来吗 贸易保护主义 将使美国汽车业雪上加霜
美联储威廉姆斯:2018年加息3-4次是“正确方向” 新兴市场资金外流不具备持续性 数百吨韩国旧衣在浙被截 你淘的名牌货或暗藏病菌 中国高铁“高歌猛进” 加州高铁为何落后那么远? 骑士主帅赛后采访遭詹皇打脸 两人已失去信任? 心疼!巴萨小球迷见证惨案 崩溃痛哭满脸是泪 彭博社:微软将推400美元Surface 重返低端平板… 俄媒:阿拉伯联军对也门首都周边实施6次打击 詹姆斯和科比俩人差距在哪?全NBA他最有发言权 手机挂机软件一小时5元 如何创业白手起家 白手起家创业做什么 一万元猪舍建设图片 AG亚游集团