অনাথ ব্যবহারকারীদের সন্ধান করুন


12

এসকিউএল সার্ভার ২০০ In-এ, এমন কোনও ব্যবহারকারীদের সন্ধানের উপায় রয়েছে যা হয় সার্ভার স্তরে উপস্থিত নেই (সার্ভার স্তরে মুছে ফেলা এমন একটি অ্যাকাউন্ট যা মুছে ফেলার আগে ডেটাবেসগুলি থেকে বিচ্ছিন্ন করা হয়নি) বা লিঙ্কযুক্ত নয় এমন অ্যাকাউন্টগুলি (কোনও অ্যাকাউন্ট সার্ভার স্তরে মুছে ফেলা হতে পারে তবে ডিবি স্তর নয়, আবার সংযোজন করা হবে তবে ডিবি স্তরটি কখনও পরিষ্কার করা হয়নি)।

আমি একটি খুব অগোছালো সার্ভার পেয়েছি এবং এটি সন্ধানের জন্য চালানোর জন্য যদি কোনও জিজ্ঞাসা থাকে তবে তা দুর্দান্ত হবে।


উত্তর:


15

ব্রেন্ট Ozar আনলিমিটেড সাইট থেকে নিম্নলিখিত স্ক্রিপ্ট , ডাটাবেজ সকল ডাটাবেস এবং তালিকা এতিম ব্যবহারকারীদের মাধ্যমে iterates তাদের সরিয়ে ড্রপ কমান্ড করেন। এটি পরিচালনা করার খুব সুন্দর / আরও নতুন উপায় থাকতে পারে তবে এটি 2005-2012 এ সঠিকভাবে কাজ করে বলে মনে হচ্ছে।

DECLARE @SQL nvarchar(2000)
DECLARE @name nvarchar(128)
DECLARE @database_id int

SET NOCOUNT ON;

IF NOT EXISTS 
    (SELECT name FROM tempdb.sys.tables WHERE name like '%#orphan_users%')
BEGIN
    CREATE TABLE #orphan_users
        (
        database_name nvarchar(128) NOT NULL,
        [user_name] nvarchar(128) NOT NULL,
        drop_command_text nvarchar(200) NOT NULL
        )
END

CREATE TABLE #databases 
(
    database_id int NOT NULL
    , database_name nvarchar(128) NOT NULL
    , processed bit NOT NULL
)

INSERT
    #databases 
    ( database_id
    , database_name
    , processed )
SELECT 
    database_id
    , name
    , 0 
FROM 
    master.sys.databases 
WHERE 
    name NOT IN 
    ('master'
    , 'tempdb'
    , 'msdb'
    , 'distribution'
    , 'model')

WHILE (SELECT COUNT(processed) FROM #databases WHERE processed = 0) > 0
BEGIN
    SELECT TOP 1
        @name = database_name,
        @database_id = database_id
    FROM #databases
    WHERE processed = 0
    ORDER BY database_id

    SELECT @SQL =

'USE [' + @name + '];
INSERT INTO #orphan_users (database_name, user_name, drop_command_text)
SELECT 
    DB_NAME()
    , u.name
    , ' + '''' 
    + 'USE [' + @name + ']; ' 
    + 'DROP USER [' 
    + '''' + ' + u.name 
    + ' + '''' + '] ' 
    + '''' + '
FROM
    master..syslogins l
RIGHT JOIN 
    sysusers u 
ON l.sid = u.sid
WHERE   
    l.sid IS NULL
AND issqlrole <> 1
AND isapprole <> 1
AND ( u.name <> ' + '''' + 'INFORMATION_SCHEMA' + ''''
        + ' AND u.name <> ' + '''' + 'guest' + ''''
        + ' AND u.name <> ' + '''' + 'dbo' + ''''
        + ' AND u.name <> ' + '''' + 'sys' + ''''
        + ' AND u.name <> ' + '''' + 'system_function_schema' + '''' + ')'

    PRINT @SQL;

    EXEC sys.sp_executesql @SQL

    UPDATE 
        #databases 
    SET 
        processed = 1 
    WHERE 
        database_id = @database_id;
END

SELECT 
    database_name
    , [user_name]
    , drop_command_text 
FROM 
    #orphan_users 
ORDER BY 
    [database_name]
    , [user_name];

DROP TABLE #databases;
DROP TABLE #orphan_users;

SET NOCOUNT OFF;

4

আমি স্ক্রিপ্ট পোস্ট করার জন্য প্রথমে চিহ্নিত করতে চেয়েছিলাম। এটি স্ক্র্যাচ থেকে এটি লেখার জন্য আমার অনেক সময় বাঁচিয়েছিল। আমি "ডেটাবেস অধ্যক্ষ ডাটাবেসে একটি স্কিমা মালিকানাধীন, এবং ফেলে দেওয়া যায় না" উল্লেখ করে একটি ত্রুটি পেয়েছি এমন ইস্যুটি চালানোর পরে আমি এটি কিছুটা সংশোধন করেছি। SCHEMA ত্রুটি এবং রোল ত্রুটির জন্য কমান্ড উত্পন্ন করার জন্য আমি স্ক্রিপ্টটি পরিবর্তন করেছি এবং যদি আপনার এটিরও হয় তবে।

আশা করছি এটা ওখানে কাওকে সাহায্য করবে..

DECLARE @SQL nvarchar(2000)
DECLARE @name nvarchar(128)
DECLARE @database_id int

SET NOCOUNT ON;

IF NOT EXISTS 
    (SELECT name FROM tempdb.sys.tables WHERE name like '%#orphan_users%')
BEGIN
    CREATE TABLE #orphan_users
        (
        database_name nvarchar(128) NOT NULL,
        [user_name] nvarchar(128) NOT NULL,
        drop_command_text nvarchar(200) NOT NULL,
        drop_schema_text nvarchar(200) not null,
        drop_role_text nvarchar(200) not null
        )
END

CREATE TABLE #databases 
(
    database_id int NOT NULL
    , database_name nvarchar(128) NOT NULL
    , processed bit NOT NULL
)

INSERT
    #databases 
    ( database_id
    , database_name
    , processed )
SELECT 
    database_id
    , name
    , 0 
FROM 
    master.sys.databases 
WHERE 
    name NOT IN 
    ('master'
    , 'tempdb'
    , 'msdb'
    , 'distribution'
    , 'model')

WHILE (SELECT COUNT(processed) FROM #databases WHERE processed = 0) > 0
BEGIN
    SELECT TOP 1
        @name = database_name,
        @database_id = database_id
    FROM #databases
    WHERE processed = 0
    ORDER BY database_id

    SELECT @SQL =

'USE [' + @name + '];
INSERT INTO #orphan_users (database_name, user_name, drop_command_text, Drop_schema_text, drop_role_text)
SELECT 
    DB_NAME()
    , u.name
    , 
        ' + '''' 
        + 'USE [' + @name + ']; ' 
        + 'DROP USER [' 
        + '''' + ' + u.name 
        + ' + '''' + '] ' 
        + '''' + '
    , 
        ' + '''' + 'USE [' + @name + ']; ' +
        'ALTER AUTHORIZATION ON SCHEMA::[' 
        + '''' + ' + u.name 
        + ' + '''' + ']  TO [dbo]' + '''' + '
    , 
        ' + '''' + 'USE [' + @name + ']; ' +
        'ALTER AUTHORIZATION ON Role::[' 
        + '''' + ' + u.name 
        + ' + '''' + ']  TO [dbo]' + '''' + '
FROM
    master..syslogins l
RIGHT JOIN 
    sysusers u 
ON l.sid = u.sid
WHERE   
    l.sid IS NULL
AND issqlrole <> 1
AND isapprole <> 1
AND ( u.name <> ' + '''' + 'INFORMATION_SCHEMA' + ''''
        + ' AND u.name <> ' + '''' + 'guest' + ''''
        + ' AND u.name <> ' + '''' + 'dbo' + ''''
        + ' AND u.name <> ' + '''' + 'sys' + ''''
        + ' AND u.name <> ' + '''' + 'system_function_schema' + '''' + ')'

    PRINT @SQL;

    EXEC sys.sp_executesql @SQL

    UPDATE 
        #databases 
    SET 
        processed = 1 
    WHERE 
        database_id = @database_id;
END

SELECT 
    database_name
    , [user_name]
    , drop_command_text 
    , Drop_schema_text
    , drop_role_text
FROM 
    #orphan_users 
ORDER BY 
    [database_name]
    , [user_name];

DROP TABLE #databases;
DROP TABLE #orphan_users;

SET NOCOUNT OFF;

3

এই এসপিউচেন_ইউজার্স_লগিন এসকিউএল ২০০৮ হিসাবে অবহেলিত তবে এখনও ভালভাবে কাজ করে। আপনি যদি 'প্রতিবেদন' বিকল্পটি পাস করেন তবে এটি সেই সমস্ত ব্যবহারকারীদের তালিকাভুক্ত করবে যার সাথে সম্পর্কিত লগইন নেই।

EXEC sp_change_users_login 'report'

আপনি যদি এটি আপনার সমস্ত ডাটাবেসের জন্য চালাতে চান তবে আপনি এটি এটি করতে পারেন।

EXEC sp_msforeachdb 'use [?]; PRINT ''?''; EXEC sp_change_users_login ''report'';'

আপনি যদি বিএল-এ সন্ধান করেন তবে আপনি "অনাথ" ব্যবহারকারীদের ফিক্সিংয়ের বিকল্পগুলিও পাবেন।

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