MSSQL 오류 '기본 공급자가 Open에서 실패했습니다'


220

나는 사용하던 .mdfA를 연결하는database 하고 entityClient. 이제 .mdf파일 이 없도록 연결 문자열을 변경하고 싶습니다 .

다음이 connectionString맞습니까?

<connectionStrings>
   <!--<add name="conString" connectionString="metadata=res://*/conString.csdl|res://*/conString.ssdl|res://*/conString.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SQL2008;AttachDbFilename=|DataDirectory|\NData.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />-->
   <add name="conString" connectionString="metadata=res://*/conString.csdl|res://*/conString.ssdl|res://*/conString.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SQL2008;Initial Catalog=NData;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

항상 오류가 발생하기 때문에 :

기본 공급자가 Open에서 실패했습니다


2
IIS에서 실행하려고 할 때 동일한 문제가 있습니다. VS 서버에서 실행하면 오류가 발생하지 않습니다.
Zote

11
나는 같은 문제가 있었고 Integrated Security연결 문자열 에서 제거 하고 사용자를 만들고 sysadmin권한 이 있는지 확인하고 해당 사용자를 연결 문자열에 추가했습니다.
fulvio

DB가있는 곳은 IIS에 호스팅 된 응용 프로그램에있는 경우 DB를 App_Data 폴더에 놓고 Entityframework 모델에 의해 생성 된 연결 문자열을 편집하여 거기서 찾아야합니다. stackoverflow.com/questions/9809442/…
eran otzap

이 문제가 있었고 연결 문자열에 암호를 삽입하여 해결되었습니다.
satyrFrost 4

IIS에서 실행될 때 간단히 통합 보안을 제거하면 도움이됩니다.
Jon

답변:


215

이 오류가 발생하여 몇 가지 해결책을 찾았습니다.

연결 문자열을 보면 유효 해 보입니다. 이 블로그 게시물을 찾았 는데 여기서 문제는 통합 보안 을 사용하고 있다는 것 입니다. IIS에서 실행중인 경우 IIS 사용자는 데이터베이스에 액세스해야합니다.

Transactions와 함께 Entity Framework 사용하는 경우 Entity Framework 는 각 데이터베이스 호출과의 연결을 자동으로 열고 닫습니다. 따라서 트랜잭션을 사용할 때 여러 연결을 통해 트랜잭션을 분산 시키려고합니다. 이것은 MSDTC로 상승 .

( 자세한 내용은이 참조를 참조하십시오. )

내 코드를 다음과 같이 수정했습니다.

using (DatabaseEntities context = new DatabaseEntities())
{
    context.Connection.Open();
    // the rest
}

7
Linq를 사용하여 테이블에 액세스 할 때 어떻게해야합니까 (EF4 사용)?
Brett Rigby

2
@Brett Rigby : stackoverflow.com/questions/794707/… Linq / EF에서이를 수행하는 방법을 설명합니다.
Scott Stafford

63
EF / DBContext를 사용하는 경우 올바른 호출은 context.Database.Connection.Open ();
라이브 사랑

2
처음 발견했을 때 코드를 감추지 않고 게시물을 읽었 으면합니다. 이 답변에서 지적한 내 문제는 CRM 2011 플러그인 컨텍스트의 AppPool 사용자가 내가 설정 한 데이터베이스에 대한 쓰기 권한이 없다는 것입니다. 사용자를 SQL에 추가하면 플러그인이 매력처럼 작동했습니다.
Mike_Matthews_II

2
내가 만든 컨텍스트의 이름을 딴 구성에 연결 문자열이 없었습니다 ....도 확인하십시오.
Bill Blankenship

38

context.Connection.Open() 내 문제를 해결하는 데 도움이되지 않았으므로 DTC 구성에서 "원격 클라이언트 허용"을 사용하려고 시도했지만 더 이상 오류가 없습니다.

Windows 7에서는 dcomcnfg, 구성 요소 서비스-> 컴퓨터-> 내 컴퓨터-> 분산 트랜잭션 코디네이터-> 로컬 DTC-> 보안을 마우스 오른쪽 단추로 실행하여 DTC 구성을 열 수 있습니다.


11
Windows 7에서는 dcomcnfg , 구성 요소 서비스-> 컴퓨터-> 내 컴퓨터-> 분산 트랜잭션 코디네이터-> 로컬 DTC-> 보안을 마우스 오른쪽 단추로 실행하여 DTC 구성을 열 수 있습니다 .
kerem

7
실제로 로컬 DTC를 마우스 오른쪽 버튼으로 클릭입니다 -> 속성 -> 보안
오토 Abnormalverbraucher

27

당신은 볼 수 의 InnerException가 오류로 던지는의 내부 원인이 무엇인지 확인합니다.

필자의 경우 원래 오류는 다음과 같습니다.

실제 파일 "D : \ Projects2 \ xCU \ xCU \ App_Data \ xCUData_log.ldf"를 열 수 없습니다. 운영 체제 오류 5 : "5 (액세스가 거부되었습니다." "). 파일 D : \ Projects2 \ xCU \ xCU \ App_Data \ xCUData.mdf에 대해 자동 명명 된 데이터베이스를 연결하지 못했습니다. 이름이 같은 데이터베이스가 있거나 지정된 파일을 열 수 없거나 UNC 공유에 있습니다.

파일 속성을 사용하여 관련 mdfldf파일 에 액세스하기 위해 현재 사용자에게 모든 권한을 부여하여 해결되었습니다 .


24

문제는 다음 변형 중 하나의 연결 문자열 내에 서버 경로가 있다는 것입니다.

SERVER\SQLEXPRESS
SERVER

내가 정말로해야 할 때 :

.\SQLEXPRESS

어떤 이유로 든 SQL 인스턴스를 찾는 데 어려움이있을 때마다 오류가 발생했습니다.


6
SQL Server의 연결 방법으로 명명 된 파이프를 사용하도록 설정하지 않았기 때문일 수 있습니다.
Paul

1
@Paul, 감사합니다. 명명 된 파이프가 비활성화 된 상태에서 롤아웃되는 SQL의 새로운 설치 일 가능성이 높습니다. 헤드 업 주셔서 감사합니다. +1
dooburt

1
덕분에 명명 된 파이프가 비활성화 되어이 문제가 발생했습니다.
Patrick Allwood

15

이것은 일반적인 문제입니다. 심지어 나는이 문제에 직면했다. Windows 인증으로 구성된 개발 시스템에서 완벽하게 작동합니다.

<add name="ShoppingCartAdminEntities" connectionString="metadata=res://*/ShoppingCartAPIModel.csdl|res://*/ShoppingCartAPIModel.ssdl|res://*/ShoppingCartAPIModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQlExpress;initial catalog=ShoppingCartAdmin;Integrated Security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

동일한 구성으로 IIS에서 호스팅하면이 오류가 발생합니다.

기본 공급자가 Open에서 실패했습니다

connectionString구성 파일에서 변경 되어 해결 되었습니다.

<add name="MyEntities" connectionString="metadata=res://*/ShoppingCartAPIModel.csdl|res://*/ShoppingCartAPIModel.ssdl|res://*/ShoppingCartAPIModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MACHINE_Name\SQlExpress;initial catalog=ShoppingCartAdmin;persist security info=True;user id=sa;password=notmyrealpassword;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

다른 일반적인 실수는 다음과 같습니다.

  1. 데이터베이스 서비스가 중지 될 수 있습니다
  2. Windows 인증을 사용하고 IIS에서 호스팅되는 로컬 데이터베이스를 가리키는 데이터 소스 속성
  3. 사용자 이름과 비밀번호가 잘못되었을 수 있습니다.

나에게 문제는 EF 데이터 모델을 만들 때 VS의 데이터 연결에서 로그인 데이터를 사용하는 연결 문자열을 만들었습니다. 연결 문자열에 사용자 또는 암호가 없으므로이 배포 문제를 해결 하려면 암호를 제거 Integrated Security=True하고 바꿉니다 user id=sa;password=notmyrealpassword.
LostNomad311

10

이 예외를 수신하면 세부 사항을 펼치고 내부 예외 세부 사항을 살펴보십시오 . 이유에 대한 세부 사항이 제공됩니다. 로그인 실패 . 필자의 경우 연결 문자열에 내 데이터베이스에 액세스 할 수없는 사용자가 포함되었습니다.

통합 보안 (로그인 된 Windows 사용자의 컨텍스트)을 사용하는지 또는 개별 SQL 계정을 사용하는지에 관계없이이 문제를 방지하기 위해 액세스하려는 데이터베이스에 대해 '보안'에서 사용자에게 적절한 액세스 권한이 있는지 확인하십시오.


원래 게시물과 동일한 문제가 있고 호스트 이름을 확인했으며 올바른 사용자 이름을 사용하고 있다는 내부 예외를 확인했습니다. SSMS 사용자 보안이 올바르게 보입니다. SQL Server 계정이 올바르게 설정되어 있고 데이터베이스에 공개적으로 액세스 할 수 있습니다. 그러나 로그인에 실패했습니다.
Hammer 코드

inner exception문제가 무엇입니까 ? 그것은 내 근본적인 문제를 이해하는 데 필요한 숨겨진 추가 세부 사항을 제공한다는 나의 대답이었습니다. 는 inner exception로그온이 올바른지 확인하지 않으며 설명이 아닌 예외입니다.
atconway

Login failed for user 'user'.
Hammer 코드

또한 NT AUTHORITY\NETWORK SERVICESQL Server 사용자 목록에 추가 를 시도했습니다 . 여전히 동일한 거부 된 로그인 실패가 발생했습니다.
Hammer 코드 코드

해결되었습니다. 로 변경 data source해야했습니다 hostname\SQLEXPRESS. 나는 시도했다 hostname.\SQLEXPRESS이전. 그런 다음 통합 보안과 연결할 수있었습니다. 흥미롭게도 dooburt 의 대답 과 반대입니다 . 흥미롭게도 SQL Server 사용자 이름은 Visual Studio에서 연결할 수 없었습니다.
Hammer와 코드


4

SQL Server Express 서비스가 자동으로 시작되도록 설정되지 않았습니다.

1) 제어판으로 이동 2) 관리 도구 3) 서비스 4) SQL Server Express를 클릭하여 자동으로 시작하도록 설정 5) 마우스 오른쪽 단추를 클릭하고 서비스를 시작하십시오.

도움이 되길 바랍니다.


3

데이터베이스를 복원하고 사용자가 이미 다른 스키마로 존재하여 올바른 권한을 할당 할 수없는 경우에도 이러한 상황이 발생할 수 있습니다.

이 실행을 정정하려면 다음을 수행하십시오.

USE your_database
EXEC sp_change_users_login 'Auto_Fix', 'user', NULL, 'cf'
GO
EXEC sp_change_users_login 'update_one', 'user', 'user'
GO

물론 이것이 문제였습니다. 방금 백업에서 복원했습니다. 테이크 보기 분석 세부 사항에 대한합니다.
nesimtunc


2

제공되는 연결 문자열의 각 요소 값이 올바른지 확인하십시오. 내 경우에는 연결 문자열에 지정된 카탈로그 이름 (데이터베이스 이름)이 올바르지 않기 때문에 동일한 오류가 발생했습니다.


1

연결 상태로 인해 예외와 ​​비슷한 문제가 발생하여 도메인 서비스 클래스 변수가 정적으로 (실수로) 표시되어 있음을 깨달았습니다.

서비스 라이브러리가 메모리에로드되면 각각의 새로운 호출은 동일한 정적 변수 값 (도메인 서비스 인스턴스)을 사용하여 연결 상태를 통해 충돌이 발생합니다.

또한 각 클라이언트 호출에 새로운 스레드가 생겨 동일한 도메인 서비스 인스턴스에 액세스하는 여러 스레드가 열차 사고와 동일하다고 생각합니다.


이것이 나에게도 도움이 된 것입니다. 정적으로 표시하면 작업하려는 인스턴스에 모든 종류의 문제가 발생합니다.
Michael J. Grey

1

나는 같은 문제가 있었지만 나를 위해 일한 것은 Connection String에서 이것을 제거하는 것이 었습니다.

persist security info=True


1

아래와 같이 내부 예외와 비슷한 오류가 발생했습니다.

트랜잭션 상태에 대한 작업이 유효하지 않습니다

DTC 보안 설정을 사용하면 문제를 해결할 수 있습니다.

보안 탭에서 DTC 속성으로 이동하여 아래를 확인하십시오.

  • 네트워크 DTC 액세스
  • 원격 클라이언트 허용
  • 거래 관리자 커뮤니케이션
  • 인바운드 허용
  • 아웃 바운드 허용

1

ASP.NET 웹 응용 프로그램에서이 오류가 발생하면 언급 된 사항 외에 다음을 확인하십시오.

  1. 데이터베이스 사용자 보안 권한 (사용자는 데이터베이스에 액세스 할 수 있습니다.
  2. IIS에서 응용 프로그램 풀을 확인하고 데이터베이스에 액세스 할 수있는 응용 프로그램 풀인지 확인하십시오.


1

서버 시스템에서 SQL Server (및 포트 1433)에 대해 새 Windows 방화벽 규칙을 정의하면 이 오류가 해결됩니다 (서버 이름, 사용자 로그인 이름 또는 비밀번호가 연결 문자열에서 잘못되지 않은 경우 ...).


0

한 번의 PC에서 다른 PC로 응용 프로그램을 이동했기 때문에 내가 한 일반적인 실수는 위의 방법으로 App.Config와 Web.Config에 연결 문자열을 복사하는 것을 잊었다는 것입니다!


0

비슷한 문제가있었습니다 : 테스트 케이스 실행에서 항상이 오류가 발생했습니다. "Distributed Transaction Service"가 시작되지 않았다는 것을 알았습니다 (실행 : services.msc-> "Distributed Transaction Service"시작 (자동으로 시작하도록 설정하는 것이 가장 좋습니다)). 그렇게 한 후에는 매력처럼 작동했습니다 ...


0

이 예외를 제거하기 위해 데이터베이스 파일 (.mdf / .ldf)을 App_Data 폴더에 복사했습니다.


0

나는 또한 같은 문제에 직면했다. 이제 연결 문자열에서 사용자 이름과 비밀번호를 제거하여 수행했습니다.


0

나를 위해 그것은 단순한 실수였습니다.

내가 사용하는 아마존 EC2를 , 나는 연결 문자열에 내 탄성 IP 주소를 사용하지만 IP 주소를 변경할 때 내 연결 문자열을 업데이트하는 것을 잊었다.


0

우리 사이트 중 하나에서 갑자기이 오류가 발생했습니다. 필자의 경우 SQL 사용자의 암호가 만료되었다는 것이 밝혀졌습니다! SQL Server Management Studio 에서 암호 만료 상자를 선택 해제 하면 트릭이되었습니다!



0

에서 IIS 설정된 응용 프로그램 풀 ID 해당 데이터베이스에서 작업을 수행 할 권한이 있기 때문에 서비스 계정 사용자 또는 관리자 계정이나 개미 계정을.


0

필자의 경우 컨텍스트 생성자에 등록하는 연결 문자열 이름과 web.config의 이름이 일치하지 않습니다. 복사하여 붙여 넣기로 인한 간단한 실수 : D

    public DataContext()
        : base(nameOrConnectionString: "ConnStringName")
    {
        Database.SetInitializer<DataContext>(null);
    }


0

connectionString을 새 데이터 소스로 변경하면 새 데이터베이스의 사용자 이름과 암호를 변경하는 것을 잊었습니다.


0

SQL Server 인스턴스 이름을 지정하지 않고 SQL 호스트에 여러 개의 SQL 인스턴스가 설치된 경우에도이 오류가 발생했습니다. 다음은 명확히하는 몇 가지 예입니다.

아래 연결 문자열은 .NET WebForms 앱에서 내부 예외없이 "기본 공급자가 열리지 못했습니다"라는 예외를 발생시킵니다.

 connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost;Initial Catalog=Entities;User ID=user;Password=password;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient"

다음 연결 문자열은 SQL 환경에 여러 인스턴스가있는 .net WebForms 앱에서 예상대로 실행됩니다. 드물지만, 다른 프로젝트를 수용하기 위해 dev 상자에 몇 가지 다른 SQL 인스턴스가 있습니다.

 connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost\SQLSERVER2014;Initial Catalog=Entities;User ID=user;Password=password;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient"

0

제 경우에는 서버 관리자가 서버 주소를 변경 했으므로 연결 문자열을 새 서버 주소로 변경해야했습니다


0

이 응용 프로그램이 실행중인 응용 프로그램 풀 로그인이 변경 되었기 때문에이 문제가 발생했습니다.

IIS에서 :

  • 사이트를 클릭하고 기본 설정으로 이동하여 응용 프로그램 풀을 찾으십시오.

  • 응용 프로그램 풀로 이동하십시오.

  • 사이트의 응용 프로그램 풀을 클릭하십시오.

  • 고급 설정을 클릭하십시오.

  • ID에 계정 로그인 및 비밀번호를 입력하십시오.

  • 사이트를 다시 시작한 후 다시 시도하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.