是否有一种从数据库中删除每个视图/函数/表/ sp的有效方法?

时间:2011-05-16 08:44:33

标签: db2-luw

在DB2联合数据库(基于远程服务器和昵称)中,我需要清理模型并从另一个数据库重新创建它。我需要删除除那些服务器和昵称之外的每个数据库对象。

我知道如何从SYSCAT模式中检索对象列表。现在我需要在每个上运行DROP语句。显然,依赖关系会阻碍。

蛮力方法是在循环中运行DROP直到所有成功,但根据顺序(幸运与否),可能需要很长时间。

您是否知道有效订购DROP语句的方法,以便删除的总时间最短?

预计不会有完美的解决方案。一个相当聪明的解决方案就足够了。

谢谢

3 个答案:

答案 0 :(得分:2)

您可能希望查看每个表的引用(您可以根据http://www.ibm.com/developerworks/data/library/techarticle/dm-0401melnyk/使用syscat.references)并自己构建一个依赖关系树(应该是可行的,例如使用临时表,如果你只限于sql)。然后你可以从那棵树的底部掉下来。

所以,基本上,我对你的问题的回答是,为了快速完成,只需在删除之前根据它们之间的引用对表进行排序。由于不应存在任何依赖循环,因此您应始终能够选择一个未引用的表。放下它并重复。

您可能还希望看到这个(类似的?)问题:DB2 cascade delete command?,以防您想先删除数据。

如果我在某些方面错了,请更正。这个答案基于我对其他数据库的经验,因此它可能不完全适合DB2。虽然它应该工作;)

答案 1 :(得分:1)

此查询能够根据语句所依赖的元素总数对语句进行排序。生成的顺序几乎没有故障,“暴力”方法的第二遍只包含少数几个对象(要删除的数千个对象)。

问题,这很慢......

编辑:查询中有一个拼写错误,使得它返回或多或少的正确数据但非常缓慢。

WITH FIRST_LEVEL_DEPENDENCIES (BSCHEMA, BNAME, DTYPE, DSCHEMA, DNAME) AS
(
  SELECT T1.TABSCHEMA AS BSCHEMA, T1.TABNAME AS BNAME, T1.BTYPE, T1.BSCHEMA, T1.BNAME
    FROM SYSCAT.TABDEP T1
   WHERE T1.TABSCHEMA NOT LIKE 'SYS%'
     AND T1.BTYPE <> 'N'
   UNION ALL
  SELECT T1.ROUTINESCHEMA AS BSCHEMA, T1.SPECIFICNAME AS BNAME, T1.BTYPE, T1.BSCHEMA, T1.BNAME
    FROM SYSCAT.ROUTINEDEP T1
   WHERE T1.ROUTINESCHEMA NOT LIKE 'SYS%'
     AND T1.BTYPE <> 'N'
   UNION ALL
  SELECT T1.TABSCHEMA AS BSCHEMA, T1.TABNAME AS BNAME, 'T', T1.REFTABSCHEMA, T1.REFTABNAME
    FROM SYSCAT.REFERENCES T1
   WHERE T1.TABSCHEMA NOT LIKE 'SYS%'
),
RECURSIVE_DEPENDENCIES (LEVEL, BSCHEMA, BNAME, DTYPE, DSCHEMA, DNAME) AS
(
   SELECT 1, U.BSCHEMA, U.BNAME, U.DTYPE, U.DSCHEMA, U.DNAME
     FROM FIRST_LEVEL_DEPENDENCIES AS U
    UNION ALL
   SELECT LEVEL + 1, REC.BSCHEMA, REC.BNAME, U.DTYPE, U.DSCHEMA, U.DNAME
     FROM RECURSIVE_DEPENDENCIES REC,
          FIRST_LEVEL_DEPENDENCIES U
    WHERE LEVEL < 6
      AND U.BSCHEMA = REC.DSCHEMA
      AND U.BNAME = REC.DNAME
)
SELECT BSCHEMA, BNAME, COUNT(*)
  FROM RECURSIVE_DEPENDENCIES
 GROUP BY BSCHEMA, BNAME
 ORDER BY COUNT(*)

答案 2 :(得分:0)

我没有针对DB2的DIRECT解决方案,但我可以建议:

A)在Microsoft SQL Server 2008中,它解决了DELETE(而非DROP)关于外键顺序的表的问题,在此链接:

Generate Delete Statement From Foreign Key Relationships in SQL 2008?

B)在Oracle PL / SQL中,它已经解决了在这个链接上删除(不是DROP)尊重外键顺序的问题:

How to generate DELETE statements in PL/SQL, based on the tables FK relations?

我认为您可以安排这两个脚本中的一个,以获得DB2的解决方案。

你同意与否?

编辑1:在此链接:

http://bytes.com/topic/db2/answers/183189-how-delete-tables-completely

我可以读到:

罗伯特, 为什么不简单

LOAD FROM /dev/null of del replace into tablename NONRECOVERABLE

- 这会很快截断表格,不确定是否 它默认回收空间更新统计数据? 这具有您不必的额外优势 以正确的RI顺序执行删除。 (虽然你之后必须做SET INTEGRITY) 行

编辑2:请参阅以下内容:

Dropping a schema and all of its contents in DB2 8.x