it-swarm.asia

استعلام يسرد جميع المستخدمين المعينين لتسجيل دخول معين

عند النظر في خصائص تسجيل دخول معين ، من الممكن رؤية قائمة المستخدمين المعينين لتسجيل الدخول هذا: enter image description here

لقد قمت بتوصيف ستوديو إدارة خادم SQL (SSMS) وأرى أن SSMS يتصل بكل قاعدة بيانات واحدة في كل مرة ويسترد المعلومات من sys.database_permissions

هل من الممكن كتابة استعلام واحد يسترد معلومات تعيين المستخدم الموضحة أعلاه أو هل أجد نفسي مضطرًا لاستخدام المؤشر أو sp_MSforeachdb أو شيء من هذا القبيل؟

19
Michael J Swart

إليك طريقة واحدة باستخدام SQL الديناميكي. لا توجد طريقة فعلًا للقيام بذلك دون تكرار ولكن هذا النهج أكثر أمانًا من خيارات غير موثقة وغير مدعومة وعربات عربات التي تجرها الدواب مثل sp_MSforeachdb .

سيحصل هذا على قائمة بجميع قواعد البيانات عبر الإنترنت ، والمستخدم المعين (إن وجد) جنبًا إلى جنب مع اسم المخطط الافتراضي وقائمة مفصولة بفواصل للأدوار التي ينتمون إليها.

DECLARE @name SYSNAME = N'your login name'; -- input param, presumably

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'UNION ALL SELECT N''' + REPLACE(name,'''','''''') + ''',
  p.name, p.default_schema_name, STUFF((SELECT N'','' + r.name 
  FROM ' + QUOTENAME(name) + N'.sys.database_principals AS r
  INNER JOIN ' + QUOTENAME(name) + N'.sys.database_role_members AS rm
   ON r.principal_id = rm.role_principal_id
  WHERE rm.member_principal_id = p.principal_id
  FOR XML PATH, TYPE).value(N''.[1]'',''nvarchar(max)''),1,1,N'''')
 FROM sys.server_principals AS sp
 LEFT OUTER JOIN ' + QUOTENAME(name) + '.sys.database_principals AS p
 ON sp.sid = p.sid
 WHERE sp.name = @name '
FROM sys.databases WHERE [state] = 0;

SET @sql = STUFF(@sql, 1, 9, N'');

PRINT @sql;
EXEC master.sys.sp_executesql @sql, N'@name SYSNAME', @name;
15
Aaron Bertrand

يتم تعديل هذا البرنامج النصي بشكل طفيف من البرنامج النصي المذكور في سيفعل ما تبحث عنه. استبدل "ThursdayClass" بمعلومات تسجيل الدخول التي تحتاج إلى معلومات عنها. https://www.simple-talk.com/sql/sql-tools/the-sqlcmd-workbench/

    SET NOCOUNT ON
    CREATE TABLE #temp
        (
          SERVER_name SYSNAME NULL ,
          Database_name SYSNAME NULL ,
          UserName SYSNAME ,
          GroupName SYSNAME ,
          LoginName SYSNAME NULL ,
          DefDBName SYSNAME NULL ,
          DefSchemaName SYSNAME NULL ,
          UserID INT ,
          [SID] VARBINARY(85)
        )

    DECLARE @command VARCHAR(MAX)
    --this will contain all the databases (and their sizes!)
    --on a server
    DECLARE @databases TABLE
        (
          Database_name VARCHAR(128) ,
          Database_size INT ,
          remarks VARCHAR(255)
        )
    INSERT  INTO @databases--stock the table with the list of databases
            EXEC sp_databases

    SELECT  @command = COALESCE(@command, '') + '
    USE ' + database_name + '
    insert into #temp (UserName,GroupName, LoginName,
                        DefDBName, DefSchemaName,UserID,[SID])
         Execute sp_helpuser
    UPDATE #TEMP SET database_name=DB_NAME(),
                     [email protected]@ServerName
    where database_name is null
    '
    FROM    @databases
    EXECUTE ( @command )

    SELECT  loginname ,
            UserName ,
            Database_name
    FROM    #temp
    WHERE   LoginName = 'ThursdayClass' 
7
SqlWorldWide

حاول sp_dbpermissions . من المحتمل أن يمنحك المزيد من المعلومات أكثر مما تحتاجه ولكنه سيفعل ما تريد.

بمجرد تثبيته ، قم بتشغيل هذا.

sp_dbpermissions @dbname = 'All', @LoginName = 'LoginName'

التحذير العادل في الوقت الحالي ، يتطابق مع "الإعجاب" ، لذا إذا كانت عمليات تسجيل الدخول الأخرى متشابهة ومطابقة ، فستشاهدها أيضًا. على سبيل المثال MyLogin و MyLoginForThis سيتطابق كلاهما في MyLogin. إذا كانت هذه مشكلة ، فلدي إصدار لم أقم بإصداره حتى الآن حيث يمكنك إيقاف تشغيله. اسمحوا لي أن أعرف ويمكنني إرسالها عبر البريد الإلكتروني.

5
Kenneth Fisher

للأسف سيكون عليك التكرار عبر جميع قواعد البيانات من أجل الحصول على المعلومات. سترغب في الانضمام sys.database_principals إلى sys.server_principals لكل قاعدة بيانات مطابقة على SID.

لا تستخدم sp_msforeachdb كما هو معروف في بعض الأحيان تفويت قواعد البيانات.

4
Nic

إليك حل Powerhell:

import-module sqlps;

$s = new-object Microsoft.sqlserver.management.smo.server '.'
foreach ($db in $s.Databases | where {$_.IsAccessible -eq $true}) {
   $u = $db.users | where {$_.Login -eq 'foobar'}
   if ($u -ne $null) { #login is mapped to a user in the db
       foreach ($role in $db.Roles) {
           if ($role.EnumMembers() -contains $u.Name) {
               $u | select parent, @{name="role";expression={$role.name}}, name
           }
       }
   }
}
4
Ben Thul

كنت أبحث عن إجابة مماثلة ووجدت هذا: https://www.pythian.com/blog/httpconsultingblogs-emc-comjamiethomsonarchive20070209sql-server-2005_3a00_-view-all-permissions-_2800_2_2900_-aspx/ . ونعم ، يستخدم sp_MSforeachDB اللعين ، ولكن أعتقد أن هذا الرجل يحصل على اغتصاب سيئ في بعض الأحيان ... ؛-)

سأقوم بنشر SQL هنا لتسهيل نسخ المعكرونة (أنا [~ # ~] لست [~ # ~] ننسب الفضل في ذلك ، فقط مما يسهل الوصول إليه!):

DECLARE @DB_Users TABLE (DBName sysname, UserName sysname, LoginType sysname
, AssociatedRole varchar(max), create_date datetime, modify_date datetime)

INSERT @DB_Users
EXEC sp_MSforeachdb
'use [?]
SELECT ''?'' AS DB_Name,
case prin.name when ''dbo'' then prin.name + '' (''
    + (select SUSER_SNAME(owner_sid) from master.sys.databases where name =''?'') + '')''
    else prin.name end AS UserName,
    prin.type_desc AS LoginType,
    isnull(USER_NAME(mem.role_principal_id),'''') AS AssociatedRole, 
    create_date, modify_date
FROM sys.database_principals prin
LEFT OUTER JOIN sys.database_role_members mem
    ON prin.principal_id=mem.member_principal_id
WHERE prin.sid IS NOT NULL and prin.sid NOT IN (0x00)
and prin.is_fixed_role <> 1 AND prin.name NOT LIKE ''##%'''

SELECT dbname, username, logintype, create_date, modify_date,
    STUFF((SELECT ',' + CONVERT(VARCHAR(500), associatedrole)
        FROM @DB_Users user2
        WHERE user1.DBName=user2.DBName AND user1.UserName=user2.UserName
        FOR XML PATH('')
    ),1,1,'') AS Permissions_user
FROM @DB_Users user1
WHERE user1.UserName = N'<put your login-name here!>'
GROUP BY dbname, username, logintype, create_date, modify_date
ORDER BY DBName, username
1
NateJ