これは常に単純な答えではないため、ここでは複数の問題が発生しています。環境と権限に応じて、1 つまたは複数のデータベースにアクセスできる 1 つまたは複数のサーバーを持つ 1 つまたは複数の環境にアクセスできる 1 つまたは複数の権限グループを持つことができます。ただし、権限があり、リンク サーバーにデータ アクセスを設定している場合は、次のようなことを実行して、アクセスできるもののリストを取得できます。これをさまざまな環境で同様に実行して、ADO.NET などで呼び出すことができるプロシージャにすることができます。
--declare variable for dynamic SQL
DECLARE
@SQL NVARCHAR(512)
, @x int
-- Create temp table to catch linked servers
Declare @Servers TABLE
(
Id int identity
, ServerName VARCHAR(128)
)
-- insert linked servers
insert into @Servers
select name
FROM sys.servers
-- remove temp table if it exists as it should not be prepopulated.
IF object_ID('tempdb..#Databases') IS NOT NULL
DROP TABLE tempdb..#Databases
;
-- Create temp table to catch built in sql stored procedure
CREATE TABLE #Databases --DECLARE @Procs table
(
ServerName varchar(64)
, DatabaseName VARCHAR(128)
)
SET @X = 1
-- Loops through the linked servers with matching criteria to examine how MANY there are. Do a while loop while they exist.
WHILE @X <= (SELECT count(*) FROM @Servers)
BEGIN
declare @DB varchar(128);
Select @DB = ServerName from @Servers where Id = @X -- get DB name from current cursor increment
-- Set up dynamic SQL but do not include master and other meta databases as no one cares about them.
SET @SQL = 'insert into #Databases select ''' + @Db + ''', name from ' + @DB + '.master.sys.databases
where name not in (''master'',''tempdb'',''model'',''msdb'')'
-- Execute the dynamic sql to insert into collection object
exec sp_executesql @SQL
-- increment for next iteration on next server
SET @X = @X + 1
END
;
SELECT *
FROM #Databases