Вот некоторый код, который мы используем, чтобы сначала проверить, сопоставлен ли пользователь с ролью, и, если нет, выполнить сопоставление. Вы должны быть в состоянии взять TSQL наверху, который использует database_prinicipals и database_role_members, и использовать его для извлечения отношений, которые есть в вашей базе данных.
SELECT @sql = ' IF EXISTS (SELECT * FROM ' + @DatabaseName + '.sys.database_principals a
JOIN ' + @DatabaseName + '.sys.database_role_members b ON a.principal_id = b.role_principal_id
JOIN ' + @DatabaseName + '.sys.database_principals c ON b.member_principal_id = c.principal_id
WHERE a.Type = ''R'' AND a.Name = ''' + @CurrentDbRole + '''
AND c.type IN ( ''U'', ''S'') AND c.name = ''' + @MappedUser + ''')'
+ ' BEGIN
PRINT '''';
PRINT N''The [' + @MappedUser + '] user is already a member of the ['
+ @CurrentDbRole + '] role in the [' + @DatabaseName + '] database. Skipping Role Member creation.'';
PRINT '''';
END
ELSE
BEGIN
PRINT '''';
PRINT N''Adding the [' + @MappedUser + '] database user as member of the [' + @CurrentDbRole
+ '] role in the [' + @DatabaseName + '] database... '';
PRINT '''';
USE ' + @DatabaseName +';
EXECUTE sp_addrolemember [' + @CurrentDbRole + '], [' + @MappedUser + '];
PRINT '''';
PRINT ''Completed adding the user to the role.'';
PRINT '''';
END; ';