Acesso negado ao anexar um banco de dados


146

Estou usando o SQL Server 2008 developer edition. Eu estava tentando anexar o banco de dados AdventureWorks2008.

Quando tentei anexar, recebi um erro "acesso negado". De acordo com o log de eventos, ele veio do sistema operacional:

Falha na abertura: não foi possível abrir o arquivo D: \ ProjectData \ AdventureWorks \ AdventureWorksLT2008_Data.mdf para o arquivo número 0. Erro no SO: 5 (acesso negado.).

Eu pensei "problema no NTFS", mas o Sistema (e eu) modificamos o acesso aos dois arquivos.

Descobri que posso anexar o banco de dados com êxito se fizer login como sa, mas minha conta de usuário não funcionará.

Sou membro do grupo de administradores locais na minha máquina e estou na função sysadmins na instância do SQL Server.

Alguma idéia de por que eu tive que fazer login como sa?


O arquivo MDF é criptografado por acaso?
Brettski

Não - a verdadeira curiosidade para mim é que funcione bem se eu fizer logon como sa (usando o Management Studio), mas não funcionará se eu usar minha conta de administrador local. Minha conta é um administrador, um administrador de domínio e foi a conta na qual eu estava conectado quando instalei o SQL Server (durante a instalação, havia uma opção para tornar minha conta atual um administrador de sistema, e fiz isso).
21710 JMarsch

1
É assim que o UAC funciona no W7, sem surpresa.
Al Kepp

@ AlKepp Nope - não é uma coisa do UAC. Apenas o login como sa corrige (conta do servidor SQL, não tem nada a ver com o UAC) o problema. Além disso, apenas por ser membro do grupo de administradores locais, recebo minhas permissões - não preciso elevar para que minhas credenciais do AD funcionem.
JMarsch

Respostas:


162

Execute o SQL Server Management Studio como administrador. (clique direito-> executar como administrador) que cuidou de toda a estranheza no meu caso.

SQL SRV EXPRESS 2008 R2. Windows 7


5
A execução do Management Studio como administrador NÃO funcionou para mim. Este erro ocorre ao tentar iniciar o serviço do Windows.
Nzololilo

9
A execução como administrador é o primeiro passo. A segunda etapa é fazer logon no SQL Server pela autenticação do Windows. (Este método funcionou para mim!)
Furkan Ekinci

3
Trabalhou para mim também. Não é possível expressar em palavras o quão cansativo e frustrante os prompts e erros de permissão são no Windows. EU SOU UM ADMINISTRADOR!
David Masters

Trabalhou para mim também. No começo, não achei que funcionaria porque o SSMS é apenas um cliente de interface do usuário. Eu pensei que precisava que o serviço fosse executado como administrador. Mas executar o SSMS como administrador é suficiente.
Luke Vo

2
Trabalhou para mim também. SQL Server 2019, SSMS 18.4
Ryan Thomas

104

Obrigado por todos os comentários. Alguns de vocês ajudaram a me levar à resposta. Aqui está o que eu encontrei:

Era um problema de permissão NTFS, e não um problema de SQL. Além disso, parece um tipo de bug (e é repetível).

O problema: a conta que eu estava usando tinha permissões NTFS de controle total para os arquivos mdf e ldf. No entanto, ele tinha essas permissões por meio da associação ao grupo (o grupo Administradores Locais tinha permissões e minha conta é membro de administradores locais). (Verifiquei as permissões)

Se eu tentar fazer a conexão, conecte-me ao SQL Server como eu (onde estou no grupo de administradores), ele falhará com o problema do NTFS.

No entanto, se eu conceder as mesmas permissões de arquivo que o grupo de administradores local possui diretamente à minha conta de domínio, posso anexar sem problemas.

(sim, verifiquei os grupos locais nesta máquina e verifiquei que minha conta de domínio é realmente um membro do grupo de administradores locais).

Portanto, parece que o erro ocorre porque algum código (no SQL Server ou no Management Studio) verifica as permissões que a conta do usuário possui, mas não chega a verificar as permissões do grupo que a conta do usuário herda.

Isso me parece estranho, mas eu posso reproduzi-lo repetidamente, então concluí que é a resposta.

Atualização: relatei isso como um bug: https://connect.microsoft.com/SQLServer/feedback/details/539703/access-denied-attaching-a-database-when-permissions-are-inherited


104
Se, como eu, você estiver usando o Windows 7, precisará executar o SQL Server Management Studio como administrador para evitar esse erro.
Antony

4
Reproduzido no Win7 Pro usando o SS2008 Express. Mesmo problema para o sqlcmd e o SSMS. == Meldung '5120', Ebene '16', Status '101', Servidor 'DAGO \ SQLEXPRESS', Zeile 1 - 'Die fisische Datei' D: \ data \ mssql \ drei.mdf 'kann nicht geöffnet werden. Betriebssystemfehler 5: '5 (Zugriff verweigert) == Conceder acesso total ao usuário (que é membro do grupo de administradores local, que tem acesso) corrige o problema. Além disso, a execução de sqlcmd (ou SSMS, eu acho) como Administrador não produz esse erro.
Lumi

1
Anthony Highsky tem a resposta. Só precisa ter certeza de executar o Management Studio como administrador.
James

Mesmo problema e solução para mim. 2008R2, Win 7, etc. Acabei de me adicionar explicitamente à lista de segurança e funcionou. Suponho que o SQL Server possa lê-los, uma vez anexado, mas não sob minhas credenciais ao anexar?
Andrew Backer #

4
A execução do Management Studio como administrador NÃO funcionou para mim. Este erro ocorre ao tentar iniciar o serviço do Windows.
Nzololilo

20

Gostaria de adicionar informações adicionais às respostas postadas.

Cuidado ao desanexar o banco de dados, pois o usuário do Windows no qual você está conectado se torna o único usuário com permissões para o arquivo .mdf! As permissões originais do arquivo .mdf, que incluíam o usuário SQLServerMSSQLUser$<computer_name>$<instance_name>e a conta Administradores, são substituídas pelo usuário do Windows em que você está conectado (e não pelo usuário do servidor sql). Boom, todas as permissões foram assim. Faça o que os outros disseram e clique com o botão direito do mouse no arquivo .mdf e verifique as permissões.

Corri para esse problema porque usei o SSMS para conectar-se ao banco de dados (não importa qual conta do servidor sql) e desanexei o banco de dados. Depois de fazer isso, meu usuário do Windows era o único que tinha permissões para o arquivo .mdf. Então, mais tarde, quando tentei anexar o banco de dados usando a conta sa, ele lançou o erro "acesso negado".

Para manter as permissões originais intactas, você deve colocar o banco de dados offline, desanexar e anexar nessa ordem da seguinte maneira:

USE [master]
GO
-- kick all users out of the db
ALTER DATABASE mydb
SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO

-- Take the Database Offline
ALTER DATABASE mydb SET OFFLINE WITH
ROLLBACK IMMEDIATE
GO

-- detach the db
EXEC master.dbo.sp_detach_db @dbname = N'mydb'
GO

1
Obrigado por isso! Eu acho que é muito mais fácil acertar se você também estiver conectado usando uma conta autenticada do SQL Server com privilégios de administrador de servidor.
William Rose

Infelizmente, isso não me ajuda se eu originalmente criei o banco de dados como 'sa' em vez de como usuário do Windows
David Gardiner

"Cuidado ao desconectar o banco de dados". Diga ao SSMS para ter cuidado. Meus problemas ocorreu porque usando SSMS o comando Copiar banco de dados falhou me deixando na cidade de eixo com nenhuma explicação
Alan Macdonald

18

Adicione permissão à pasta onde está o seu .mdfarquivo.

Verifique este nome: NT Service\MSSQLSERVER

E mude Locationpara o nome do seu servidor.


5
Para encontrar o nome da conta exata, uma vez que pode variar de caso para caso, execute o seguinte: SELECT servicename, service_account FROM sys.dm_server_services.
Arve Systad

13

Esse problema é causado pelo UAC (controle de conta de usuário), não é? Embora sua conta de usuário seja membro do grupo Administradores, o UAC no Windows 7 não permite que você faça coisas de administrador, a menos que execute programas "como administrador". Não é um bug real no SQL Server ou no Management Studio ou o que for. (Embora ele possa conhecer o problema e solicitar permissões elevadas em vez de apenas reclamar do "erro 5").


11

Execute o SQL Server Management Studio como administrador. (clique direito-> executar como administrador) funcionou para mim com o Windows 7 - SQL server 2008 R2


1
Esta resposta deve ser votada. A execução do SSMS como administrador é uma solução alternativa que replica essa resposta. A Microsoft relata isso como "comportamento esperado" aqui: link
FreeText

Não é o mesmo que a resposta de MandoMando?
mortb 25/10/19

10

Um banco de dados SQL2005 pode ser anexado dessa maneira no Windows 7:

start menu >
 all program >
  Microsoft sql server 2005 >
   sql server management studio >
    right click >
     run as administrator >
      click ok

E o banco de dados anexado foi concluído com êxito.


Isso funcionou com o SQL Server 2016 com o Management Studio 2008 R2 no Windows 10 :)
par

9

Quando você faz login como sa(ou qualquer conta do Sql Server), você está funcionando como a conta de serviço do SQL Server; quando está conectado como você, você tem as permissões da sua conta. Por alguma razão, você não tem o acesso apropriado a arquivos, mas a conta de serviço possui.


O problema do NTFS foi a primeira coisa que pensei, mas esse não parece ser o problema: sou membro do grupo de administradores locais e verifiquei que os administradores têm permissões de "controle total" nos arquivos mdf e ldf . Além disso, sou o proprietário dos arquivos - eu havia acabado de criar um diretório e copiado os arquivos mdf / ldf para o local deles.
JMarsch

@JMarsch: @Nick está dizendo que 'sa' tem um conjunto de DIREITOS SQLSERVER - não direitos NTFS - que sua conta não possui.
Trevoke

@ Trevevoke: estou com você. Se for esse o caso, quais direitos eu precisaria atribuir à minha conta de usuário? (Eu já estou atribuído à função sysadmin)
JMarsch

1
Resposta antiga, essa, mas para pessoas como eu há cinco minutos: você pode encontrar o nome de usuário exato do serviço executandoSELECT servicename, service_account FROM sys.dm_server_services
Arve Systad 7/16

6

Encontrei esta solução: Clique com o botão direito do mouse na pasta em que você armazena o arquivo .mdf -> clique em Propriedades -> escolha a guia Segurança, clique em Editar ... e conceda controle total. Espero que isto ajude!


5

O sausuário usa contas NTFS SQLServerMSSQLUser$<computer_name>$<instance_name>e SQLServerSQLAgentUser$<computer_name>$<instance_name>para acessar os arquivos do banco de dados. Você pode tentar adicionar permissões para um ou ambos os usuários.

Não sei se resolve o seu problema, pois você diz que não tem problemas com o sausuário, mas espero que ajude.


5

Comigo - Em execução na janela 8 - Clique em SQL Server Manager Studio -> Executar com o administrador. -> anexar sem problemas


5

Ele pode ser corrigido com facilidade, mas de maneira radical, basta ir para a pasta onde você armazenou o arquivo mdf . selecione arquivo-> clique com o botão direito do mouse -> clique em propriedades e dê permissões totais para arquivar para a segurança do usuário conectado .


3

Sempre que me deparei com esse problema, ao tentar anexar um banco de dados que esteja em um diretório diferente do diretório de banco de dados padrão configurado no SQL Server.

Eu recomendo que, em vez de conceder permissões em vários diretórios e contas, você simplesmente mova seu arquivo de dados para o diretório que o servidor sql espera encontrar.


Em muitas situações, eu concordo com o seu argumento, mas com o SQL Server, muitas vezes você deseja localizar seus bancos de dados em diferentes eixos ou volumes para aumentar a escalabilidade. De fato, é uma prática comum colocar o log de transações em um eixo separado do banco de dados para melhorar o rendimento da transação.
precisa saber é o seguinte

@JMarsch: Sim .. os diretórios são realmente configurável para obtener as Propriedades do Servidor> guia banco de dados Configurações de dados padrão e locais log ...
NotMe

Isso abrange padrões, mas isso é apenas padrões. É completamente aceitável colocar dbs em outro lugar, e realmente nem isso é incomum se você tiver seu servidor gerenciando mais de um banco de dados usado ativamente.
JMarsch

Eu tenho esse mesmo problema, mesmo com o diretório padrão do servidor sql: c: \ Arquivos de programas \ Microsoft SQL Server \ MSSQL10_50.SPATIAL_IM \ MSSQL \ DATA \ mydb.mdf no win7.
goku_da_master 26/10/11

3

Eu só queria adicionar essa informação também.

http://www.mssqltips.com/sqlservertip/2528/database-attach-failure-in-sql-server-2008-r2/

Solução

Você recebe esse erro porque dois logons diferentes fizeram as operações de desanexar e anexar. Portanto, os arquivos, quando desanexados, pertenciam ao primeiro logon, mas a conexão falhou porque o logon usado não era o proprietário dos arquivos mdf e ldf.

Quando desanexamos arquivos do banco de dados, o proprietário se torna a pessoa que executou o comando desanexar. Para resolver o problema, precisamos alterar ou adicionar o outro logon como proprietário dos arquivos mdf e ldf.

Clique com o botão direito do mouse no arquivo "filename.mdf" e selecione Propriedades para verificar as permissões do arquivo mdf. Aqui podemos ver que apenas uma conta tem permissão para o arquivo "filename.mdf" porque essa foi a conta usada para desanexar o banco de dados.

Para resolver esse problema, clique no botão Adicionar ... para adicionar o outro logon ou qualquer outro logon necessário e dar o controle total do logon. Você deve fazer isso no arquivo "ldf" também. Depois de concluir esta tarefa, clique no botão OK. (Observe que para outras versões do sistema operacional, você pode ter uma opção Editar, clique nela primeiro e depois verá a opção Adicionar ...).


Alterei minha conexão no SSMS para corresponder ao usuário que executou a desanexação e pude executar a conexão.
glitzsfa

2

Pelo que vale a pena para alguém que tenha a variação específica desse problema que eu tive:

  • SQL Express 2008
  • Visual Studio 2010 Premium

Através do menu de contexto da pasta App_data, eu criei um banco de dados SQL Express para fins de depuração. A cadeia de conexão (usada pelo NHibernate) foi a seguinte:

Server=.\SQLExpress;
AttachDbFilename=|DataDirectory|DebugDatabase.mdf;
Database=DebugDatabase;
Trusted_Connection=Yes;

Isso me deu o mesmo erro "Acesso negado" no arquivo do banco de dados. Tentei dar a vários usuários controle total para a pasta e os arquivos, a certa altura, até "Todos". Nada ajudou, então removi as permissões adicionadas novamente.

O que finalmente resolveu foi abrir o Server Explorer no Visual Studio, conectar-se ao MDF e desanexá-lo novamente. Depois que eu fiz isso, meu aplicativo Web pôde acessar o banco de dados muito bem.

PS. Os créditos vão para esta postagem do blog que encontrei ao pesquisar esse problema em particular, acionando a idéia de anexar / desanexar o banco de dados para resolver o problema.


2

Movi um banco de dados mdf da pasta Data padrão para a pasta asp.net app_data e me deparei com esse problema ao tentar definir o banco de dados novamente online.

Comparei as configurações de segurança dos outros bancos de dados de arquivos no local original com os arquivos movidos e notei que o MSSQL $ SQLEXPRESS não recebeu permissões para os arquivos em seu novo local. Adicionei controle total para "NT SERVICE \ MSSQL $ SQLEXPRESS" (deve incluir esse NT SERVICE) e ele foi anexado perfeitamente.

Parece que a pasta Dados original tem essas permissões e os arquivos a herdam. Mova os arquivos e as quebras de herança, é claro.

Verifiquei o arquivo mdf de outro projeto que criei diretamente na pasta app_data. ele não tem permissões MSSQL $ SQLEXPRESS. Hummm. Gostaria de saber por que o SQL Express gosta de um, mas não do outro?


Esta solução funcionou para mim no Windows 10 e no SQL Server 2017 ao mover um arquivo de log para um disco separado. No meu caso, o nome de usuário era "NT SERVICE \ MSSQLSERVER"
John Hanley

1

Isso soa como permissões NTFS. Geralmente, isso significa que sua conta de serviço do SQL Server tem acesso somente leitura ao arquivo (observe que o SQL Server usa a mesma conta de serviço para acessar arquivos de banco de dados, independentemente de como você faz logon). Tem certeza de que não alterou as permissões da pasta entre o login como você mesmo e o login como sa? Se você desconectar e tentar novamente, ele ainda tem o mesmo problema?


No meu caso, não - refiz isso vezes de servidor para ter certeza. O problema era que minha conta só tinha acesso aos arquivos por meio de um nível de indireção - eu era membro do grupo Administrador de Domínio. O administrador de domínio era membro do grupo Administradores locais na máquina e os administradores locais (e sistema) tinham controle total da pasta. (então havia 2 níveis de indireção de grupo). Se eu atribuísse permissões diretamente a mim mesmo, funcionasse, se eu as removesse, ainda era possível copiar / excluir os arquivos do Explorere etc., mas o SQL Server não poderia carregá-los.
JMarsch

Ao tentar anexar o banco de dados. Efetue login como Windows authenticated usernos ajudará a superar a permissão nos arquivos do banco de dados. (Nesse caso, a instância do MS SQLServer em disco possui o sistema operacional Windows).
Do Nhu Vy

1

Eu tive o mesmo problema ao anexar um banco de dados. Não era um problema de SQL, era um problema de conta. Vá para o painel de controle / Configurações de controle de conta de usuário / Defina como "nunca notificar". Finalmente, reinicie o computador e funcionou para mim.


1

Anexei o arquivo mdf clicando com o botão direito do mouse no banco de dados e removendo o arquivo de log AdventureWorks2012_Data_log.ldf no assistente. O arquivo mdf foi colocado no seguinte local

    C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA

O método acima me ajudou a resolver o problema.


1

Eu estava lendo esta página e eles têm uma frase interessante lá:

Cuidado: Seja muito seletivo ao adicionar usuários a essas funções. Por exemplo, o sysadmin mapeia para o dbo em todos os bancos de dados e é o equivalente a efetuar login usando a conta sa.

Claro, eles também têm isso:

Permissões concedidas a usuários e funções e são específicas do banco de dados. Todas as permissões são cumulativas, com exceção de um DENY. Uma permissão negada no nível do usuário ou no nível da função substitui a mesma permissão concedida por outras associações de função, com exceção da função de servidor fixa sysadmin. (Um administrador de sistema mantém todas as permissões, mesmo que uma função da qual ele seja membro tenha uma permissão DENY.)

Portanto, se você é um administrador de domínio e no grupo 'sysadmin' do SQL, o mundo deve ser o seu crustáceo.

Obviamente, de acordo com a Microsoft, você deve dar uma olhada rápida nessas duas páginas:
Link para os pré-requisitos do banco de dados

Link para instalação de bancos de dados

Você está sendo malcriado e tentando anexá-los manualmente :) Sério, você tem todos os pré-requisitos para o banco de dados AdventureWorks2008?
Suspeito que este seja apenas outro caso de estranheza / borda da Microsoft, mas posso estar errado.


+1 porque seu comentário me ajudou a encontrar a resposta. Vou postar minhas descobertas neste tópico. BTW (Eu estava sendo "impertinente" devido a políticas muito estranhas em que trabalho - o banco de dados adventureworks é distribuído como exe. Não consigo baixar o exe. (Posso baixar arquivos zip e arquivos MSI, por isso não vejo como a filtragem do exe realmente funciona de outra maneira que não atrapalhe, mas essas são as regras.) De qualquer forma, eu poderia obter os arquivos mdf brutos como zips do codeplex, e foi aí que me deparei com essa pequena curiosidade.
JMarsch

1

insira a descrição da imagem aqui

USE [master]
GO
CREATE DATABASE [DataBasename] ON 
( FILENAME = N'C:\data\DataBasename.mdf' )
 FOR ATTACH
GO

mude para FOR ATTACH -> FOR ATTACH_FORCE_REBUILD_LOG

USE [master]
GO
CREATE DATABASE [DataBasename] ON 
( FILENAME = N'C:\data\DataBasename.mdf' )
 FOR ATTACH_FORCE_REBUILD_LOG
GO

Obrigado, você salvou meu dia
Shahrokhian

1

Eu recebi esse erro como sa. No meu caso, a segurança do banco de dados não importava. Adicionei controle total a todos os arquivos mdf e ldf e o anexo correu bem.


1

Eu estava enfrentando o mesmo problema no VS 2019. Se alguém ainda estiver enfrentando o mesmo problema, verifique se você tem / faz o seguinte:

  1. Você deve ter o SQL Express instalado no seu m / c
  2. Deve ter o SSDT instalado no VS (no VS 2019 - verifique este componente durante a instalação) para versões anteriores - você deve adicionar esse componente externamente
  3. Adicione 'User Instance = True' à sua string de conexão
  4. Eu acho que é opcional - abra o VS e o SQL Express no modo administrativo e faça o login como administrador no SQL Express

0

Na verdade, são permissões NTFS e um bug estranho no SQL Server. Não tenho certeza se o relatório de bug acima é preciso ou pode se referir a um bug adicional.

Para resolver isso no Windows 7, executei o SQL Server Management Studio normalmente (não como administrador). Eu tentei anexar o arquivo MDF. No processo, usei a interface do usuário em vez de colar no caminho. Percebi que o caminho estava isolado de mim. Isso ocorre porque o usuário do MS SQL Server (SQLServerMSSQLUser $ machinename $ SQLEXPRESS) que o software adiciona para você não tem permissão para acessar a pasta (nesse caso, uma pasta nas minhas próprias pastas de usuário).

Colar o caminho e continuar resulta no erro acima. Então - eu dei ao usuário do MS SQL Server permissões para ler a partir do primeiro diretório do qual foi negado (minha pasta de usuário). Em seguida, cancelei imediatamente a operação de propagação porque ela pode levar uma eternidade e apliquei novamente as permissões de leitura para a próxima subpasta necessária, deixando a propagação completa.

Finalmente, dei ao usuário do MS SQL Server permissões de modificação para os arquivos .mdf e .ldf do banco de dados.

Agora posso anexar aos arquivos do banco de dados.


0

Se você executar o sql server 2012, poderá obter esse erro tentando anexar uma versão mais antiga de um arquivo mdf. ex um arquivo mdf do sql server 2008.


Eu acho que essa parte foi relativamente auto-explicativa. seria bom saber como resolver isso.
dansan

0

Para solucionar o problema, basta mover o arquivo .mdf que você deseja anexar à pasta pública; no meu caso, movi-o para a pasta users / public. Então eu anexo a partir daí sem nenhum problema. Espero que isto ajude.


0

Para aqueles que não conseguiram resolver o problema com as outras soluções aqui, a seguinte correção funcionou para mim:

Vá para a pasta "DADOS" na instalação do SQL Server, clique com o botão direito do mouse, propriedades, guia segurança e adicione permissões de controle total para o usuário "SERVIÇO DE REDE".

http://decoding.wordpress.com/2008/08/25/sql-server-2005-expess-how-to-fix-error-3417/

(O link acima é para o SQL 2005, mas isso corrigiu uma instalação do SQL 2008 R2 para mim).

Algumas informações adicionais: Esse problema apareceu para mim depois de substituir um disco rígido secundário (em que a instalação do SQL estava ativada). Copiei todos os arquivos e restaurei a letra da unidade original no novo disco rígido. No entanto, as permissões de segurança não foram copiadas. Acho que da próxima vez usarei um método melhor de copiar dados.


0

No meu caso, o que resolveu o problema foi o seguinte:

USE [master]
GO
CREATE DATABASE [AdventureWorks2008R2] ON
( FILENAME = 'C:\Program Files\Microsfot SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\AdventureWors2008R2_Data.mdf')
FOR ATTACH_REBUILD_LOG

0

Copie o banco de dados para outra pasta e anexe ou efetue login no SQLServer com "Autenticação do Windows"

insira a descrição da imagem aqui


0

Eu tive o mesmo problema ao anexar novamente o banco de dados após desanexá-lo e mover arquivos ldf e mdf da unidade C para F.

Para corrigi-lo, tive que adicionar o principal OWNER RIGHTS aos dois arquivos e dei controle total sobre eles na guia Segurança da caixa de diálogo Propriedades.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.