Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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_Database Migration_Database Testing - Fatal编程技术网

Sql 完成数据库模式转换-如何测试重写的查询?

Sql 完成数据库模式转换-如何测试重写的查询?,sql,database-migration,database-testing,Sql,Database Migration,Database Testing,我们的数据库设计得很糟糕,我们继承了它。我已经将模式修改为可用和可维护的模式。相当多的表和列被删除,许多列被移动,大多数表和列被重命名。某些数据类型也已更改 我已经从我们的网络应用程序中提取了所有查询,并开始重写它们。我们认为,我们的DBA能够将旧数据迁移到新模式。为了确保这一点,我们需要通过比较新旧结果来测试每个查询 我们如何测试这种大规模迁移?我需要能够指定参数,并将旧表/列映射到新表/列。有数百个查询,这是一项艰巨的任务。我可以自己写一些东西,但我已经对时间有很多要求,所以最好使用现有的工

我们的数据库设计得很糟糕,我们继承了它。我已经将模式修改为可用和可维护的模式。相当多的表和列被删除,许多列被移动,大多数表和列被重命名。某些数据类型也已更改

我已经从我们的网络应用程序中提取了所有查询,并开始重写它们。我们认为,我们的DBA能够将旧数据迁移到新模式。为了确保这一点,我们需要通过比较新旧结果来测试每个查询

我们如何测试这种大规模迁移?我需要能够指定参数,并将旧表/列映射到新表/列。有数百个查询,这是一项艰巨的任务。我可以自己写一些东西,但我已经对时间有很多要求,所以最好使用现有的工具


谢谢

有时简单的解决方案就可以解决问题

如果只是选择,您可以将新的和旧的查询放在文本文件中,使用脚本运行它们并区分输出

cd newqueries
for queryfile in *; do
    psql -f $queryfile migrateddb > /tmp/newresult
    psql -f ../oldqueries/$queryfile olddb > /tmp/oldresult

    if ! diff /tmp/oldresult /tmp/newresult; then
        echo "Difference in $queryfile"
        exit 1
    fi
done

或者您可以编写一个基于单元测试的结果比较

这就是我的方法:

恢复具有数据的测试数据库,运行所有已知查询。 恢复另一个测试数据库,运行所有新查询。 创建连接每个数据库表的sql脚本并比较结果。根据供应商的不同,这可以通过信息模式或其他系统表来完成

插入临时表 从db1..name中选择select count1 ,从db2..name中选择count1 ,从db1.name t1中选择count1,然后在t1.col1=t2.col1和t1.colx=t2.colx上连接db2.name t2 ,表名


然后,您可以运行查询中包含表名的查询。它会给你一个起点,让你知道该去哪里看。

我不得不这么做。。。这很容易,因为我重写了整个应用程序

许多查询听起来像是选择、插入、更新等基本操作还没有在函数中抽象出来——也许这有助于在适应之前清理混乱

现在进行测试:

您需要一个测试脚本,它将 a运行所有查询 b存储所有选择的输出以进行比较

备份测试数据库@state 0,清除常规查询日志

使用所有的删除、选择和更新功能,在应用程序周围玩游戏

复制粘贴该日志,进行每一次选择,并在其前面创建一个表TESTERABLE_xyz,当然也可以选择TESTERABLE_xyz。。取决于可用的语法

迁移脚本后,在两个数据库上运行test db@state 0和test db@state 0

比较

如果你能确保你使用了每个应用程序中的每一项功能,这应该可以做到


GL-没有什么比让现有的东西更好了

不幸的是,我们还有插入、更新和删除。上次我只是更改了数据库并手动完成了所有查询。搜索和替换帮助。我试着测试应用程序,但直到后来才发现一些迁移错误。jkj,这可能也是我们的未来,尽管它令人沮丧。我们有一个测试人员,但他不称职,几个月后就要退休了,所以现在真正的责任落在了开发人员身上。谢谢顺便说一句,我试着在评论中提到你,但它一直被过滤掉-一定是你的名字太短了?我知道了为什么你的名字被剥夺了…这是故意的:至少我今天学到了一些东西!是 啊对不起,我帮不了你。希望其他人能提供合适的工具。顺便问一下,这个网络应用程序是哪种语言的?我最后就是这么做的。我编写了一个应用程序来测试查询前后,并比较结果。查询、新旧映射和断言都是用XML指定的。