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 / 40844
Accepted
xpda
xpda
Asked: 2013-04-25 14:37:33 +0800 CST2013-04-25 14:37:33 +0800 CST 2013-04-25 14:37:33 +0800 CST

Depois de mover o banco de dados (backup, restauração), tenho que adicionar novamente o usuário

  • 772

Ocasionalmente, movo um banco de dados (SQL Express 2012) de uma máquina de desenvolvimento para um servidor, ou vice-versa, usando backup e restauração de banco de dados no SQL Server Management Studio.

Sempre que faço isso, os aplicativos na máquina de destino não podem acessar o banco de dados até que eu exclua o usuário que eles usam, "george", dos usuários do banco de dados (Banco de dados, Segurança, Usuários no SQL Server Management Studio) e o adicione novamente como proprietário em Segurança, Logins, george/propriedades, mapeamento de usuários.

Existe uma maneira melhor de fazer isso? Parece um pouco complicado.

sql-server backup
  • 6 6 respostas
  • 116670 Views

6 respostas

  • Voted
  1. Best Answer
    Mike Fal
    2013-04-25T14:52:29+08:002013-04-25T14:52:29+08:00

    Esta é a diferença entre logins e usuários e como eles se relacionam:

    • Logons - entidades de nível de instância que permitem que uma entidade se conecte à instância do SQL Server. Eles, por sua natureza, não concedem nenhum acesso aos bancos de dados da instância. A exceção a isso é que um logon com direitos sysadmin pode usar um banco de dados porque eles são sysadmin, mas devido às permissões de nível sysadmin.
    • Usuários - entidades de nível de banco de dados que permitem que uma entidade se conecte a um banco de dados SQL Server. Os usuários são associados a logins por meio de SIDs, criando um relacionamento entre os dois e permitindo que um login se conecte à instância e, em seguida, use o usuário associado para se conectar ao banco de dados.

    O que geralmente acontece com logins autenticados por SQL e usuários de banco de dados em uma restauração é que o SIDS ficará fora de sincronia, quebrando assim o relacionamento. Esse relacionamento deve ser reparado antes que você possa se conectar ao banco de dados usando esse logon, porque aos olhos do SQL Server essas entidades não estão mais conectadas. Você pode corrigir isso com o seguinte SQL:

    ALTER USER [foo] WITH LOGIN=[foo]
    

    Você pode usar a seguinte consulta no contexto de seu banco de dados para verificar se há órfãos:

    select
        dp.name [user_name]
        ,dp.type_desc [user_type]
        ,isnull(sp.name,'Orhphaned!') [login_name]
        ,sp.type_desc [login_type]
    from   
        sys.database_principals dp
        left join sys.server_principals sp on (dp.sid = sp.sid)
    where
        dp.type in ('S','U','G')
        and dp.principal_id >4
    order by sp.name
    
    • 71
  2. misha
    2017-09-27T00:17:20+08:002017-09-27T00:17:20+08:00

    Aqui está uma solução que funcionou para mim. O que ele faz é:

    1. Listar usuários órfãos:EXEC sp_change_users_login 'REPORT'
    2. Corrija os usuários:EXEC sp_change_users_login 'UPDATE_ONE','<userName>','<userName>'
    • 5
  3. Travis
    2013-04-25T15:10:43+08:002013-04-25T15:10:43+08:00

    Você pode procurar alterar o banco de dados para banco de dados independente . O usuário do banco de dados contido é autenticado pelo banco de dados, não no nível da instância por meio de login. Torna mais simples mover o banco de dados para diferentes instâncias.

    Caso contrário, você pode fazer backup das informações de logon usando scripts sp_help_revlogin fornecidos neste KB de suporte da Microsoft . E execute o script de saída na nova instância.

    • 4
  4. Peter Kudos
    2015-10-31T01:34:40+08:002015-10-31T01:34:40+08:00

    Eu uso o script abaixo para migrar/criar as contas de usuário e logins. Execute-o a partir do servidor para o qual você restaurou o banco de dados e forneça o nome do servidor original como um parâmetro para o procedimento.

    Não assumo nenhum crédito pelo procedimento, pois o obtive de outro lugar, mas funciona bem.

    USE [master]
    GO
    /****** Object:  StoredProcedure [dbo].[stp_Admin_ReplicateUserLogins]    Script Date: 10/29/2015 08:22:43 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    
    ALTER Procedure [dbo].[stp_Admin_ReplicateUserLogins] --'OriginalSourceDatabase', 1
        @PartnerServer sysname,
        @Debug bit = 0 -- 0 = Create Users, 1 = Display SQL command but doesn't execute query.
    As
    
    Declare @MaxID int,
        @CurrID int,
        @SQL nvarchar(max),
        @LoginName sysname,
        @IsDisabled int,
        @Type char(1),
        @SID varbinary(85),
        @SIDString nvarchar(100),
        @PasswordHash varbinary(256),
        @PasswordHashString nvarchar(300),
        @RoleName sysname,
        @Machine sysname,
        @PermState nvarchar(60),
        @PermName sysname,
        @Class tinyint,
        @MajorID int,
        @ErrNumber int,
        @ErrSeverity int,
        @ErrState int,
        @ErrProcedure sysname,
        @ErrLine int,
        @ErrMsg nvarchar(2048)
    Declare @Logins Table (LoginID int identity(1, 1) not null primary key,
                            [Name] sysname not null,
                            [SID] varbinary(85) not null,
                            IsDisabled int not null,
                            [Type] char(1) not null,
                            PasswordHash varbinary(256) null)
    Declare @Roles Table (RoleID int identity(1, 1) not null primary key,
                        RoleName sysname not null,
                        LoginName sysname not null)
    Declare @Perms Table (PermID int identity(1, 1) not null primary key,
                        LoginName sysname not null,
                        PermState nvarchar(60) not null,
                        PermName sysname not null,
                        Class tinyint not null,
                        ClassDesc nvarchar(60) not null,
                        MajorID int not null,
                        SubLoginName sysname null,
                        SubEndPointName sysname null)
    
    Set NoCount On;
    
    If CharIndex('\', @PartnerServer) > 0
      Begin
        Set @Machine = LEFT(@PartnerServer, CharIndex('\', @PartnerServer) - 1);
      End
    Else
      Begin
        Set @Machine = @PartnerServer;
      End
    
    -- Get all Windows logins from principal server
    Set @SQL = 'Select P.name, P.sid, P.is_disabled, P.type, L.password_hash' + CHAR(10) +
            'From ' + QUOTENAME(@PartnerServer) + '.master.sys.server_principals P' + CHAR(10) +
            'Left Join ' + QUOTENAME(@PartnerServer) + '.master.sys.sql_logins L On L.principal_id = P.principal_id' + CHAR(10) +
            'Where P.type In (''U'', ''G'', ''S'')' + CHAR(10) +
            'And P.name <> ''sa''' + CHAR(10) +
            'And P.name Not Like ''##%''' + CHAR(10) +
            'and P.Name Not like ''NT SERVICE%''' + CHAR(10) +
            'And CharIndex(''' + @Machine + '\'', P.name) = 0;';
    
    Insert Into @Logins (Name, SID, IsDisabled, Type, PasswordHash)
    Exec sp_executesql @SQL;
    
    -- Get all roles from principal server
    Set @SQL = 'Select RoleP.name, LoginP.name' + CHAR(10) +
            'From ' + QUOTENAME(@PartnerServer) + '.master.sys.server_role_members RM' + CHAR(10) +
            'Inner Join ' + QUOTENAME(@PartnerServer) + '.master.sys.server_principals RoleP' +
            CHAR(10) + char(9) + 'On RoleP.principal_id = RM.role_principal_id' + CHAR(10) +
            'Inner Join ' + QUOTENAME(@PartnerServer) + '.master.sys.server_principals LoginP' +
            CHAR(10) + char(9) + 'On LoginP.principal_id = RM.member_principal_id' + CHAR(10) +
            'Where LoginP.type In (''U'', ''G'', ''S'')' + CHAR(10) +
            'And LoginP.name <> ''sa''' + CHAR(10) +
            'And LoginP.name Not Like ''##%''' + CHAR(10) +
            'And LoginP.name Not Like ''NT SERVICE%''' + CHAR(10) +
            'And RoleP.type = ''R''' + CHAR(10) +
            'And CharIndex(''' + @Machine + '\'', LoginP.name) = 0;';
    
    Insert Into @Roles (RoleName, LoginName)
    Exec sp_executesql @SQL;
    
    -- Get all explicitly granted permissions
    Set @SQL = 'Select P.name Collate database_default,' + CHAR(10) +
            '   SP.state_desc, SP.permission_name, SP.class, SP.class_desc, SP.major_id,' + CHAR(10) +
            '   SubP.name Collate database_default,' + CHAR(10) +
            '   SubEP.name Collate database_default' + CHAR(10) +
            'From ' + QUOTENAME(@PartnerServer) + '.master.sys.server_principals P' + CHAR(10) +
            'Inner Join ' + QUOTENAME(@PartnerServer) + '.master.sys.server_permissions SP' + CHAR(10) +
            CHAR(9) + 'On SP.grantee_principal_id = P.principal_id' + CHAR(10) +
            'Left Join ' + QUOTENAME(@PartnerServer) + '.master.sys.server_principals SubP' + CHAR(10) +
            CHAR(9) + 'On SubP.principal_id = SP.major_id And SP.class = 101' + CHAR(10) +
            'Left Join ' + QUOTENAME(@PartnerServer) + '.master.sys.endpoints SubEP' + CHAR(10) +
            CHAR(9) + 'On SubEP.endpoint_id = SP.major_id And SP.class = 105' + CHAR(10) +
            'Where P.type In (''U'', ''G'', ''S'')' + CHAR(10) +
            'And P.name <> ''sa''' + CHAR(10) +
            'And P.name Not Like ''##%''' + CHAR(10) +
            'And P.name Not Like ''NT SERVICE%''' + CHAR(10) +
            'And CharIndex(''' + @Machine + '\'', P.name) = 0;'
    
    Insert Into @Perms (LoginName, PermState, PermName, Class, ClassDesc, MajorID, SubLoginName, SubEndPointName)
    Exec sp_executesql @SQL;
    
    
    
    Select @MaxID = Max(LoginID), @CurrID = 1
    From @Logins;
    
    While @CurrID <= @MaxID
      Begin
        Select @LoginName = Name,
            @IsDisabled = IsDisabled,
            @Type = [Type],
            @SID = [SID],
            @PasswordHash = PasswordHash
        From @Logins
        Where LoginID = @CurrID;
    
        If Not Exists (Select 1 From sys.server_principals
                    Where name = @LoginName)
          Begin
            Set @SQL = 'Create Login ' + quotename(@LoginName)
            If @Type In ('U', 'G')
              Begin
                Set @SQL = @SQL + ' From Windows;'
              End
            Else
              Begin
                Set @PasswordHashString = '0x' +
                    Cast('' As XML).value('xs:hexBinary(sql:variable("@PasswordHash"))', 'nvarchar(300)');
    
                Set @SQL = @SQL + ' With Password = ' + @PasswordHashString + ' HASHED, ';
    
                Set @SIDString = '0x' +
                    Cast('' As XML).value('xs:hexBinary(sql:variable("@SID"))', 'nvarchar(100)');
                Set @SQL = @SQL + 'SID = ' + @SIDString + ';';
              End
    
            If @Debug = 0
              Begin
                Begin Try
                    Exec sp_executesql @SQL;
                End Try
                Begin Catch
                    Set @ErrNumber = ERROR_NUMBER();
                    Set @ErrSeverity = ERROR_SEVERITY();
                    Set @ErrState = ERROR_STATE();
                    Set @ErrProcedure = ERROR_PROCEDURE();
                    Set @ErrLine = ERROR_LINE();
                    Set @ErrMsg = ERROR_MESSAGE();
                    RaisError(@ErrMsg, 1, 1);
                End Catch
              End
            Else
              Begin
                Print @SQL;
              End
    
            If @IsDisabled = 1
              Begin
                Set @SQL = 'Alter Login ' + quotename(@LoginName) + ' Disable;'
                If @Debug = 0
                  Begin
                    Begin Try
                        Exec sp_executesql @SQL;
                    End Try
                    Begin Catch
                        Set @ErrNumber = ERROR_NUMBER();
                        Set @ErrSeverity = ERROR_SEVERITY();
                        Set @ErrState = ERROR_STATE();
                        Set @ErrProcedure = ERROR_PROCEDURE();
                        Set @ErrLine = ERROR_LINE();
                        Set @ErrMsg = ERROR_MESSAGE();
                        RaisError(@ErrMsg, 1, 1);
                    End Catch
                  End
                Else
                  Begin
                    Print @SQL;
                  End
              End
            End
        Set @CurrID = @CurrID + 1;
      End
    
    Select @MaxID = Max(RoleID), @CurrID = 1
    From @Roles;
    
    While @CurrID <= @MaxID
      Begin
        Select @LoginName = LoginName,
            @RoleName = RoleName
        From @Roles
        Where RoleID = @CurrID;
    
        If Not Exists (Select 1 From sys.server_role_members RM
                    Inner Join sys.server_principals RoleP
                        On RoleP.principal_id = RM.role_principal_id
                    Inner Join sys.server_principals LoginP
                        On LoginP.principal_id = RM.member_principal_id
                    Where LoginP.type In ('U', 'G', 'S')
                    And RoleP.type = 'R'
                    And RoleP.name = @RoleName
                    And LoginP.name = @LoginName)
          Begin
            If @Debug = 0
              Begin
                Exec sp_addsrvrolemember @rolename = @RoleName,
                                @loginame = @LoginName;
              End
            Else
              Begin
                Print 'Exec sp_addsrvrolemember @rolename = ''' + @RoleName + ''',';
                Print '     @loginame = ''' + @LoginName + ''';';
              End
          End
    
        Set @CurrID = @CurrID + 1;
      End
    
    Select @MaxID = Max(PermID), @CurrID = 1
    From @Perms;
    
    While @CurrID <= @MaxID
      Begin
        Select @PermState = PermState,
            @PermName = PermName,
            @Class = Class,
            @LoginName = LoginName,
            @MajorID = MajorID,
            @SQL = PermState + space(1) + PermName + SPACE(1) +
                Case Class When 101 Then 'On Login::' + QUOTENAME(SubLoginName)
                        When 105 Then 'On ' + ClassDesc + '::' + QUOTENAME(SubEndPointName)
                        Else '' End +
                ' To ' + QUOTENAME(LoginName) + ';'
        From @Perms
        Where PermID = @CurrID;
    
        If Not Exists (Select 1 From sys.server_principals P
                    Inner Join sys.server_permissions SP On SP.grantee_principal_id = P.principal_id
                    Where SP.state_desc = @PermState
                    And SP.permission_name = @PermName
                    And SP.class = @Class
                    And P.name = @LoginName
                    And SP.major_id = @MajorID)
          Begin
            If @Debug = 0
              Begin
                Begin Try
                    Exec sp_executesql @SQL;
                End Try
                Begin Catch
                    Set @ErrNumber = ERROR_NUMBER();
                    Set @ErrSeverity = ERROR_SEVERITY();
                    Set @ErrState = ERROR_STATE();
                    Set @ErrProcedure = ERROR_PROCEDURE();
                    Set @ErrLine = ERROR_LINE();
                    Set @ErrMsg = ERROR_MESSAGE();
                    RaisError(@ErrMsg, 1, 1);
                End Catch
              End
            Else
              Begin
                Print @SQL;
              End
          End
    
        Set @CurrID = @CurrID + 1;
      End
    
    
    Set NoCount Off;
    
    • 3
  5. NKCSS
    2017-09-14T04:12:52+08:002017-09-14T04:12:52+08:00

    Você sempre pode tentar vincular novamente todos os usuários no banco de dados a logins com nomes semelhantes no servidor de banco de dados.

    ALTER 
        AUTHORIZATION
        ON 
            SCHEMA::db_owner
        TO 
            dbo
    GO
    
    DECLARE @username VARCHAR(64)
    DECLARE @sql nvarchar(max)
    
    DECLARE 
        UserCursor 
    CURSOR FOR 
        SELECT 
            [name]
        FROM 
            sysusers
        WHERE 
            [name] NOT IN('dbo','guest','INFORMATION_SCHEMA','sys','public')
            AND 
            LEFT([name],3) <> 'db_' 
            AND 
            [name] NOT LIKE '%]%'
    
    OPEN 
        UserCursor
    FETCH NEXT 
    FROM 
        UserCursor 
        INTO 
            @username
    WHILE @@fetch_status <> -1
    BEGIN
        SET @sql = 'ALTER USER [' + @username + '] WITH LOGIN=[' + @username + ']'
        PRINT @sql
        EXEC dbo.sp_executesql @sql;
        FETCH NEXT 
        FROM 
            UserCursor
            INTO 
                @username
    END
    CLOSE UserCursor
    DEALLOCATE UserCursor
    
    • 1
  6. Doreen
    2019-01-10T09:46:24+08:002019-01-10T09:46:24+08:00

    Achei que valia a pena notar essa simples correção para o problema dos pôsteres. Este é o script que executo no SQL Server 2008 quando restauro um banco de dados de produção de um servidor para o banco de dados de desenvolvimento/teste em outro servidor QUANDO o nome de Usuários está em Segurança > Usuários do banco de dados MAS 'login name'falta a propriedade de usuários no Guia geral:

    EXEC sp_change_users_login 'Auto_Fix','missingloginnamehere', NULL, 'passwordgoeshere';
    

    Referência do MSDN aqui Observe que o artigo recomenda o uso de ALTER USER em vez de versões mais recentes do SQL.

    • 1

relate perguntas

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Backups de banco de dados no Oracle - Exportar o banco de dados ou usar outras ferramentas?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

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

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

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • 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

    Conceder acesso a todas as tabelas para um usuário

    • 5 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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