我有一个名为MoveSomeItems的sp,它从Foo Db的tableA中获取一些行。并将它们移动到Bar Db中的tableA。
我想测试这个sp是否确实会移动项目。
是否足以在事务中运行此sp并选择行以查看它们是否被移动或者我应该以不同的方式处理它?</ p>
答案 0 :(得分:2)
这取决于它出错的影响是什么?目标表中的数据不正确会产生什么影响,它会杀死某人,只是惹恼他们,还是不太可能有人注意到?修理会很容易吗?
您所采用的方法存在风险。例如:
如果数据库非常繁忙,则可能导致过度锁定甚至导致死锁,因为事务可能导致其他事务失败。将TRANSACTION ISOLATION LEVEL设置为READ UNCOMITTED并将DEADLOCK PRIORITY设置为LOW将有助于最大限度地减少这种情况,但不能完全消除它。
其他事务可能在READ UNCOMMITED隔离模式下运行。在这种情况下,他们将暂时看到插入的结果,直到发布回滚为止。
值得注意的是,如果您正在测试的程序在其中调用COMMIT TRANSACTION,则在调用ROLLBACK时可能无法获得所需的结果。
您可能会推送数据库或日志以耗尽磁盘空间。
您可能会耗尽所有可用的CPU,内存,磁盘IO,网络或其他容量限制。
最后,我怀疑这不是一个完整的清单。我想说的是,它可能会以奇怪的方式出错。
如果您拥有完全备份的个人开发数据库,那么您甚至不需要该事务,只需在事件发生后进行恢复即可。交易可能会为您节省一些时间。这是最安全的解决方案。
如果您使用的是共享开发数据库,那么您的方法可能已经足够可接受了,但我仍然会进行备份以防万一,特别是如果您与团队的关系不好。
如果您使用的是实时数据库,那么如果整个系统不是那么关键并且在您修复时可以维持一些停机时间,那么它仍然可以接受。再做一次备份。
如果您正在查看的数据库正在控制一个对安全至关重要的过程或其他一些关键任务功能,请不要去那里,否则您可能会失去对您的责任保险的索赔或更糟。在这种情况下,最好将备份恢复到测试服务器上并在那里进行测试,从而创建我的第一个场景。但请注意,执行此操作时必须考虑许多问题。例如,在测试系统中使用个人信息可能是非法的。此外,可能存在需要模拟的其他系统的依赖关系,以确保您不会影响它们,例如,不要将测试系统连接到实时电子邮件服务器。
答案 1 :(得分:0)
如果我有一个复杂的存储过程,我希望能够测试和回滚,我添加一个输入参数(总是作为最后一个参数),@ debug,默认值为0(所以你不需要指定当你在prod上运行时。)
然后我在末尾编写代码来测试参数是否为1,如果是,我运行任何选择查询来查看我想要查看的数据,然后使用raiseerror将程序发送到catch块(从不写多个事务没有尝试catch块)并让它回滚。
通过这种方式,您可以轻松地在dev上检查结果并自动回滚。