2010-03-15 11 views
6

मुझे लगता है कि प्रक्रिया कुछ इस तरह होना चाहिए:कैसे सब उदाहरण के डेटाबेस के लिए उपयोगकर्ताओं की सूची प्राप्त करने के लिए

declare @db varchar(100) 
declare @user varchar(100) 
declare c cursor for select name from sys.sysdatabases   

open c 

fetch next from c into @db 

while @@fetch_status = 0 
begin 
    print @db 
    exec ('use ' + @db) 

    declare u cursor for select name from sys.sysusers 
     where issqlrole <> 1 and hasdbaccess <> 0 and isntname <> 1 

    open u 

    fetch next from u into @user 

    while @@fetch_status = 0 
    begin 
     print @user 
     fetch next from u into @user 
    end 

    print '--------------------------------------------------' 
    close u  
    deallocate u  
    fetch next from c into @db 
end 

close c 
deallocate c 

लेकिन समस्या यह है कि कार्यकारी है ('का उपयोग' + @db) काम नहीं करता। और मुझे हमेशा वर्तमान में चुने गए डेटाबेस की उपयोगकर्ता सूची मिलती है। मुझे इसे कैसे ठीक करना चाहिए?

पीएस .: मैं चाहता हूं कि यह कोड 2000 और 2005 दोनों SQL सर्वरों पर काम करे।

उत्तर

10

तुम भी गैर-दस्तावेजी लेकिन अच्छी तरह से इस्तेमाल sp_MSforeachdb संग्रहीत proc इस्तेमाल कर सकते हैं - here for details देख सकते हैं या एक और blog post here देखें:

exec sp_MSforeachdb 'select * from ?.sys.sysusers' 

इस "?" डेटाबेस नाम के लिए प्लेसहोल्डर है जिसे कमांड में जोड़ा जाएगा, क्योंकि यह आपके सिस्टम में प्रत्येक डेटाबेस के विरुद्ध निष्पादित हो जाता है।

+0

+1 बहुत बढ़िया! मैं stee1rat कोड को किसी तरह से या किसी अन्य तरीके से सीखने का तरीका समझने की कोशिश कर रहा था, और फिर आप इस शानदार sp_MSforeachdb संग्रहीत प्रक्रिया के साथ आते हैं! धन्यवाद! –

+1

यह बहुत अच्छा है! आपका बहुत बहुत धन्यवाद! अब मैं सरल कमांड निष्पादन sp_msforeachdb 'उपयोग का उपयोग करके सभी डेटाबेस में उपयोगकर्ता को आसानी से छोड़ सकता हूं? exec sp_dropuser '' testuser123 '' ':) मुझे आश्चर्य है कि यह प्रक्रिया क्यों अनियंत्रित है? यह बहुत उपयोगी है :) – stee1rat

2

यहां http://www.sqlservercentral.com/scripts/Administration/63841/ से एक अच्छी क्वेरी है यदि आपके पास खाता नहीं है, तो यह एक नि: शुल्क साइनअप और एक बहुत अच्छा संसाधन है।

एक अस्थायी तालिका में सब कुछ डालता है, तो आप जो कुछ भी चाहते हैं वह कर सकते हैं।

USE MASTER 
GO 

BEGIN 
    IF LEFT(CAST(Serverproperty('ProductVersion') AS VARCHAR(1)), 1) = '9' 
     IF EXISTS (SELECT TOP 1 * 
        FROM Tempdb.sys.objects (nolock) 
        WHERE name LIKE '#TUser%') 
      DROP TABLE #TUser 
    ELSE 
     IF LEFT(CAST(Serverproperty('ProductVersion') AS VARCHAR(1)), 1) = '8' 
      IF EXISTS (SELECT TOP 1 * 
         FROM Tempdb.dbo.sysobjects (nolock) 
         WHERE name LIKE '#TUser%') 
       DROP TABLE #TUser 

     CREATE TABLE #tuser 
     (
      ServerName varchar(256), 
      DBName SYSNAME, 
      [Name] SYSNAME, 
      GroupName SYSNAME NULL, 
      LoginName SYSNAME NULL, 
      default_database_name SYSNAME NULL, 
      default_schema_name VARCHAR(256) NULL, 
      Principal_id INT, 
      sid VARBINARY(85) 
     ) 

     IF LEFT(CAST(Serverproperty('ProductVersion') AS VARCHAR(1)), 1) = '8' 
      INSERT INTO #TUser 
      EXEC sp_MSForEachdb 
      ' 
      SELECT 
      @@SERVERNAME, 
      ''?'' as DBName, 
      u.name As UserName, 
      CASE 
      WHEN (r.uid IS NULL) THEN ''public'' 
      ELSE r.name 
      END AS GroupName, 
      l.name AS LoginName, 
      NULL AS Default_db_Name, 
      NULL as default_Schema_name, 
      u.uid, 
      u.sid 
      FROM [?].dbo.sysUsers u 
      LEFT JOIN ([?].dbo.sysMembers m 
      JOIN [?].dbo.sysUsers r 
      ON m.groupuid = r.uid) 
      ON m.memberuid = u.uid 
      LEFT JOIN dbo.sysLogins l 
      ON u.sid = l.sid 
      WHERE u.islogin = 1 OR u.isntname = 1 OR u.isntgroup = 1 
      /*and u.name like ''tester''*/ 
      ORDER BY u.name 
      ' 
     ELSE IF LEFT(CAST(Serverproperty('ProductVersion') AS VARCHAR(1)), 1) = '9' 
      INSERT INTO #TUser 
      EXEC sp_MSForEachdb 
      ' 
      SELECT 
      @@SERVERNAME, 
      ''?'', 
      u.name, 
      CASE 
      WHEN (r.principal_id IS NULL) THEN ''public'' 
      ELSE r.name 
      END GroupName, 
      l.name LoginName, 
      l.default_database_name, 
      u.default_schema_name, 
      u.principal_id, 
      u.sid 
      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'' 
      /*and u.name like ''tester''*/ 
      order by u.name 
      ' 

    SELECT * 
    FROM #TUser 
    ORDER BY DBName, [name], GroupName 

    DROP TABLE #TUser 
END 
+0

यह अभी भी लाइन 'ELSE IF LEFT (CAST (सर्वरप्रोपर्टी (' ProductVersion ') AS VARCHAR (1)) को बदलने के बाद SQL Server 2012 में काम करता है, 1) =' 9'' 'ELSE IF LEFT के साथ (सीएएसटी (सर्वरप्रोपर्टी ('उत्पादवर्सन') एएस वचरर (2)), 2) = '11'''। (बेशक चेक अधिक सामान्य बनाया जा सकता है)। – knb

संबंधित मुद्दे

 संबंधित मुद्दे