2010-12-15 21 views
3

ローカルでSQL Filestreamを使用することはできましたが、SQL認証を使用するリモートSQLサーバーにファイルをアップロードしようとすると、アクセス拒否例外が発生します。どうやら、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サービス、Webアプリケーション、およびデスクトップアプリケーション)のすべての場合に該当しない実装があります –

+0

@ Philhunt - コードスニペット。バイトをファイルに書き込もうとするとエラーが発生します。プロセスは明らかにファイルにアクセスできません。 – tempid

答えて

3

FILESTREAM Storage in SQL Server 2008

あなたは、Windowsが稼働アプリケーションが下に実行されることを考慮することを確認する必要がありますは、SQLでのログインとして追加されましたサーバーであり、アプリケーションが現在使用しているSQL認証アカウントと同じアクセス許可が与えられています。

また、アカウントにFILESTREAMコンテナに書き込むためのファイルシステムアクセス許可があることを確認する必要があります。

+0

これは、1つのWindowsアカウントにSQLコンテナとフォルダへのアクセスを許可し、そのファイルストリームにアクセスするときにそのユーザーを偽装するようにすることを意味します。 – 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(); 
    } 
} 

お知らせ:列「ID」と「FILEDATA」(GUID)と「バイト」と呼ばれる私たちのテーブルのために、私はこのようなものを使用します。

+0

どのようにしてデータの読み取りを行いましたか?私はSqlFileStreamなしでファイルを読む方法を見ることができません。 – runfastman

+0

ファイルデータをバイト配列に変換する方法はたくさんあります。一つの方法は 'File'クラスを使うことです:' Byte [] bytes = File.ReadAllBytes(fileName); ' –

関連する問題