出于测试目的,我想为与其中一个根表中的特定记录关联的所有表中的所有记录生成插入脚本。例如,我可能有一个“Participant”表,它在“Documents”表中有任意数量的相关条目,而这些条目又在“PrintRequests”表中有任意数量的相关条目,依此类推。我在数据库中有数百个这样的表。
有没有办法选择/编写与例如ParticipantId = 1相关联的所有表中的所有记录?这样,对于代表参与者,我可以提取所有表中的所有相关记录。
我的一个想法是恢复完整数据库的备份,修改所有外键约束以进行级联删除,然后删除所有未参与的事件= 1并让数据库负责删除所有不相关的内容对感兴趣的参与者,然后编写剩下的整个数据库。
为此,我可能必须删除并重新创建所有约束,我不确定如何在整个数据库中执行。
或者,是否还有其他工具可以做到这一点?例如,迁移工具可以进行查询并仅迁移该查询的记录和关联子记录吗?
答案 0 :(得分:0)
虽然完全可以构建脚本来遍历所有主键和外键约束,并且通过自由使用动态SQL生成这些脚本,但这样做将是一件非常重要的事情。我强烈怀疑使用像DataBee这样的产品来生成数据子集会更好。
答案 1 :(得分: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>;
也许这可以用循环来做。借用这个page
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;
希望它有所帮助。