Просмотр зависимостей связанных серверов sql server 2008
Знает ли кто-нибудь, как / возможно ли просмотреть все таблицы/представления/хранимые процедуры, зависящие от связанного сервера в Sql Server 2008. В принципе, как если бы контекстное меню "Просмотр зависимостей" было доступно для связанных серверов?
Любая помощь очень ценится.
Спасибо
3 ответа:
Ищите его
SELECT OBJECT_NAME(object_id), * FROM sys.sql_modules WHERE definition LIKE '%myLinkedServer%'
Или использовать бесплатно Red gate SQL Search , чтобы сделать то же самое с графическим интерфейсом
Нет таблицы или функции, отслеживающей зависимости между связанными объектами сервера и объектами уровня базы данных
Примечание: представления INFORMATION_SCHEMA и унаследованные syscomm усекают определение, поэтому они ненадежны для поиска определений.
Следуя предложению @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