#sql-server
#sql-сервер
Вопрос:
Следующий запрос выбирает все роли базы данных, участником которых является @myUser:
SELECT
p.name AS userRoleName
FROM sys.database_role_members rm
INNER JOIN sys.database_principals p ON p.principal_id = rm.role_principal_id
INNER JOIN sys.database_principals m ON m.principal_id = rm.member_principal_id
WHERE m.name = @myUser;
Для каждой роли базы данных, перечисленных выше, я должен выполнить:
ALTER ROLE [database_role_name] DROP MEMBER @myUser;
Как объединить два вышеуказанных запроса в одной процедуре T-SQL?
Комментарии:
1. Вам нужно будет скомпилировать динамический запрос, если вы используете последнюю версию SQL Server
STRING_AGG
, а затем выполнить его.
Ответ №1:
Мы можем сделать это с помощью динамического SQL. Я предполагаю, что у вас есть STRING_AGG
доступная версия SQL Server:
DECLARE @sql nvarchar(max) =
(SELECT
STRING_AGG(
CAST(N'ALTER ROLE ' QUOTENAME(p.name) N' DROP MEMBER ' QUOTENAME(@myUser) N';'
AS nvarchar(max))
, NCHAR(10))
FROM sys.database_role_members rm
INNER JOIN sys.database_principals p ON p.principal_id = rm.role_principal_id
INNER JOIN sys.database_principals m ON m.principal_id = rm.member_principal_id
WHERE m.name = @myUser
);
-- PRINT @sql -- for testing
EXEC (@sql)