在 SAP/Sybase ASE 的事务中运行 sp_rename 的解决方法错误 17260

问题描述

我正在尝试调用内部事务 (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 

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

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

有什么建议吗?

解决方法

ASE 并非真正设计用于回滚架构更改(如您所见)。

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

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

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

您提出的建议与我看到的开发人员在测试新“发布”时经常做的事情听起来并没有太大不同:

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

上述内容的变体:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...