0

我正在尝试调用sp_rename内部事务 ( BEGIN TRANSACTION),但它显​​示此错误消息:

Can't run sp_rename from within a transaction., Error 17260, Procedure sp_rename, Line 78

sp_rename代码检查任何未结交易::

/*
** Running sp_rename inside a transaction would endanger the
** recoverability of the transaction/database. Disallow it.
** Do the @@trancount check before initializing any local variables,
** because "select" statement itself will start a transaction
** if chained mode is on.
*/
if @@trancount > 0
begin
    /*
    ** 17260, "Can't run %1! from within a transaction."
    */
    raiserror 17260, "sp_rename"
    return (1)
end
else
begin
    set chained off
end 

我不明白为什么这些行为是危险的......

此外,我需要一种在事务中调用此存储过程然后回滚此操作的方法。

有什么建议么?

4

1 回答 1

0

ASE并不是真正为回滚架构更改而设计的(如您所见)。

如果您想要一种测试“框架功能”的方法,请考虑:

  • 创建一个新的test数据库
  • test针对这个数据库运行你的脚本
  • 完成后只需删除test数据库;另一种方法是运行一系列drop命令来“撤消”所有架构更改

新数据库最初是作为数据库的副本创建的,model因此您可以在数据库中安装一些基本组件,model但请记住model database(及其内容)在创建所有新数据库时使用(例如,所有临时数据库开始ASE),所以不要在model数据库中添加任何你不想出现在任何新数据库中的东西(在你的“框架功能”测试之外)。

您提出的建议听起来与我看到开发人员在测试新“版本”时经常做的没什么不同:

  • 加载产品数据库的副本
  • 对所述数据库应用发布包
  • 冲洗/重复直到发布包成功完成
  • 关键是从新加载(或创建)的数据库开始

上述变化:

  • 创建一个新的test数据库
  • 根据需要添加基础组件
  • test转储/保存数据库的副本
  • 运行你的测试
  • 当您想再次运行测试时,将该转储/保存的副本加载回test数据库,然后再次运行测试
  • 与加载 prod db 的副本基本相同,但在这种情况下,您加载基本testdb的副本
于 2021-02-01T23:05:09.743 回答