Вы можете использовать хранимую процедуру sp_msforeachdb
sp_msforeachdb: это очень полезно
системная хранимая процедура, которая будет
выполнить любой SQL-скрипт, который вы передаете для
в каждой из баз данных на вашем SQL
Экземпляр сервера. Хранимая процедура
просто перебирает базы данных,
что просто написать, но экономит
вам от необходимости делать это самостоятельно.
Добавьте столбец для имени базы данных и заполнитель [?] Для имени базы данных, а затем выполните сценарий в хранимом процессе sp_msforeachdb
следующим образом:
EXECUTE sp_msforeachdb 'select ''[?]'' as DatabaseName,
u.name
,case when (r.principal_id is null) then ''public'' else r.name end
,l.default_database_name
,u.default_schema_name
,u.principal_id
from [?].sys.database_principals u
left join ([?].sys.database_role_members m join [?].sys.database_principals r on m.role_principal_id = r.principal_id)
on m.member_principal_id = u.principal_id
left join [?].sys.server_principals l on u.sid = l.sid
where u.type <> ''R'''
Чтобы получить все это в одной таблице, вам нужно будет создать таблицу в одной базе данных, мы будем использовать master
в качестве примера.
Создать таблицу в базе данных master
Create Table master.dbo.userPermissionResults
(
....
)
Затем просто добавьте оператор вставки в начало запроса
EXECUTE sp_msforeachdb 'Insert Into master.dbo.userPermissionResults select ''[?]'' as DatabaseName,
u.name
,case when (r.principal_id is null) then ''public'' else r.name end
,l.default_database_name
,u.default_schema_name
,u.principal_id
from [?].sys.database_principals u
left join ([?].sys.database_role_members m join [?].sys.database_principals r on m.role_principal_id = r.principal_id)
on m.member_principal_id = u.principal_id
left join [?].sys.server_principals l on u.sid = l.sid
where u.type <> ''R'''
Необходимо указать имя базы данных для оператора Insert
, в противном случае он попытается вставить данные в текущую базу данных.