2015-04-30 20 views
5

SQL Server 2012 kullanıyorum ve temel hedefim programsal olarak DROP ROLE yapmaktır, ancak rol boş olmadıkça bu yapılamaz, bu yüzden T-SQL'i ilk önce tüm üyelerini bırakmak için nasıl kullanabilirim bir rol?ALTER ROLE tüm üyeleri bırakmak için

  • Bir rolün tüm üyelerini bulabilirsiniz:

    SELECT members.[name] 
    FROM sys.database_role_members AS rolemembers 
        JOIN sys.database_principals AS roles 
         ON roles.[principal_id] = rolemembers.[role_principal_id] 
        JOIN sys.database_principals AS members 
         ON members.[principal_id] = rolemembers.[member_principal_id] 
    WHERE roles.[name][email protected] 
    
  • üye kullanılarak bırakılabilir:

    ALTER ROLE role_name DROP MEMBER user_name 
    

nasıl bu ikisini birleştirebilirsiniz? Ya da yapmaya çalıştığım şeyi yapmanın başka bir yolu var mı?

(bu önemliyse Ayrıca, ben emin değilim, ancak bir varlık Çerçeve 6 göçün bu kullanıyor olacaktır) İşte

cevap

6

İki birleştirmek gibi olacaktır:

DECLARE @rolename sysname = 'role_name'; 
DECLARE @cmd AS NVARCHAR(MAX) = N''; 

SELECT @cmd = @cmd + ' 
    ALTER ROLE ' + QUOTENAME(@rolename) + ' DROP MEMBER ' + QUOTENAME(members.[name]) + ';' 
FROM sys.database_role_members AS rolemembers 
    JOIN sys.database_principals AS roles 
     ON roles.[principal_id] = rolemembers.[role_principal_id] 
    JOIN sys.database_principals AS members 
     ON members.[principal_id] = rolemembers.[member_principal_id] 
WHERE roles.[name][email protected] 

EXEC(@cmd); 

Bu, sorgunuzdaki her satır (kullanıcı) için ALTER ROLE komutunuzla bir dize oluşturur, bunları birlikte tüm bu komutlarla birlikte büyük bir dize halinde birleştirir ve sonra bunları dinamik olarak yürütür.

+0

Teşekkür ederim, bu iyi çalıştı. – jjj

1

sql sunucusunda özel sp (sp_droprolemember) vardır. Umarım problem çözer.

+1

sp_droprolemember kullanımdan kaldırıldı - bunun yerine ALTER ROLE kullanın (https://msdn.microsoft.com/en-us/library/ms188369.aspx) – nonpoliticaltag

İlgili konular