【发布时间】:2011-06-23 08:55:11
【问题描述】:
有没有人知道如何/是否可以查看依赖于 Sql Server 2008 中链接服务器的所有表/视图/存储过程。基本上就好像链接服务器可以访问上下文菜单“查看依赖项”?
非常感谢任何帮助。
谢谢
【问题讨论】:
标签: sql-server dependencies linked-server
有没有人知道如何/是否可以查看依赖于 Sql Server 2008 中链接服务器的所有表/视图/存储过程。基本上就好像链接服务器可以访问上下文菜单“查看依赖项”?
非常感谢任何帮助。
谢谢
【问题讨论】:
标签: sql-server dependencies linked-server
搜索一下
SELECT OBJECT_NAME(object_id), *
FROM sys.sql_modules
WHERE definition LIKE '%myLinkedServer%'
或者使用 免费 Red gate SQL Search 来使用 GUI 做同样的事情
没有跟踪服务器级链接服务器对象和数据库级对象之间依赖关系的表或功能
注意:INFORMATION_SCHEMA 视图和旧系统会截断定义,因此对于定义搜索不可靠。
【讨论】:
按照@Mitch Wheat 的建议,这里有一些 sql 可以为服务器上的所有数据库运行@gbn 的答案。也许这对某人来说会有点时间。
USE Master;
GO
IF OBJECT_ID('tempdb..#Deps') IS NOT NULL
BEGIN
DROP TABLE #Deps
END
CREATE TABLE #Deps
(
[ServerName] [VARCHAR](500) NOT NULL,
[DatabaseName] [VARCHAR](500) NOT NULL,
[SchemaName] [VARCHAR](500) NOT NULL,
[ObjectName] [VARCHAR](MAX) NULL,
[ObjectId] [INT] NOT NULL,
[ObjectType] [VARCHAR](500) NOT NULL,
[DependsOnLinkedServer] [VARCHAR](500) NOT NULL,
[definition] [VARCHAR](MAX) NULL
)
IF OBJECT_ID('tempdb..#Queries') IS NOT NULL
BEGIN
DROP TABLE #Queries
END
SELECT
REPLACE('INSERT INTO #Deps
(
[ServerName]
,[DatabaseName]
,[SchemaName]
,[ObjectName]
,[ObjectType]
,[ObjectId]
,[DependsOnLinkedServer]
,[definition]
)
SELECT
@@SERVERNAME,
''?'' AS DatabaseName,
s.name AS SchemaName,
o.name AS ObjectName,
o.type_desc AS ObjectType,
m.object_id AS ObjectId,
''' + srv.name + ''' AS DependsOnLinkedServer,
m.definition
FROM
[?].sys.sql_modules m
LEFT OUTER JOIN [?].sys.objects o
ON m.object_id = o.object_id
LEFT OUTER JOIN [?].sys.schemas s
ON o.schema_id = s.schema_id
WHERE
definition LIKE ''%' + srv.name + '%''', CHAR(13) + CHAR(10), '') AS Query
INTO
#Queries
FROM
sys.servers srv;
GO
DECLARE @Query AS VARCHAR(MAX)
DECLARE LinkedServerCursor CURSOR FAST_FORWARD
FOR
SELECT
Query
FROM
#Queries
OPEN LinkedServerCursor
FETCH NEXT FROM LinkedServerCursor INTO @Query;
WHILE @@FETCH_STATUS = 0
BEGIN
EXECUTE master.sys.sp_MSforeachdb @Query
FETCH NEXT FROM LinkedServerCursor INTO @Query;
END
CLOSE LinkedServerCursor;
DEALLOCATE LinkedServerCursor;
GO
SELECT
ServerName,
DatabaseName,
ObjectName,
'[' + ServerName + '].[' + DatabaseName + '].[' + SchemaName + '].[' + ObjectName + ']' AS QualifiedObjectName,
DependsOnLinkedServer,
ObjectType
FROM
#Deps
ORDER BY
ServerName,
DatabaseName,
ObjectName
【讨论】:
我建议将查询的中间部分更改为如下所示,以确保只有在查询中使用它时才能获得成功。 否则,每当提及服务器名称时,您都会得到很多误报。
WHERE
definition LIKE ''%\[' + srv.name + '\].%''
or definition LIKE ''%' + srv.name + '.%''', CHAR(13) + CHAR(10), '') AS Query
【讨论】: