2016-07-13 1 views
0

Я использую SQL Server 2008 R2 и SQL Server 2014 ...Как сгенерировать сценарий для удаления членов роли во всех базах данных SQL Server?

Я пытаюсь запустить сценарий для создания другого сценария, чтобы я мог выполнить хранимую процедуру SQL Server sp_droprolemember. Я хочу, чтобы запустить ниже запрос на все базы данных:

SELECT 
    user_name([member_principal_id]) as [Username], 
    User_Name([role_principal_id]) as [Role], 
    'EXEC sp_droprolemember N'''+ User_Name([role_principal_id]) +''', N''' + user_name([member_principal_id]) +'''' 
FROM 
    sys.database_role_members 
WHERE 
    User_Name([role_principal_id]) = 'db_datareader' 

Я знаю о sp_MSforeachdb, но у меня возникают проблемы, чтобы сделать его работу с запросом ... (Боже Как я ненавижу T-SQL путь чтобы соединить строки!)

Может ли кто-нибудь помочь мне с правильным способом?

Спасибо!

ответ

0

Возможно что-то вроде этого ....

Declare @Sql Nvarchar(max), @DBUser SYSNAME; 

Declare Cur CURSOR LOCAL FAST_FORWARD FOR 

Select user_name([member_principal_id]) 
from sys.database_principals p 
INNER JOIN sys.database_role_members r ON p.principal_id = r.member_principal_id 
WHERE p.type_desc IN ('SQL_USER', 'WINDOWS_USER') 
AND p.name NOT IN ('dbo','guest','INFORMATION_SCHEMA','sys') 
AND User_Name([role_principal_id]) = 'db_datareader' 

OPEN Cur 

    FETCH NEXT FROM Cur INTO @DBUser 

WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    SET @Sql = N'EXEC sp_droprolemember N''db_datareader'' , @DBUser' 

    Exec sp_executesql @Sql ,N'@DBUser SYSNAME' , @DBUser 

    FETCH NEXT FROM Cur INTO @DBUser 
END 

CLOSE Cur 
DEALLOCATE Cur; 
+0

Привет М. Али! Как дела? Я хочу, чтобы выход скрипта был как выход моего исходного сценария ... Я действительно не хочу автоматически запускать 'sp_droprolemember' ... – Cadoso

Смежные вопросы