2010-12-15 9 views
3

로컬로 SQL Filestream을 사용할 수 있었지만 SQL 인증을 사용하는 원격 SQL 서버에 파일을 업로드하려고하면 Access Denied 예외가 발생합니다. 분명히 SQL Filestream은 Windows 인증 (통합 보안 = true)에서만 작동하며 현재 우리가 가지고있는 SQL 인증과는 관련이 없습니다.SQL filestream 인증 우수 사례

아무도 실제로 프로덕션 환경에서 Windows 인증을 사용하지 않으므로이 제한을 극복하는 방법을 알고 싶습니다. 가장 좋은 방법은 무엇입니까? FILESTREAM을 사용하는 경우

public static void AddItem(RepositoryFile repository, byte[] data) 
{ 
    using (var scope = new TransactionScope()) 
    { 
     using (var db = new MyEntities()) // DBContext 
     { 
      db.RepositoryTable.AddObject(repository); 
      db.SaveChanges(); 
     } 

     using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)) 
     using (var cmd = new SqlCommand(string.Format("SELECT Data.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM dbo.RepositoryTable WHERE ID='{0}'", repository.ID), con)) // "Data" is the column name which has the FILESTREAM. Data.PathName() gives me the local path to the file. 
     { 
      cmd.Connection.Open(); 
      using (var reader = cmd.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        var path = reader.GetString(0); 
        var transactionContext = reader.GetSqlBytes(1).Buffer; 
        var fileStream = new SqlFileStream(path, transactionContext, FileAccess.Write); 

        fileStream.Write(contents, 0, contents.Length); // I get the error at this line. 
        fileStream.Close(); 
       } 
      } 
     } 

     scope.Complete(); 
    } 
} 
+0

예외가 발생하는 코드를 표시 할 수 있습니까? –

+4

"실제 환경에서는 Windows 인증을 사용하지 않습니다."다음은 모든 경우에 해당하지 않는 구현을했습니다 (Windows 서비스, 웹 응용 프로그램 및 데스크톱 응용 프로그램) –

+0

@ Philhunt - 질문을 업데이트했습니다. 코드 스 니펫. 바이트를 파일에 쓰려고 할 때 오류가 발생합니다. 프로세스는 분명히 파일에 액세스 할 수 없습니다. – tempid

답변

3

당신 참 통합 인증을 사용해야합니다

FILESTREAM Storage in SQL Server 2008

당신은 Windows가 생산 응용 프로그램에서 SQL의 로그인으로 추가되어 실행되는 계정 있는지 확인해야합니다

서버 및 응용 프로그램이 현재 사용하는 SQL 인증 계정과 동일한 사용 권한이 부여되었습니다.

또한 FILESTREAM 컨테이너에 쓸 수있는 파일 시스템 권한이 계정에 있어야합니다.

+0

은 SQL 컨테이너 및 폴더에 대한 하나의 Windows 계정 액세스 권한을 부여하고 해당 파일 스트림에 액세스 할 때 사용자를 가장 할 수 있음을 의미합니다. – Jake

2

SqlFileStream 예제를 사용하여 비슷한 '액세스 거부'메시지가 나타납니다. 이것은 우리를 하루 동안 곤란하게 만들었습니다.

동료는 아름답게 작동하는 대체 방법을 제안했습니다. SqlFileStream을 사용하는 대신 바이트 값을 사용하는 인수와 함께 INSERT 명령을 사용하여 SQL Server에 직접 파일 바이트를 씁니다. SqlFileStream 클래스가 사용되지 않음을

Byte[] bytes = // assign your data here 

using (SqlConnection conn = new SqlConnection(connectionString)) { 
    SqlCommand insertCmd = new SqlCommand("INSERT INTO FileData (Id, Bytes) VALUES (@Id, @Bytes)", conn); 

    insertCmd.CommandType = System.Data.CommandType.Text; 
    insertCmd.Parameters.AddWithValue("@Id", Guid.NewGuid()); 
    insertCmd.Parameters.AddWithValue("@Bytes", bytes); 
    insertCmd.Transaction = conn.BeginTransaction(); 

    try { 
     insertCmd.ExecuteNonQuery(); 
     insertCmd.Commit(); 
    } 
    catch (Exception e) { 
     insertCmd.Transaction.Rollback(); 
    } 
} 

주의 사항 : 열 '아이디'(GUID가)와 '바이트'와 'FILEDATA'라는 우리 테이블의 경우,이 같은 것을 사용합니다.

+0

그래서 데이터 읽기는 어떻게 수행 했습니까? SqlFileStream없이 파일을 읽는 방법을 볼 수 없습니다. – runfastman

+0

파일 데이터를 바이트 배열로 변환하는 많은 방법이 있습니다. 한가지 방법은'File' 클래스를 사용하는 것입니다 : Byte [] bytes = File.ReadAllBytes (fileName);' –