回答

收藏

获取SQL Server跨数据库依赖关系

技术问答 技术问答 206 人阅读 | 0 人回复 | 2023-09-13

SQL Server版本-2008 R2
$ l" K4 B! ^( l) M我正在评估DMS解决方案,目的是接管维护工作。原始解决方案具有一个中央数据库,该数据库具有与制造商有关的数据。每个经销商还有一个数据库,这意味着存在很多跨数据库依赖项。. v6 i! n( ?; e9 q4 c# I
问题:% h7 c& I( j7 X( E7 D
没有数据库文档) K+ M+ G( T4 m
没有代码注释  h) w7 c' ?. @6 L8 n- ^" t+ b* x2 |
很多堆/ {1 `6 Y9 I, U7 y* k
没有标准的对象命名约定5 L; b8 D/ G1 t
除了其他对象之外,中央数据库还具有460多个表和900多个SProcs
4 k* j* l5 Y; m每个经销商数据库除了其他对象外,还具有370多个表和2350多个SProcs, j  p+ Q5 _9 ?/ |0 k+ [) e7 K
: J9 _( A3 G$ Y5 c9 ^
第一步,我建议您彻底清理数据库,这对于了解对象依赖关系(包括跨数据库依赖关系)至关重要。我尝试使用Red
$ v/ _  N9 p" L. Z; L6 {8 @: zGate的解决方案,但输出的内容太多。我想要的只是数据库中没有任何依赖关系的对象列表-它们既不依赖于其他对象,也没有依赖于这些对象的任何对象。
: G* g) L& X8 d这是我用来获取依赖项列表的脚本:
0 {7 o4 K' j. ~SELECT  w: q  i/ v4 u5 k
DB_NAME() referencing_database_name,
# M8 K0 i1 D% ~OBJECT_NAME (referencing_id) referencing_entity_name,/ u, H0 T: |9 I- U+ a( M5 h
ISNULL(referenced_schema_name,'dbo') referenced_schema_name,& }8 W. q+ z" A: g
referenced_entity_name,1 f: E( O; s, f3 D7 D) B
ao.type_desc referenced_entity_type,
' k% c. q4 s) z  RISNULL(referenced_database_name,DB_NAME()) referenced_database_name
* S2 o0 G9 A5 b2 p# sFROM sys.sql_expression_dependencies sed
7 r" c% d' @$ w$ n0 lJOIN sys.all_objects ao
- l, u  r5 d" XON sed.referenced_entity_name = ao.name* d; _, y# l$ p4 ]
我将创建一个表-Dependencies-% J4 B/ A2 u1 ]. P5 w
将每个数据库的结果集插入到该表中。下一步,我还将创建另一个表AllObjects,该表将包含数据库中所有对象的列表。这是执行此操作的脚本:
8 V4 f- H, V2 u5 }8 P# \( ?9 B5 H, ?SELECT
$ ]9 C4 t# F8 }DB_NAME() DBName,
9 i' Y+ @6 d/ v* N/ D* R7 a, Cname,
' F; E  P1 T6 Z; A" _type_desc
1 ^8 t* W& r& RFROM sys.all_objects
  L& q( L# {0 `2 k* T9 ]3 iWHERE type_desc IN# A/ b# V1 Z0 m1 X; {
(2 Y) Q! ~& G0 @6 e1 V% w% r
'VIEW',
4 w8 r7 }! @( n% e. b'SQL_TABLE_VALUED_FUNCTION',
: G& I- r- r) Z" d. |'SQL_STORED_PROCEDURE',
5 |) F, P2 `" w# H'SQL_INLINE_TABLE_VALUED_FUNCTION',9 c. r! S' L1 `7 }
'USER_TABLE',
( H) V2 R) X0 e'SQL_SCALAR_FUNCTION'8 P6 X! Z* V' E. U5 J
)
) R4 i- ~% x: u' b现在,此表中没有出现在依赖关系表的referenced_entity_name列中的名称列表应提供我要查找的对象列表。9 F' z, T8 W7 F, f. S, r
SELECT
' j7 B0 y, j8 }: d4 w' m! r: nAO.DBName,
) k. i' J: e0 C8 pAO.name,/ q. F! U2 k( R+ C
AO.type_desc; W8 T8 q2 ?, p* J
FROM AllObjects AO! M1 Q# t# j, [$ w" ?
LEFT OUTER JOIN Dependencies D ON
( R8 ?) h, k. L7 q! Q3 zD.referenced_database_name = AO.DBName AND
/ m9 C- r9 c* d+ k# U: U! D  ZD.referenced_entity_name = AO.name AND7 I& Z4 @6 K$ f
D.referenced_entity_type = AO.type_desc
1 Y) h3 `, w' R+ G7 fWHERE
' D- P& K- {& |/ v, s9 w) ?D.referenced_database_name IS NULL AND
( h+ a7 r. }' T; C: z8 z. nD.referenced_entity_name IS NULL AND
! r1 P, P2 o0 P7 LD.referenced_entity_type IS NULL
6 R  o# e! B3 h4 x+ f/ b现在的问题:8 y! }/ a+ B' `8 n- K; W
[ol]在输出中似乎缺少一些对象依赖性。我想念什么?1 F: x4 v- y% @/ k
如何验证我的发现是正确的?, }1 R& K  C$ E6 P* m* g
我的意思是有另一种方式可以做到这一点,所以我可以比较结果并仔细检查吗?$ Y5 I" Y) x* m$ w9 N' W9 h
[/ol]
, |& a" b7 G- p! \3 e7 W! ~% {提前致谢,8 r/ y$ n' ~8 Z7 {9 e9 I
拉吉
% T  E" W" X, ?               
* l7 f: G: X/ W1 n4 T, Q  j2 Q解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则