在DB2联合数据库(基于远程服务器和昵称)中,我需要清理模型并从另一个数据库重新创建它.我需要删除除那些服务器和昵称之外的每个数据库对象.
我知道如何从SYSCAT模式中检索对象列表.现在我需要在每个上运行DROP语句.显然,依赖关系会受到阻碍.
蛮力方法是在循环中运行DROP直到所有成功,但是根据顺序(幸运与否),可能需要很长时间.
您是否知道有效订购DROP语句的方法,以便删除的总时间最短?
预计不会有完美的解决方案.一个相当聪明的解决方案就足够了.
谢谢
该查询能够根据语句所依赖的元素总数对语句进行排序。生成的顺序几乎没有任何故障,“强力”方法的第二遍仅包含少数对象(要删除数千个对象中的)。
问题是,速度太慢了……
编辑:查询中存在拼写错误,导致它返回或多或少正确的数据,但速度非常慢。
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(*)
Run Code Online (Sandbox Code Playgroud)