AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 64567
Accepted
sweetritz
sweetritz
Asked: 2014-05-07 06:13:25 +0800 CST2014-05-07 06:13:25 +0800 CST 2014-05-07 06:13:25 +0800 CST

Como clonar um usuário no SQL Server 2008 R2?

  • 772

Existe uma maneira de clonar a segurança e as permissões dos usuários no Microsoft SQL Server, de preferência usando a GUI do SQL Server Management Studio?

sql-server sql-server-2008
  • 4 4 respostas
  • 50837 Views

4 respostas

  • Voted
  1. Best Answer
    Kin Shah
    2014-05-07T06:22:49+08:002014-05-07T06:22:49+08:00

    Nota: O script abaixo não define as permissões em nada, apenas cria o script que pode ser copiado e colado em uma nova consulta, que pode ser editada antes de ser executada.

    O script abaixo ajudará você a copiar/clonar permissões de um usuário para outro:

    --- 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
    
    • 43
  2. Max
    2016-02-03T07:40:39+08:002016-02-03T07:40:39+08:00

    Aqui está um script muito bom de Pavel Pawlowski para fazer o trabalho: http://www.pawlowski.cz/2011/03/cloning-user-rights-database/

    Principal vantagem:

    • script/copiar Associações de Função
    • script/copiar permissões de nível de objeto
    • script/copiar permissões de nível de banco de dados

    Eu não sou o autor deste script. O script é copiado e colado deste link no blog Pavel Pawlowski, veja o link para mais informações sobre como usar o script.

    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
    
    • 3
  3. slartidan
    2019-07-10T05:41:37+08:002019-07-10T05:41:37+08:00

    Com base na incrível resposta de @Kin-shah, escrevi um script que pode copiar permissões de todos os bancos de dados em uma instância do sql server. É muito pior legível, mas pode ser útil se você tiver muitos usuários e muitos bancos de dados:

    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
    
    • 2
  4. Iman
    2015-12-01T01:34:35+08:002015-12-01T01:34:35+08:00
    1. Clique com o botão direito do mouse no banco de dados no Pesquisador de Objetos
    2. Tarefas-> Gerar Scripts...
    3. Selecione a seção Somente usuários e conclua o assistente como está

    insira a descrição da imagem aqui

    Nota: finalmente você obtém o script para todas as criações de usuários e suas funções quase prontas. mas isso não criará script para conceder permissão de execução para procedimentos armazenados mesmo se você selecionar permissões de nível de objeto de script como true.

    insira a descrição da imagem aqui

    • 1

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Como determinar se um Índice é necessário ou necessário

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve