从表中的另一个DB插入数据

时间:2010-10-20 13:12:03

标签: database insert db2

我在这里有一些问题。让我解释一下。

所以我完成了这个项目的迁移,我决定运行测试套件以确保逻辑仍然按预期工作。不幸的是,它没有...但这不是问题。

在套件的最后,有一个很好的脚本,可以在我们的开发数据库的5个表的数据上执行删除。如果还有一个实际填充数据库的脚本,那就没问题了。

好的一面是我们在生产环境中仍然有大量的数据,所以我正在寻找一种方法和/或可能的工具来提取生产中这5个特定表的数据并将它们插入dev环境中。这些表之间有各种主键和外键,可能是自动增量字段(以及大量数据),这就是我不想手动操作的原因。

我们的数据库是db2 v9,如果它有任何区别。我也在使用SQuirreL,可能有一个插件,但我还没有找到。

由于

4 个答案:

答案 0 :(得分:0)

这是一个黑暗中的镜头,因为我从未使用过db2,但从以前的经验来看,我的直觉不可思议地说“尝试csv”。我愿意打赌我的祖母你可以在你的软件中导入/导出csv文件(为什么我只是从Seinfeld开始想起George?) 这也应该保持FK和ID完好无损。如果需要,您可能必须将自动增量值重置为适当的值。当然,这将在导入后完成

另外,csv文件是明文的,如果任何怪癖显示出来,很容易被操纵。

祝你好运!

答案 1 :(得分:0)

基于Arve的回答,DB2有一个用于导入CSV文件的内置命令:

IMPORT FROM 'my_csv_file.csv'
OF del
INSERT INTO my_table

如果列不是默认顺序,您可以指定列的列表:

IMPORT FROM 'my_csv_file.csv'
OF del
-- 1st, 2nd, 3rd column in CSV
METHOD P(1, 2, 3)
INSERT INTO my_table
(foo_col, bar_col, baz_col)

如果它不是以逗号分隔的,您还可以指定不同的分隔符。例如,以下内容指定由|:

分隔的文件
IMPORT FROM 'my_csv_file.csv'
OF del
MODIFIED BY COLDEL|
-- 1st, 2nd, 3rd column in CSV
METHOD P(1, 2, 3)
INSERT INTO my_table
(foo_col, bar_col, baz_col)

还有很多选择。官方文档有点毛茸茸:

答案 2 :(得分:0)

您是否可以访问模拟器?模拟器中有一个功能,允许您直接将CSV导入表格。

答案 3 :(得分:0)

谢。

就个人而言,我不知道任何可以将生产数据的较小子集“捕获”到测试套件中的自动化工具,但在我的日子里,我能够使用QMF和一些通用查询来做到这一点。它确实需要对表结构,父子依赖关系,引用完整性和其他事项进行前向规划/分析。

确实需要做一些初步的工作,但是一旦完成,我就能够使用并重新使用这些工具来提取生产数据的几个不同视图以用于我的测试目的。 如果这对您有吸引力,请继续阅读。

在高级视图中,您可以这样做:

  1. 确定关键列名称。
  2. 为他们创建“密钥”表。
  3. 编写几个查询以查找测试条件并填充keys_table。
  4. 一旦您对keys_table具有令人满意的键子集感到满意,那么您可以使用创建的工具为您删除数据。
  5. 编写一个将keys_table与生产表连接的通用查询,并将数据导出为平面文件。
  6. 写一个proc来自动为你做所有的提取/人群。
  7. 如果您可以访问QMF(并且您可能在DB2商店中进行过),那么您可以执行以下操作:

    1. 确定您需要的所有表格。
    2. 确定这些表的主索引。
    3. 确定这些表的任何参照完整性要求。
    4. 确定所有表之间的父 - 子关系。
    5. 对于最低级子表(通常是索引最多的子表),请记下用于标识唯一键的所有列。
    6. 通过上述信息,您可以创建一个通用查询来去除#5的较小的生产数据子部分。换句话说,您可以创建一系列特定查询并填充您创建的小型Key表。

      在QMF中,您可以创建如下通用查询:

      select t.*
        from &t_tbl   t
           , &k_tbl   k
       where &cond
       order by 1, 2, 3
      

      在proc中,您只需传递tablename,keys和condtions变量。捕获数据后,将数据导出为某个文件名。

      你可以创建一个EXPORT_TABLE proc看起来像这样:

      run query1 (&&t_tbl = students_table , &&k_tbl = my_test_keys ,
      + &&cond = (t.stud_id = k.stud_id and t.course_id = k.course_id)
      export data to studenttable
      
      run query1 (&&t_tbl = course_table   , &&k_tbl = my_test_keys ,
      + &&cond = (t.cour_id = k.cour_id 
      + (and t.cour_dt between 2009-01-01 and 2010-02-02)
      export data to coursetable
      
      .....
      

      这可以根据需要捕获所有数据。

      然后,您可以创建一个IMPORT_TEST proc来执行相反的操作:

      import data from studenttable
      save data as student_table (replace = yes
      
      import data from coursetable
      save data as course_table (replace = yes
      
      ....
      

      创建可能需要一段时间,但至少您会有一个可重复使用的工具来提取数据。

      希望有所帮助。