This script just executes a query on a per-database level to find objects via their definitions in the sys.all_sql_modules table that reference a linked server defined on the current server. Right now it just spits the results out to a gridview. Minimally tested, use at your own risk.
[void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo")
[void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum")
[void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$outputs = @();
$servers = gc -Path 'C:\Servers.txt'
$servers | %{
$srvName = $_
$srvConn = New-Object "Microsoft.SqlServer.Management.Common.ServerConnection"
$srvConn.ServerInstance = $_
$srv = New-Object Microsoft.SqlServer.Management.Smo.Server $srvConn
$srv.LinkedServers | %{
$linkedServerName = $_.Name
$srv.Databases | %{
$linkedSQL = "
SELECT
o.name AS ObjectName,
o.type_desc,
LEFT(m.definition, 100) AS ObjectDefinition
FROM $($_.Name).sys.all_sql_modules m
INNER JOIN $($_.Name).sys.objects o ON m.object_id = o.object_id
WHERE m.object_id > 0
AND m.definition LIKE '%$linkedServerName%'
"
$dr = $srvConn.ExecuteReader($linkedSQL);
while($dr.Read()){
$output = New-Object -TypeName PSObject -Property @{
ServerName = $srvName
DatabaseName = $_.Name
LinkedServerName = $linkedServerName
ObjectName = $dr.GetString(0)
ObjectType = $dr.GetString(1)
Definition = $dr.GetString(2)
}
$outputs += $output
}
$dr.Close();
}
}
}
$outputs | SELECT ServerName, DatabaseName, LinkedServerName, ObjectName, ObjectType, Definition | Out-GridView
Leave a comment