Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 仅通过在事务中运行存储过程就可以安全地测试存储过程吗?_Sql_Tsql_Testing_Transactions - Fatal编程技术网

Sql 仅通过在事务中运行存储过程就可以安全地测试存储过程吗?

Sql 仅通过在事务中运行存储过程就可以安全地测试存储过程吗?,sql,tsql,testing,transactions,Sql,Tsql,Testing,Transactions,我有一个名为MoveSomeItems的sp,它从FooDB的tableA中获取一些行。并将它们移动到Bar Db中的tableA 我想测试此sp是否确实移动了项目 在事务中运行此sp并选择行以查看它们是否被移动,或者我应该以不同的方式处理它,这是否足够?这取决于所有出错的影响是什么?如果目标表中的数据不正确,会有什么影响?会不会有人因此丧命,会不会惹恼他们,或者不太可能有人会注意到?修复起来容易吗 您所给出的方法存在相关风险。例如: 如果数据库非常繁忙,则可能会导致事务的过度锁定甚至死锁,从而

我有一个名为MoveSomeItems的sp,它从FooDB的tableA中获取一些行。并将它们移动到Bar Db中的tableA

我想测试此sp是否确实移动了项目


在事务中运行此sp并选择行以查看它们是否被移动,或者我应该以不同的方式处理它,这是否足够?

这取决于所有出错的影响是什么?如果目标表中的数据不正确,会有什么影响?会不会有人因此丧命,会不会惹恼他们,或者不太可能有人会注意到?修复起来容易吗

您所给出的方法存在相关风险。例如:

  • 如果数据库非常繁忙,则可能会导致事务的过度锁定甚至死锁,从而导致其他事务失败。将事务隔离级别设置为READ Uncommitted,将死锁优先级设置为LOW将有助于将此最小化,但不会完全消除它

  • 其他事务可能正在读未限制隔离模式下运行。在这种情况下,他们将临时看到插入的结果,直到发布回滚

  • 值得注意的是,如果您正在测试的过程在其中调用COMMIT事务,那么在调用回滚时可能无法得到您想要的结果

  • 您可能会推送数据库或日志以耗尽磁盘空间

  • 您可能会耗尽所有可用的CPU、内存、磁盘IO、网络或其他一些容量限制

  • 最后,我怀疑这不是一个完整的列表。我想说的是,它可能会以奇怪的方式出错

  • 如果您有一个完全备份的个人开发数据库,那么您甚至不需要该事务,只需在事件发生后进行恢复即可。不过,这笔交易可能会为您节省一些时间。这是最安全的解决方案

    如果您使用的是一个共享开发数据库,那么您的方法可能是可以接受的,但我仍然会做一个备份,以防万一,特别是如果您已经与团队关系不好的话

    如果您使用的是实时数据库,那么如果系统作为一个整体不是那么关键,并且在您修复时可以承受一些停机时间,那么它仍然是可以接受的。再做一次备份


    如果您正在查看的数据库正在控制一个安全关键的流程或其他一些任务关键功能,甚至不要去那里,您可能会失去责任保险的无索赔或更糟的情况。在本例中,最好将备份恢复到测试服务器上并在那里进行测试,从而创建我的第一个场景。但请注意,在这样做时,有很多问题需要考虑。例如,在测试系统中使用个人信息可能是非法的。此外,可能需要模拟其他系统的依赖关系,以确保您不会影响它们,例如,不要将测试系统连接到实时电子邮件服务器。

    如果我有一个复杂的存储过程,我希望能够测试和回滚,我会添加一个输入参数(始终作为最后一个参数),@debug,默认值为0(因此在prod上运行时无需指定)

    然后,我在末尾编写代码来测试参数是否为1,如果是,我运行任何select查询来显示我想要查看的数据,然后使用raiseerror将程序发送到catch块(在没有try catch块的情况下,决不写多个事务),并使其回滚


    通过这种方式,您可以轻松地在dev上检查结果并自动回滚

    存储过程的代码是什么?你最好分享它,让场景更清晰。如果他正在测试ona生产数据库,他会遇到更大的问题@麻烦的是pencilCake没有告诉我们什么是设置。尽管在实时数据库上进行测试存在风险,但如果系统不是任务关键型的,那么风险仍然可以接受。