একটি কোয়েরি যা প্রদত্ত লগইনের জন্য সমস্ত ম্যাপযুক্ত ব্যবহারকারীদের তালিকা করে


19

কোনও নির্দিষ্ট লগইনের বৈশিষ্ট্যগুলি দেখার সময়, login লগইনে ম্যাপযুক্ত ব্যবহারকারীর একটি তালিকা পাওয়া সম্ভব: এখানে চিত্র বর্ণনা লিখুন

আমি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও (এসএসএমএস) প্রোফাইল করেছি এবং আমি দেখতে পাচ্ছি যে এসএসএমএস একবারে প্রতিটি ডাটাবেসের সাথে সংযোগ করে এবং sys.datedia_perifications থেকে তথ্য পুনরুদ্ধার করে

উপরে বর্ণিত ব্যবহারকারীর ম্যাপিংয়ের তথ্য পুনরুদ্ধার করে এমন একক কোয়েরি লেখা কি সম্ভব বা আমি একটি কার্সার বা এসপি_এমএসফোরডিডিবি বা এরকম কিছু ব্যবহার করতে বাধ্য?


উত্তর:


15

ডায়নামিক এসকিউএল ব্যবহারের এক উপায় এখানে। পুনরাবৃত্তি না করে এটি করার সত্যিই কোনও উপায় নেই তবে এই পদ্ধতিটি অননুমোদিত, অসমর্থিত এবং বগি বিকল্পগুলির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;

1
মজাদার নোট, ইউনিয়নটি সঠিকভাবে কাজ করার জন্য আমাকে p.name এবং p.default_schema_name কলামগুলিতে সুস্পষ্ট সংকলন যুক্ত করতে হয়েছিল
মাইকেল জে স্বার্ট

@ মিশেল জেসওয়ার্ট আহা হ্যাঁ, ডাটাবেসে বিভিন্ন কোলিশেশন হওয়ার আগে আমি এটি পেরিয়ে এসেছি (কিছু মেটাডাটা কলামগুলি সার্ভার কল্যানেশন ব্যবহার করে তবে অন্যরা ডেটাবেস কোলাশনের উত্তরাধিকারী হয়)। আমি আশা করি যে কেবলমাত্র সেই ব্যক্তিরা যাঁরা সত্যই জ্বলিত হন তারা হ'ল যারা সত্তার নামগুলিতে কেবল কৌতুকপূর্ণ অক্ষরগুলি ব্যবহার করার জন্য জোর দিয়েছিলেন যা কেবল কিছু অস্পষ্ট জোটে সমর্থিত ...
অ্যারন বার্ট্র্যান্ড

7

উল্লিখিত স্ক্রিপ্ট থেকে এই স্ক্রিপ্টটি সামান্য পরিবর্তিত হয়েছে যা আপনি যা খুঁজছেন তা করবে। আপনার প্রয়োজনীয় তথ্যের প্রয়োজন অনুসারে 'বৃহস্পতিবারক্লাস' প্রতিস্থাপন করুন। 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(),
                     server_name=@@ServerName
    where database_name is null
    '
    FROM    @databases
    EXECUTE ( @command )

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

ধন্যবাদ তাইউব, এটি ভালভাবে কাজ করে, (আমি ব্র্যাকেটে ডাটাবেস_নামটি কলামটি বন্ধ করব ('[' এবং ']'))
মাইকেল জে স্বার্ট

5

Sp_dbperifications চেষ্টা করুন । এটি সম্ভবত আপনার প্রয়োজনের তুলনায় আরও তথ্য দেবে তবে এটি আপনি যা চান তা করবে।

এটি ইনস্টল হয়ে গেলে এটি চালান।

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

এই মুহুর্তে সুস্পষ্ট সতর্কতাটি "লাইক" ম্যাচ করে তাই যদি অন্য লগইনগুলির অনুরূপ হয় এবং মিল হয় তবে আপনি সেগুলিও দেখতে পাবেন। উদাহরণস্বরূপ MyLoginএবং MyLoginForThisউভয় মিলবে MyLogin। যদি সমস্যা হয় তবে আমার এমন একটি সংস্করণ রয়েছে যা আমি এখনও প্রকাশ করি নি যেখানে আপনি এটি বন্ধ করতে পারেন। আমাকে জানান এবং আমি এটি আপনাকে ইমেল করতে পারি।


4

এখানে একটি পাওয়ারশেল সমাধান:

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

দুর্ভাগ্যক্রমে আপনাকে তথ্য পেতে সমস্ত ডাটাবেসের মাধ্যমে পুনরাবৃত্তি করতে হবে। আপনি যোগ দিতে চাইবেন sys.database_principalsকরার sys.server_principalsজন্য SID প্রতিটি ডাটাবেসের মিলের জন্য।

sp_msforeachdbএটি ডেটাবেস মিস করার জন্য পরিচিত হিসাবে ব্যবহার করবেন না ।


1

আমি অনুরূপ উত্তরের জন্য সন্ধান করছিলাম এবং এটি পেয়েছি: https://www.pythian.com/blog/httpconsultingblogs-emc-comjamiethomsonarchive20070209sql-server-2005_3a00_- ভিউ- সব- অনুগমন-_2800_2_2900_- aspx/ । এবং হ্যাঁ, এটি ভয়ঙ্কর এসপি_এমএসফারাচডিবি ব্যবহার করে তবে আমি মনে করি যে লোকটি মাঝে মধ্যে খারাপ রেপ পায় ... ;-)

আমি সহজে অনুলিপি-পাস্তা জন্য এসকিউএল এখানে পোস্ট করব (আমি এটির জন্য ক্রেডিট নিচ্ছি না , কেবল এটি সহজেই অ্যাক্সেসযোগ্য!):

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

প্রশ্নের নীচে অনুরোধ করা DbName এর জন্য ম্যাপিংগুলি ফিরিয়ে দেবে

SELECT 'DbName', dbPri.name, dbPri1.name
FROM [DbName].sys.database_principals dbPri 
JOIN [DbName].sys.database_role_members dbRoleMem ON dbRoleMem.member_principal_id = 
dbPri.principal_id
JOIN [DbName].sys.database_principals dbPri1  ON dbPri1.principal_id = 
dbRoleMem.role_principal_id
WHERE dbPri.name != 'dbo'

উন্নত অনুসন্ধান নীচে আছে

declare @sql varchar(Max)

 set @sql = 'use ? SELECT ''?'', dbPri.name, dbPri1.name
 FROM sys.database_principals dbPri 
 JOIN sys.database_role_members dbRoleMem ON 
 dbRoleMem.member_principal_id = 
 dbPri.principal_id
 JOIN sys.database_principals dbPri1  ON dbPri1.principal_id = 
 dbRoleMem.role_principal_id
 WHERE dbPri.name != ''dbo'''

 EXEC sp_MSforeachdb @sql

আপনাকে ধন্যবাদ, এই স্ক্রিপ্টের লক্ষ্যটি ছিল সমস্ত ডাটাবেসের জন্য ম্যাপিং ma আপনার স্ক্রিপ্ট কেবল একটি নির্দিষ্ট ডাটাবেসের জন্য সমস্ত তথ্য দেয় না information
মাইকেল জে স্বার্ট

প্রতিক্রিয়াটির জন্য আপনাকে ধন্যবাদ, আমি ভেবেছিলাম এটি পুনরাবৃত্তি হতে পারে। এখন উন্নত ক্যোয়ারী সহ আপডেট হয়েছে
dilipkumar katre

@ অ্যারন-বার্ট্র্যান্ডের উত্তর দেখুন এবং এসপিএসএমএসফারাচডিবি সম্পর্কে তাঁর চিন্তাভাবনা সম্পর্কে মন্তব্য করুন।
মাইকেল জে স্বার্ট

-3

কি হবে EXEC master..sp_msloginmappings?


আপনি কি চেক করেছেন কি sp_msloginmappingsপোস্টের আগে নিবন্ধিত এবং অসমর্থিত?
কিন শাহ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.