3

ファイルを SQL ファイルストリームに格納するイントラネット アプリケーションがあります。

私の開発マシンでは、すべてが魅力的に機能します。

ファイルをアップロードしてSQLファイルストリーム(AjaxUpload)に保存し、それらをダウンロードできます。

ライブサーバーでは、ファイルをアップロードして削除できますが、ファイルストリームからファイルをダウンロードしようとすると、次のエラーが発生します。


Access is denied

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ComponentModel.Win32Exception: Access is denied

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 

[Win32Exception (0x80004005): Access is denied]
   System.Data.SqlTypes.SqlFileStream.OpenSqlFileStream(String path, Byte[] transactionContext, FileAccess access, FileOptions options, Int64 allocationSize) +1465594
   System.Data.SqlTypes.SqlFileStream..ctor(String path, Byte[] transactionContext, FileAccess access, FileOptions options, Int64 allocationSize) +398
   System.Data.SqlTypes.SqlFileStream..ctor(String path, Byte[] transactionContext, FileAccess access) +27
   quotes_GetFileStream.quotes_GetFileStream_Load(Object sender, EventArgs e) +740
   System.Web.UI.Control.LoadRecursive() +71
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3048

アプリケーション プールは統合された V.4.0 に設定されており、SQL への ID 認証にドメイン ユーザーを使用しています。

そのユーザーに、そのアプリケーションの SQL データベースに対する DB_Owner 権限を与えました。

それでも上記のエラーが発生しますが、すべての SQL Server ロールを指定しようとしました。

Identity ユーザー名を自分のものに変更すると (ドメイン管理者権限を持っています)、ライブ サーバー上ですべてが問題なく動作します。

そのユーザーがSQLファイルストリームから適切に読み取れるようにするには、どのような権限がありませんか。

これは、ファイルストリームからファイルを取得してブラウザにプッシュするコードのブロックです。おそらく、ここに何かが欠けている可能性があります (ただし、ユーザーを変更すると、うまく機能します)。

Dim RecId As Integer = -1

    If Not IsNothing(Request.QueryString("ID")) And IsNumeric(Request.QueryString("ID")) Then
        RecId = CType(Request.QueryString("ID"), Integer)
    End If

    Dim ConString As String = ConfigurationManager.ConnectionStrings("ConnectionString").ToString
    Using Con As SqlConnection = New SqlConnection(ConString)
        Con.Open()
        Dim txn As SqlTransaction = Con.BeginTransaction()
        Dim Sql As String = "SELECT FileData.PathName() , GET_FILESTREAM_TRANSACTION_CONTEXT() as TransactionContext, [FileName], [FileExtension] FROM [QAttach] where RecId = @RecId"
        Dim cmd As SqlCommand = New SqlCommand(Sql, Con, txn)
        cmd.Parameters.Add("@RecID", Data.SqlDbType.Int).Value = RecId
        Dim Rdr As SqlDataReader = cmd.ExecuteReader()

        While Rdr.Read()
            Dim FilePath As String = Rdr(0).ToString()
            Dim objContext As Byte() = DirectCast(Rdr(1), Byte())
            Dim fname As String = Rdr(2).ToString()
            Dim FileExtension As String = Rdr(3).ToString()

            Dim sfs As SqlFileStream = New SqlFileStream(FilePath, objContext, FileAccess.Read)

            Dim Buffer As Byte() = New Byte(CInt(sfs.Length) - 1) {}
            sfs.Read(Buffer, 0, Convert.ToInt32(Buffer.Length))


            Response.Buffer = True
            Response.Charset = ""
            Response.Cache.SetCacheability(HttpCacheability.NoCache)
            Response.ContentType = FileExtension
            Response.AddHeader("content-disposition", "attachment;filename=" & fname)
            Response.BinaryWrite(Buffer)
            Response.Flush()
            Response.End()

            sfs.Close()

        End While
    End Using

ありがとう

オーレン

4

3 に答える 3

2

私は同じ問題を抱えていましたが、データベースへのアクセスに使用されるアカウントが、アクセスされているテーブルの FILESTREAM 列に対する SELECT および UPDATE 権限を持っていることを確認することで、問題を修正できました。必要な T-SQL コードは次のとおりです。

GRANT SELECT, UPDATE ON OBJECT::[schema name].[table name]([file stream column name]) TO [the role/user to grant the rights to] AS [dbo];
GO
于 2015-03-11T21:27:39.713 に答える