アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
SQL Server 2005のプロシージャにて
テーブルの削除→CSVファイルの取り込み→CSVファイルの削除を行いたいと思っております。

ALTER PROCEDURE [dbo].[テーブル削除+インポート+ファイル削除]
AS
begin
DELETE FROM dbo.テーブル

BULK INSERT テーブル FROM 'テキストファイル'
WITH (DATAFILETYPE='char', FIELDTERMINATOR=',',ROWTERMINATOR='\n')
end

ここで、テーブル削除とCSVファイルのインポートはできたのですが、ファイルの削除が未だにできません。
このあとテキストファイルをこのプロシージャ内で削除するにはどうすればよいでしょうか。

A 回答 (1件)

拡張ストアドの xp_cmdshell で可能です。



但し、この拡張ストアドは SQL-Server ユーザーがコマンドラインで実行可能な全ての行為を行なう事ができてしまいます。

それくらい危険極まりないので、デフォルトでは使えないようになっています。
(かつて猛威を振るったワーム型ウイルス Slammer は、確かこの xp_cmdshel を内部で使っていました)

使い方は以下、MSDNを参考に。

xp_cmdshell (Transact-SQL)
http://msdn.microsoft.com/ja-jp/library/ms175046 …

xp_cmdshell オプション
http://msdn.microsoft.com/ja-jp/library/ms190693 …

企業やプロジェクトによっては、セキュリティの観点から xp_cmdshell の使用を禁止している場合があるかもしれません。

xp_cmdshell 以外にも方法はいくつか考えられます。

■ストアドからDTSをキックする
自分はやった事無いですが(もしくは忘れてしまいましたが)多分、DTSが使えるのであればファイルの削除も可能でしょう。

■OLE オブジェクトを使う
例えば、VB(VBA、VBS)などでファイルシステムを扱う場合、

CreateObject("Scripting.FileSystemObject")

のように書きます。

これと同じ事をTransact-SQLでは

sp_OACreate 'Scripting.FileSystemObject'

と表現できます。

つまり、Scripting.FileSystemObjectの DeleteFile メソッドもストアドから実行できる、と言う事です。

こちらの方法は自分もやった事があります
結構ハマり、後々のお守りも大変だった記憶があります。

セキュリティの制限さえ無ければ、xp_cmdshell が一番楽チンです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
やはりプロシージャ内でファイルを削除するには危険が伴うことがわかりました。

そのため、プロシージャを使わずにASP.NET側でデータのインポート⇒ファイルの削除をするようにいたしました。

お礼日時:2011/08/03 11:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す