问题描述
我正在尝试调用内部事务 (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 的副本