web-dev-qa-db-ja.com

SQL Serverからマップされたドライブにイメージを書き出すことは可能ですか?

データベースに保存されている画像をテキストに書き込むためにカーソルを使用しています。

ここのコードスニペット:

DECLARE @SOURCEPATH VARBINARY(MAX),
        @DESTPATH VARCHAR(MAX),
        @ext varchar(MAX),
        @ObjectToken INT,
        @image_ID Varchar(255)

DECLARE IMGPATH CURSOR FAST_FORWARD FOR
    SELECT <my data>
    FROM <my table>

OPEN IMGPATH

FETCH NEXT FROM IMGPATH INTO @SOURCEPATH, @image_ID

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @DESTPATH = '<my path>'+ @image_ID  

    EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT
    EXEC sp_OASetProperty @ObjectToken, 'Type', 1
    EXEC sp_OAMethod @ObjectToken, 'Open'
    EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @SOURCEPATH
    EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @DESTPATH, 2
    EXEC sp_OAMethod @ObjectToken, 'Close'
    EXEC sp_OADestroy @ObjectToken

    FETCH NEXT FROM IMGPATH INTO @SOURCEPATH, @image_ID
END

CLOSE IMGPATH
DEALLOCATE IMGPATH

ローカルドライブに問題なく書き込むことはできますが、書き込みたいネットワーク共有に書き込むことができません。ここの手順に従いました、

https://www.mssqltips.com/sqlservertip/3499/make-network-path-visible-for-sql-server-backup-and-restore-in-ssms/

ドライブをSQLServerに「表示」できるようにするためですが、このマップされたドライブにイメージを書き込むことができません。

この機能はサポートされていますか、ネットワーク担当者にアクセス許可を確認するルートをたどる必要がありますか、それともこれは不可能ですか?

1
user2259438

SQL Serverは通常、\\server\share\subfolderのようなUNCパスを認識できます。

ただし、SQLServerを実行しているサービスがその共有に対する権限を持っている場合に限ります。たとえば、スケジュールされたジョブを実行している場合、ジョブはSQLエージェントサービスのユーザーとして実行されます。 SSMSで直接コードを実行している場合、またはプログラムから呼び出されたストアドプロシージャを実行している場合は、SQLEngineサービスにその共有フォルダーに対する権限が必要です。

そのユーザーがローカルユーザーのみの場合、共有フォルダーへの権限はありません。ボリュームにアクセスするには、SQLServerエンジンまたはエージェント(あるいはその両方)がドメインユーザーとして実行されている必要があります。

たとえば、バックアップを\\server\DBs\SQL\<server name>共有ドライブに実行します。バックアップを成功させるには、SQLエージェントサービスアカウントにその共有フォルダーに対する完全な権限が必要です。これらのバックアップに関係するマップされたドライブはありません。

2
CaM