none
Falha de login após renomear banco de dados RRS feed

  • Pergunta

  • Boa tarde,

    Tudo funcionava perfeitamente até que resolvi renomear o banco através da propria tela no SQL Management. Coisa de principiante mesmo!

    Resultado agora não consigo mais logar sem que não me dê esse retorno:

    Essa msg aparece qdo tento, por exemplo, ver as propriedades do meu banco. Porém até mesmo para entrar no Management tive que logar pelo banco Master.

    Tudo isso ocorreu porque eu fazia um trabalho para esse meu banco  que se chama TESTE_BD, e após fazer um restore de outro banco chamado TESTE, apesar do management funcionar perfeitamente, quando tentava conectar através da minha aplicação em C# ele retornava esse erro:

    Alguem se habilita?

    Obrigado

    Pestana

    segunda-feira, 11 de julho de 2016 17:17

Respostas

  • Beto, isso não é uma string de conexão, isso é uma instrução de attach de banco de dados.

    O Attach é quando você já tem um arquivo MDF de um banco de dados (não um backup) mas ele não está no instancia do SQLServer e você quer "anexar", "incluir" ele no SQLServer.

    Você já tem esse banco de dados no SQLserver, você fez isso com o restore. Então, você está tentando incluir um banco de dados que já existe.

    Eu não conheço muito de C#, mas tem uma página do MSDN que tem um exemplo de conection string do C# para SQLServer.

    SqlConnection.ConnectionString

    SQL Server 2012 connection strings

    Aí acho que vale mais a pena você perguntar como fazer uma connection string do C# para o SQLServer no forum de .Net


    Fausto Fiorese Branco Database Specialist http://br.linkedin.com/in/faustobranco/ http://www.dbinternals.com.br

    • Marcado como Resposta BetoPestana terça-feira, 12 de julho de 2016 18:25
    terça-feira, 12 de julho de 2016 18:02

Todas as Respostas

  • Provavelmente você precisa alterar o default database do seu usuário, ele ainda deve estar apontado para o banco antigo.

    Fausto Fiorese Branco Database Specialist http://br.linkedin.com/in/faustobranco/ http://www.dbinternals.com.br

    segunda-feira, 11 de julho de 2016 18:09
  • Ok Fausto,

    Em options na tela de conexão do management, certo. Já havia feito isso. Ele até conecta mas mesmo assim manda a msg e se eu tentar criar outro banco manda a mesma msg.

    segunda-feira, 11 de julho de 2016 20:15
  • Como pode ser visto na imagem abaixo, alterando o default database em options ele loga mas apresentando a mensagem. Apesar de estar aparecendo conectado (no rodapé da imagem) caso eu dê um refresh no servidor ele volta com a msg. se eu tentar criar um BD novo, o mesmo. Como já havia dito, tudo começou quando eu tentei renomear diretamente na arvore do Management. Inclusive para deletar o banco antigo só consegui fazer atraves de uma query (DROP ...), pois com botao direito e delete dava a mesma msg de sempre (4064). No momento já até deletei os arquivos da pasta DATA (.mdf e .ldf).

    segunda-feira, 11 de julho de 2016 20:28
  • Esse erro 4064 é exatamente esse problema, mas pode ser causado também por users com nomes iguais e SIDs diferentes, vamos ver se pode ser esse problema.

    Cada Login tem um SID, que é um ID que o SQL usa e esse SID é replicado para os bancos quando você dá acesso. Por mais que o usuário tenha o mesmo nome, em outro servidor, o SID é diferente e se você restaura o banco vai ter a impressão que está tudo certo por conta do nome, mas para o SQL são usuários totalmente diferentes.

    O usuário que está no banco com SID X tem as permissões, mas o Login com SID Y não tem.

    Para validar isso execute no banco que está com problemas com um usuario administrativo:

    SELECT DB_NAME(),
           [A].[name] AS [des_Username],
           [A].[type_desc] AS [des_Type],
           [A].[type] AS [cod_Type]
      FROM [sys].[database_principals] AS [A]
           INNER JOIN [sys].[server_principals] AS [B] ON [A].[name] COLLATE Latin1_General_CI_AI = [B].[name] COLLATE Latin1_General_CI_AI
                                                          AND [A].[sid] <> [B].[sid]
     WHERE [A].[sid] <> 0x0
           AND [A].[type] NOT IN('R')
           AND [A].[name] NOT IN('dbo');

    Para corrigir isso você tem duas saidas, a mais drástica que é apagar o usuário do banco e cria-lo novamente, assim o SID passa a ser o mesmo do login do servidor.

    ou

    executar um Auto Fix:

    exec sp_change_users_login 'Auto_Fix', 'PKC-PC\PKC'


    Fausto Fiorese Branco Database Specialist http://br.linkedin.com/in/faustobranco/ http://www.dbinternals.com.br

    segunda-feira, 11 de julho de 2016 22:07
  • Boa tarde Fausto,

    fazendo a parte autofix, segundo a imagem não deu nenhum erro, mas após isso ainda não consigo criar um novo banco de dados. volta a msg 4064.

    Quanto à excluir o usuário, realmente está faltando coragem, pois ainda consigo consultar o banco chamado Teste.

    A primeira parte que vc explicou das permissões só não entendi em "fazer no banco que está com problema", pois ele não existe mais nem na árvore. Como te disse eu logo usando default database o banco master, onde mesmo vindo a msg de erro eu consigo consultar a tabela no banco Teste. Entendo que o meu problema não é mais em um banco e sim em algo geral, pois para ações comuns como criar novo banco de dados ou checar propriedades a msg de erro retorna.

    Outra informação é sempre loguei com Windows Authentication, sem senha.


    • Editado BetoPestana terça-feira, 12 de julho de 2016 15:04
    terça-feira, 12 de julho de 2016 15:02
  • Você não consegue executar esse sp_change_users_login no banco Teste? Tem que ser com usuário com privilégios de administrador ou db_owner... não adianta executar com o usuário PKC-PC\PKC, e tem que ser no banco Teste.

    Fausto Fiorese Branco Database Specialist http://br.linkedin.com/in/faustobranco/ http://www.dbinternals.com.br

    terça-feira, 12 de julho de 2016 15:55
  • Fausto, resolvi remover o SQLServer 2008 e instalar tudo do zero. Voltei ao meu problema inicial. Pra vc entender o ambiente é o seguinte:

    Estou numa aplicação com VS2012 onde tudo que é feito usando o banco NOVO_BD, funciona perfeitamente. Utilizei esse banco para testar o que eu queria fazer com uma tabela sem esperar o cliente me enviar a tabela que eu teria que de fato trabalhar. 

    Pois bem, o cliente me enviou um arquivo Teste.bkp o qual eu restaurei no SQL Management como pode ser visto na figura abaixo:

    Quando rodo a aplicação e uso os paths para esse novo banco aparece o seguinte erro no VS2012:

    Para que vc veja como estão os arquivos na pasta do SQL Server, veja:

    Na minha aplicação segue a imagem antes de rodar e aparecer o erro que dá na primeira imagem:

    Na verdade, todo o problema que deu origem ao post foi "futucando" para resolver esse problema que apresetei agora mais organizado.

    Tenho salvação?

    Obrigado

    terça-feira, 12 de julho de 2016 17:36
  • Vamos chegar lá. Mas só por curiosidade, porque a sua aplicação precisa do caminho do arquivo MDF? O que ela faz?

    Fausto Fiorese Branco Database Specialist http://br.linkedin.com/in/faustobranco/ http://www.dbinternals.com.br

    terça-feira, 12 de julho de 2016 17:41
  • Me pediram para "tratar" uma tabela gigante com 5.02 GB com cerca de 50 milhoes de linhas. Como não sou nenhum profissa em SQL Sysntax resolvi fazer uma lógica em C# utilizando alguns comandos básicos do SQL. 

    Uso o path só para alimentar a string de conexão com o banco dentro do VS2012.

    @"Server=PKC-PC; AttachDbFilename=C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Teste.mdf; Database=Teste; Trusted_Connection=Yes;"

    Me perdoe pela falta de elegância mas como disse inicialmente sou o curioso avançado em programação.

    terça-feira, 12 de julho de 2016 17:54
  • Beto, isso não é uma string de conexão, isso é uma instrução de attach de banco de dados.

    O Attach é quando você já tem um arquivo MDF de um banco de dados (não um backup) mas ele não está no instancia do SQLServer e você quer "anexar", "incluir" ele no SQLServer.

    Você já tem esse banco de dados no SQLserver, você fez isso com o restore. Então, você está tentando incluir um banco de dados que já existe.

    Eu não conheço muito de C#, mas tem uma página do MSDN que tem um exemplo de conection string do C# para SQLServer.

    SqlConnection.ConnectionString

    SQL Server 2012 connection strings

    Aí acho que vale mais a pena você perguntar como fazer uma connection string do C# para o SQLServer no forum de .Net


    Fausto Fiorese Branco Database Specialist http://br.linkedin.com/in/faustobranco/ http://www.dbinternals.com.br

    • Marcado como Resposta BetoPestana terça-feira, 12 de julho de 2016 18:25
    terça-feira, 12 de julho de 2016 18:02
  • Humm.. Vou checar e retorno.

    Obrigado

    terça-feira, 12 de julho de 2016 18:14
  • Fausto, usei essa abaixo e funcionou perfeitamente. 

    Muito obrigado pela ajuda.

    terça-feira, 12 de julho de 2016 18:25