none
最近一个需求,验证数据库对象的正确性? RRS feed

  • 问题

  •             需求:把一个名为A的库,复制为B,方法有多种,这次,选用的方法是:导入导出,在SQL SERVER之间复制对象和数据。然而,A库已经创建了有5年之久,当中的一些数据库对象存在一些错误,当时的开发设计人员并没有处理,比如表中的字段被删除,视图,函数,存储过程又没有修改,又重新建了这些对象,被抛弃的旧脚本又没删除,所以呢,在复制的过程中,不断报错,比如,字段名无效啊,字段名不明确啊,

               由于数据库文件有1G多,所以每次耗费时间长,报错之后去找这些对象,然后修复,这个过程,我发现好像没有尽头,因为他不是一次性报错,导入一次之后,报错,修复,报错,修复,...就是这个循环,搞了3次之后,我觉得这样不行了,必须要通过写脚本验证,找到当前库中所有有问题的视图,函数,存储过程,

    不知可有这样的脚本返回所有有问题的数据库对象,这样可以批量修改到位。

    2013年8月23日 2:36

答案

  • Try find them with sp_depends and query sys.sql_dependencies. If you need to copy whole db regularly, better to do backup/restore. Much quicker and easier.
    2013年8月23日 2:59
  • 自己写个小程序很容易做到嘛, 分成两步做, 第一步是同步结构, 这个步骤就是创建表, 视图, 存储过程什么的, 出错的对象记录下来, 处理完一次之后, 对于出错的对象再次重建(避免有依赖的对象没有先创建而导致的正常错误), 这个重试的步骤可以进行多次, 比如10次, 最后把还是会出错的对象记录下来人工再判断一次, 这个时候一般都是比较少的了

    结构师叔成功后, 数据同步就很容易了

    2013年8月23日 12:37

全部回复

  • Try find them with sp_depends and query sys.sql_dependencies. If you need to copy whole db regularly, better to do backup/restore. Much quicker and easier.
    2013年8月23日 2:59
  • 借用前端工具(VB、DELPHI、C#)等,把这些对象遍历执行一次,出错的记录下来即可

    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com

    2013年8月23日 3:05
  • 自己写个小程序很容易做到嘛, 分成两步做, 第一步是同步结构, 这个步骤就是创建表, 视图, 存储过程什么的, 出错的对象记录下来, 处理完一次之后, 对于出错的对象再次重建(避免有依赖的对象没有先创建而导致的正常错误), 这个重试的步骤可以进行多次, 比如10次, 最后把还是会出错的对象记录下来人工再判断一次, 这个时候一般都是比较少的了

    结构师叔成功后, 数据同步就很容易了

    2013年8月23日 12:37
  • 又报了两个视图错误,对象不存在,可我去A库中查询视图,都没有问题,查看所有者为dbo,检查视图中引用的表的所有者都是dbo,

    只是有一点,在实例上右键A库,看到是所有者是server\administrator  而B的所有者是 sa,

    难道说是架构问题?在连接源时,设置了用windows登陆也不行。

    原本想用一用这个功能的,没想到这么曲折复杂,还不如copy--还原来的快。



    2013年8月24日 3:23
  • 通过执行的方式去验证不太好, 比如存储过程, 有的是有参数, 这个很难验证, 而有的涉及数据操作(比如插入\更新什么的), 这种执行就会影响到数据

    所以在原始服务器上做执行的验证是有风险的

    2013年8月24日 3:26
  • 又报了两个视图错误,对象不存在,可我去A库中查询视图,都没有问题,查看所有者为dbo,检查视图中引用的表的所有者都是dbo,

    只是有一点,在实例上右键A库,看到是所有者是server\administrator  而B的所有者是 sa,

    难道说是架构问题?在连接源时,设置了用windows登陆也不行。

    原本想用一用这个功能的,没想到这么曲折复杂,还不如copy--还原来的快。



    Should be ok if server\administrator has dbo rights in related db, but you can change db owner to sa anyway.
    2013年8月24日 19:55