0

出于测试目的,我想为与其中一个根表中的特定记录相关联的所有表中的所有记录生成一个插入脚本。例如,我可能有一个“Participant”表,它在“Documents”表中具有任意数量的关联条目,而在“PrintRequests”表中又具有任意数量的关联条目,依此类推。我在数据库中有数百个这样的表。

有什么方法可以选择/脚本出与例如 ParticipantId = 1 关联的所有表中的所有记录?这样,对于有代表性的参与者,我可以提取所有表中的所有关联记录。

我的一个想法是恢复完整数据库的备份,修改所有外键约束以进行级联删除,然后删除所有非参与者 ID = 1 的内容,并让数据库负责删除与参与者无关的所有内容感兴趣,然后编写出剩余内容的整个数据库。

为此,我可能不得不删除并重新创建所有约束,我不确定如何在整个数据库中执行此操作。

或者,是否有任何其他工具可以做到这一点?例如,可以进行查询并仅迁移该查询的记录和关联的子记录的迁移工具?

4

2 回答 2

0

虽然完全有可能构建脚本来遍历所有主键和外键约束,并通过自由使用动态 SQL 来生成这些脚本,但这样做并非易事。我强烈怀疑使用像DataBee这样的产品来生成数据子集会更好地为您服务。

于 2013-06-11T02:30:38.440 回答
0

您可以编写脚本来创建动态 SQL 语句,但我认为这确实需要大量工作。我认为您会更快地找到具有“ParticipantId”列的所有表,其中包含类似这样的内容

select * from all_tab_columns where column_name = 'PARTICIPANTID'

然后做一些快速编辑/替换/其他类型的脚本操作来生成自己的删除语句。

关于约束。这是相似的。获得所有约束

SELECT owner, table_name, constraint_name
  FROM dba_constraints
 where table_name in (select table_name from all_tab_columns where column_name = 'PARTICIPANTID')

您可以使用打开和关闭约束

ALTER TABLE <table name> ENABLE/DISABLE constraint <constraint name>;

也许这你可以用一个循环来做。从这个页面

begin
  for i in 
 (select constraint_name, table_name from user_constraints where table_name in (select table_name from all_tab_columns where column_name = 'PARTICIPANTID')
 ) LOOP
   execute immediate 'alter table '||i.table_name||' disable constraint '||i.constraint_name||'';
  end loop;
end;

我不确定您的级联删除操作,但以上内容让您大致了解了删除操作的样子:

begin
  for i in 
 (select constraint_name, table_name from user_constraints where table_name in (select table_name from all_tab_columns where column_name = 'PARTICIPANTID')
 ) LOOP
   execute immediate 'delete from '||i.table_name||' where participantid = ''1'' ';
  end loop;
end;

希望能帮助到你。

于 2013-06-11T19:39:18.943 回答