এসকিউএল সার্ভার ২০০৮ আর 2 এ কীভাবে কোনও ব্যবহারকারীকে ক্লোন করবেন?


23

মাইক্রোসফ্ট এসকিউএল সার্ভারে ব্যবহারকারীর সুরক্ষা এবং অনুমতিগুলি ক্লোন করার কোনও উপায় আছে কীভাবে এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও জিইআই ব্যবহার করে?

উত্তর:


38

দ্রষ্টব্য: নীচের স্ক্রিপ্টটি আসলে কোনও কিছুর উপর অনুমতি সেট করে না, এটি কেবল স্ক্রিপ্ট তৈরি করে যা অনুলিপি করার আগে সম্পাদনা করা যেতে পারে এবং একটি নতুন ক্যোয়ারীতে অনুলিপি করা যায়।

স্ক্রিপ্টের নীচে আপনাকে অন্য ব্যবহারকারীর অনুমতি / অনুলিপি অনুলিপি করতে সহায়তা করবে:

--- To copy permissions of one user/role to another user/role.

USE database_name -- Use the database from which you want to extract the permissions
GO


SET NOCOUNT ON
DECLARE @OldUser sysname, @NewUser sysname

SET @OldUser = 'userOLD' --The user or role from which to copy the permissions from
SET @NewUser = 'userNEW'  --The user or role to which to copy the permissions to


SELECT  'USE' + SPACE(1) + QUOTENAME(DB_NAME()) AS '--Database Context'


SELECT  '--Cloning permissions from' + SPACE(1) + QUOTENAME(@OldUser) + SPACE(1) + 'to' + SPACE(1) + QUOTENAME(@NewUser) AS '--Comment'


SELECT  'EXEC sp_addrolemember @rolename ='
    + SPACE(1) + QUOTENAME(USER_NAME(rm.role_principal_id), '''') + ', @membername =' + SPACE(1) + QUOTENAME(@NewUser, '''') AS '--Role Memberships'
FROM    sys.database_role_members AS rm
WHERE   USER_NAME(rm.member_principal_id) = @OldUser
ORDER BY rm.role_principal_id ASC


SELECT  CASE WHEN perm.state <> 'W' THEN perm.state_desc ELSE 'GRANT' END
    + SPACE(1) + perm.permission_name + SPACE(1) + 'ON ' + QUOTENAME(SCHEMA_NAME(obj.schema_id)) + '.' + QUOTENAME(obj.name)
    + CASE WHEN cl.column_id IS NULL THEN SPACE(0) ELSE '(' + QUOTENAME(cl.name) + ')' END
    + SPACE(1) + 'TO' + SPACE(1) + QUOTENAME(@NewUser) COLLATE database_default
    + CASE WHEN perm.state <> 'W' THEN SPACE(0) ELSE SPACE(1) + 'WITH GRANT OPTION' END AS '--Object Level Permissions'
FROM    sys.database_permissions AS perm
    INNER JOIN
    sys.objects AS obj
    ON perm.major_id = obj.[object_id]
    INNER JOIN
    sys.database_principals AS usr
    ON perm.grantee_principal_id = usr.principal_id
    LEFT JOIN
    sys.columns AS cl
    ON cl.column_id = perm.minor_id AND cl.[object_id] = perm.major_id
WHERE   usr.name = @OldUser
ORDER BY perm.permission_name ASC, perm.state_desc ASC


SELECT  CASE WHEN perm.state <> 'W' THEN perm.state_desc ELSE 'GRANT' END
    + SPACE(1) + perm.permission_name + SPACE(1)
    + SPACE(1) + 'TO' + SPACE(1) + QUOTENAME(@NewUser) COLLATE database_default
    + CASE WHEN perm.state <> 'W' THEN SPACE(0) ELSE SPACE(1) + 'WITH GRANT OPTION' END AS '--Database Level Permissions'
FROM    sys.database_permissions AS perm
    INNER JOIN
    sys.database_principals AS usr
    ON perm.grantee_principal_id = usr.principal_id
WHERE   usr.name = @OldUser
AND perm.major_id = 0
ORDER BY perm.permission_name ASC, perm.state_desc ASC

12
@ সুইটরিটজ যদি কোনও ব্যবহারকারীকে ক্লোন করার জন্য কোনও জিইউআই থাকে, আপনাকে প্রশ্ন জিজ্ঞাসা করতে হবে না, কারণ আপনি কেবল বোতামটি টিপতে পারেন। নেই। কেবলমাত্র আপনি "কোডগুলিতে ভাল নন" কারণ আরও ভাল হতে শেখার কোনও অজুহাত নয় ...
অ্যারন বারট্রান্ড

6
নিজেকে কেবল জিইউআই ব্যবহারের মধ্যে সীমাবদ্ধ রাখবেন না। জিইউআই নবাগতদের পক্ষে ভাল তবে এটি সীমাবদ্ধ। আপনার কাজের জন্য, উপরের স্ক্রিপ্টটি কেবল আসল স্ক্রিপ্ট তৈরি করবে যা আপনি ব্যবহারকারী তৈরি / ক্লোন করতে ব্যবহার করতে পারেন
কিন শাহ

1
পরামর্শের জন্য অ্যারনকে ধন্যবাদ জানুন :) এবং @ সাহায্যের জন্য ধন্যবাদ ধন্যবাদ, এটি সত্যই দ্রুত উত্তর ছিল, অনেক প্রশংসিত হয়েছিল :) :)
মিষ্টিটিজ

2
আমি মনে করি এটি পরিষ্কার হওয়া দরকার যে উপরের স্ক্রিপ্টটি চালানো আসলে কোনও কিছুর উপর অনুমতি সেট করে না, এটি কেবল একটি স্ক্রিপ্ট তৈরি করে যা অনুলিপি করার আগে সম্পাদনা করা যেতে পারে এবং একটি নতুন ক্যোয়ারীতে অনুলিপি করা যায়। আমি এটি নিজেই ব্যবহার করেছি এবং এটি পুরোপুরি কাজ করেছে! গ্রেট টাইম সেভার !!
অ্যালান ফিশার

2
@ অ্যালানফিশার আপনার মন্তব্যের জন্য ধন্যবাদ এবং এটি আপনাকে সহায়তা করেছে বলে খুশী। আপনার মন্তব্য প্রতিফলিত করতে আমার উত্তর আপডেট। ধন্যবাদ!
কিন শাহ

3

কাজটি করার জন্য পাভেল পাভলোস্কির একটি দুর্দান্ত স্ক্রিপ্ট এখানে দেওয়া হয়েছে: http://www.pawlowski.cz/2011/03/cloning-user-rights-datedia/

প্রধান সুবিধা:

  • স্ক্রিপ্ট / অনুলিপি ভূমিকা সদস্যপদ
  • স্ক্রিপ্ট / অনুলিপি অবজেক্ট স্তর স্তর অনুমতি
  • স্ক্রিপ্ট / অনুলিপি ডাটাবেস স্তর অনুমতি

আমি এই স্ক্রিপ্টটির লেখক নই। স্ক্রিপ্টটি এই লিঙ্কটি থেকে পাভেল পাভলোস্কি ব্লগে অনুলিপি করা হয়েছে, কীভাবে স্ক্রিপ্টটি ব্যবহার করবেন সে সম্পর্কে আরও তথ্যের জন্য লিঙ্কটি দেখুন।

USE [master]
GO
--============================================
-- Author:      Pavel Pawlowski
-- Created:     2010/04/16
-- Description: Copies rights of old user to new user
--==================================================
CREATE PROCEDURE sp_CloneRights (
    @oldUser sysname, --Old user from which to copy right
    @newUser sysname, --New user to which copy rights
    @printOnly bit = 1, --When 1 then only script is printed on screen, when 0 then also script is executed, when NULL, script is only executed and not printed
    @NewLoginName sysname = NULL --When a NewLogin name is provided also a creation of user is part of the final script
)
AS
BEGIN
    SET NOCOUNT ON

    CREATE TABLE #output (
        command nvarchar(4000)
    )

    DECLARE
        @command nvarchar(4000),
        @sql nvarchar(max),
        @dbName nvarchar(128),
        @msg nvarchar(max)

    SELECT
        @sql = N'',
        @dbName = QUOTENAME(DB_NAME())

    IF (NOT EXISTS(SELECT 1 FROM sys.database_principals where name = @oldUser))
    BEGIN
        SET @msg = 'Source user ' + QUOTENAME(@oldUser) + ' doesn''t exists in database ' + @dbName
        RAISERROR(@msg, 11,1)
        RETURN
    END   

    INSERT INTO #output(command)
    SELECT '--Database Context' AS command UNION ALL
    SELECT    'USE' + SPACE(1) + @dbName UNION ALL
    SELECT 'SET XACT_ABORT ON'

    IF (ISNULL(@NewLoginName, '') <> '')
    BEGIN       
        SET @sql = N'USE ' + @dbName + N';
        IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = @newUser)
        BEGIN
            INSERT INTO #output(command)
            SELECT ''--Create user'' AS command

            INSERT INTO #output(command)
            SELECT 
                ''CREATE USER '' + QUOTENAME(@NewUser) + '' FOR LOGIN '' + QUOTENAME(@NewLoginName) +
                    CASE WHEN ISNULL(default_schema_name, '''') <> '''' THEN '' WITH DEFAULT_SCHEMA = '' + QUOTENAME(dp.default_schema_name)
                        ELSE ''''
                    END AS Command
            FROM sys.database_principals dp
            INNER JOIN sys.server_principals sp ON dp.sid = sp.sid
            WHERE dp.name = @OldUser
        END'

        EXEC sp_executesql @sql, N'@OldUser sysname, @NewUser sysname, @NewLoginName sysname', @OldUser = @OldUser, @NewUser = @NewUser, @NewLoginName=@NewLoginName
    END

    INSERT INTO #output(command)
    SELECT    '--Cloning permissions from' + SPACE(1) + QUOTENAME(@OldUser) + SPACE(1) + 'to' + SPACE(1) + QUOTENAME(@NewUser)


    INSERT INTO #output(command)
    SELECT '--Role Memberships' AS command

    SET @sql = N'USE ' + @dbName + N';
    INSERT INTO #output(command)
    SELECT ''EXEC sp_addrolemember @rolename ='' 
        + SPACE(1) + QUOTENAME(USER_NAME(rm.role_principal_id), '''''''') + '', @membername ='' + SPACE(1) + QUOTENAME(@NewUser, '''''''') AS command
    FROM    sys.database_role_members AS rm
    WHERE    USER_NAME(rm.member_principal_id) = @OldUser
    ORDER BY rm.role_principal_id ASC'

    EXEC sp_executesql @sql, N'@OldUser sysname, @NewUser sysname', @OldUser = @OldUser, @NewUser = @NewUser


    INSERT INTO #output(command)
    SELECT '--Object Level Permissions'

    SET @sql = N'USE ' + @dbName + N';
    INSERT INTO #output(command)
    SELECT    CASE WHEN perm.state <> ''W'' THEN perm.state_desc ELSE ''GRANT'' END
        + SPACE(1) + perm.permission_name + SPACE(1) + ''ON '' + QUOTENAME(USER_NAME(obj.schema_id)) + ''.'' + QUOTENAME(obj.name) 
        + CASE WHEN cl.column_id IS NULL THEN SPACE(0) ELSE ''('' + QUOTENAME(cl.name) + '')'' END
        + SPACE(1) + ''TO'' + SPACE(1) + QUOTENAME(@NewUser) COLLATE database_default
        + CASE WHEN perm.state <> ''W'' THEN SPACE(0) ELSE SPACE(1) + ''WITH GRANT OPTION'' END
    FROM    sys.database_permissions AS perm
        INNER JOIN
        sys.objects AS obj
        ON perm.major_id = obj.[object_id]
        INNER JOIN
        sys.database_principals AS usr
        ON perm.grantee_principal_id = usr.principal_id
        LEFT JOIN
        sys.columns AS cl
        ON cl.column_id = perm.minor_id AND cl.[object_id] = perm.major_id
    WHERE    usr.name = @OldUser
    ORDER BY perm.permission_name ASC, perm.state_desc ASC'

    EXEC sp_executesql @sql, N'@OldUser sysname, @NewUser sysname', @OldUser = @OldUser, @NewUser = @NewUser


    INSERT INTO #output(command)
    SELECT N'--Database Level Permissions'

    SET @sql = N'USE ' + @dbName + N';
    INSERT INTO #output(command)
    SELECT    CASE WHEN perm.state <> ''W'' THEN perm.state_desc ELSE ''GRANT'' END
        + SPACE(1) + perm.permission_name + SPACE(1)
        + SPACE(1) + ''TO'' + SPACE(1) + QUOTENAME(@NewUser) COLLATE database_default
        + CASE WHEN perm.state <> ''W'' THEN SPACE(0) ELSE SPACE(1) + ''WITH GRANT OPTION'' END
    FROM    sys.database_permissions AS perm
        INNER JOIN
        sys.database_principals AS usr
        ON perm.grantee_principal_id = usr.principal_id
    WHERE    usr.name = @OldUser
    AND    perm.major_id = 0
    ORDER BY perm.permission_name ASC, perm.state_desc ASC'

    EXEC sp_executesql @sql, N'@OldUser sysname, @NewUser sysname', @OldUser = @OldUser, @NewUser = @NewUser

    DECLARE cr CURSOR FOR
        SELECT command FROM #output

    OPEN cr

    FETCH NEXT FROM cr INTO @command

    SET @sql = ''

    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF (@printOnly IS NOT NULL)
            PRINT @command

        SET @sql = @sql + @command + CHAR(13) + CHAR(10)
        FETCH NEXT FROM cr INTO @command
    END

    CLOSE cr
    DEALLOCATE cr

    IF (@printOnly IS NULL OR @printOnly = 0)
        EXEC (@sql)

    DROP TABLE #output
END
GO
EXECUTE sp_ms_marksystemobject 'dbo.sp_CloneRights'
GO

1
  1. অবজেক্ট এক্সপ্লোরার-এ ডান ক্লিক ডাটাবেস
  2. কার্য-> স্ক্রিপ্টগুলি তৈরি করুন ...
  3. কেবল ব্যবহারকারী বিভাগ নির্বাচন করুন এবং উইজার্ডটি সমাপ্ত করুন

এখানে চিত্র বর্ণনা লিখুন

দ্রষ্টব্য: অবশেষে আপনি সমস্ত ব্যবহারকারীর তৈরির জন্য স্ক্রিপ্ট পাবেন এবং তাদের ভূমিকা প্রায় প্রস্তুত। কিন্তু এই দেওয়া স্ক্রিপ্ট তৈরী করবে না সম্পাদন সঞ্চিত পদ্ধতি অনুমতি এমনকি যদি আপনি নির্বাচন স্ক্রিপ্ট অবজেক্ট-স্তর অনুমতিগুলি সত্যতে।

এখানে চিত্র বর্ণনা লিখুন


1
এটি কাজ করবে না: এটি সঞ্চিত পদ্ধতিগুলিতে মৃত্যুদণ্ড প্রদানের জন্য স্ক্রিপ্ট তৈরি করবে না
সর্বাধিক

হ্যাঁ তুমিই ঠিক. আমি কিছু স্পেসিফিকেশন যোগ করেছি
ইমান আবিদি

0

@ কিন-শাহ এর দুর্দান্ত উত্তরের ভিত্তিতে, আমি একটি স্ক্রিপ্ট লিখেছিলাম, যা সমস্ত স্ক্রোল সার্ভারে সমস্ত ডাটাবেসের অনুমতি অনুলিপি করতে পারে । এটি অনেক খারাপ পাঠযোগ্য, তবে আপনার যদি অনেক ব্যবহারকারী এবং অনেক ডেটাবেস থাকে তবে এটি কার্যকর হতে পারে:

USE master
GO

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES r WHERE r.ROUTINE_NAME = 'clone_user')
DROP PROCEDURE clone_user
GO

CREATE PROCEDURE clone_user @database sysname, @OldUser sysname, @NewUser sysname AS BEGIN

DECLARE @sql nvarchar(max)
SET @sql = '

USE '+@database+'

DECLARE @database sysname = '''+@database+'''
DECLARE @OldUser sysname = '''+@OldUser+'''
DECLARE @NewUser sysname = '''+@NewUser+'''

SET NOCOUNT ON

SELECT  ''EXEC sp_addrolemember @rolename =''
    + SPACE(1) + QUOTENAME(USER_NAME(rm.role_principal_id), '''''''') + '', @membername ='' + SPACE(1) + QUOTENAME(@NewUser, '''''''') AS ''--Role Memberships''
INTO #roles
FROM    sys.database_role_members AS rm
WHERE   USER_NAME(rm.member_principal_id) = @OldUser
ORDER BY rm.role_principal_id ASC

SELECT  CASE WHEN perm.state <> ''W'' THEN perm.state_desc ELSE ''GRANT'' END
    + SPACE(1) + perm.permission_name + SPACE(1) + ''ON '' + QUOTENAME(USER_NAME(obj.schema_id)) + ''.'' + QUOTENAME(obj.name)
    + CASE WHEN cl.column_id IS NULL THEN SPACE(0) ELSE ''('' + QUOTENAME(cl.name) + '')'' END
    + SPACE(1) + ''TO'' + SPACE(1) + QUOTENAME(@NewUser) COLLATE database_default
    + CASE WHEN perm.state <> ''W'' THEN SPACE(0) ELSE SPACE(1) + ''WITH GRANT OPTION'' END AS ''--Object Level Permissions''
INTO #grant1
FROM    sys.database_permissions AS perm
    INNER JOIN
    sys.objects AS obj
    ON perm.major_id = obj.[object_id]
    INNER JOIN
    sys.database_principals AS usr
    ON perm.grantee_principal_id = usr.principal_id
    LEFT JOIN
    sys.columns AS cl
    ON cl.column_id = perm.minor_id AND cl.[object_id] = perm.major_id
WHERE   usr.name = @OldUser
ORDER BY perm.permission_name ASC, perm.state_desc ASC

SELECT  CASE WHEN perm.state <> ''W'' THEN perm.state_desc ELSE ''GRANT'' END
    + SPACE(1) + perm.permission_name + SPACE(1)
    + SPACE(1) + ''TO'' + SPACE(1) + QUOTENAME(@NewUser) COLLATE database_default
    + CASE WHEN perm.state <> ''W'' THEN SPACE(0) ELSE SPACE(1) + ''WITH GRANT OPTION'' END AS ''--Database Level Permissions''
INTO #grant2
FROM    sys.database_permissions AS perm
    INNER JOIN
    sys.database_principals AS usr
    ON perm.grantee_principal_id = usr.principal_id
WHERE   usr.name = @OldUser
AND perm.major_id = 0
ORDER BY perm.permission_name ASC, perm.state_desc ASC


IF EXISTS (SELECT * FROM #roles UNION ALL SELECT * FROM #grant1 UNION ALL SELECT * FROM #grant2) BEGIN
SELECT  ''USE ''+@database AS ''-- '+@database+'/'+@OldUser+''' INTO #tmp
SELECT * FROM #tmp UNION ALL SELECT * FROM #roles UNION ALL SELECT * FROM #grant1 UNION ALL SELECT * FROM #grant2
END

'

EXECUTE sp_executesql @sql

END

GO

EXEC sp_MSforeachdb 'EXECUTE [dbo].[clone_user] ?, ''OldUser'', ''NewUser'''

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