- PR -

osqlのバッチ処理について

1
投稿者投稿内容
kiyoharu
常連さん
会議室デビュー日: 2005/08/06
投稿数: 25
お住まい・勤務地: 神奈川県鎌倉市
投稿日時: 2005-10-02 06:53
お世話になります。
OSQLを使い、バッチ処理でSQLserver2000のDBバックアップ
を取得するバッチを作成しています。
その際、処理の結果をイベントログへ出力したく、下記の
ような内容のバッチを作成したのですが、バックアップは
上手くいくものの、ERRORLEVELによる条件分岐は
「'ERRORLEVEL' の近くに無効な構文があります。」との
エラーが発生し上手くいきません。

BACKUP DATABASE コマンドは実は終了コードを返さないコマンドで、
%ERRORLEVEL%に値が渡らないということなのでしょうか?
だとしたら、当処理はERRORLEVELによる条件分岐では実現できないのでしょうか?

何卒ご教授の程、よろしくお願いいたします。

---------以下、バッチファイルの内容です。--------------

OSQL -E
GO
USE TESTDB
GO
BACKUP DATABASE TESTDB TO DISK = 'D:\\test.bak'

IF %ERRORLEVEL% == 0 GOTO true
IF %ERRORLEVEL% == 1 GOTO false

:true
eventcreate /ID 100 /L APPLICATION /SO Cmd /T Information /D "バックア
ップ成功" ECHO 成功

:false
eventcreate /ID 101 /L APPLICATION /SO Cmd /T ERROR /D "バックアップ失
敗" ECHO 失敗

-------------------------------------------------------
TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2005-10-02 08:31
引用:

kiyoharuさんの書き込み (2005-10-02 06:53) より:

ERRORLEVELによる条件分岐は
「'ERRORLEVEL' の近くに無効な構文があります。」との
エラーが発生し上手くいきません。




お疲れさまです。

まず,何故エラーになってしまうかというと,
osql に制御が移っている状態で,DOS コマンドの ERRORLEVEL 変数などは使えないため
です。

QUIT して osql から制御を戻せば取得できますが,ERRORLEVEL が取得するのは,

osql が起動して〜正常に終了したこと

であって,
osql の中で実行された SQLバッチの終了コードではありません。

osql の中で実行する BACKUP ステートメントのステータスで条件分岐させるためには
T-SQL の構文に従って処理を記述する必要があります。
@@ERROR と IF 〜 BEGIN 〜 END 構文です。

また,イベントログに記録を行うためには,RISERROR ステートメントが使用できます。

RISERROE によって,アドホックメッセージを作成してもよいですし,
sp_addmessage で事前定義してもよいと思います。

ただ,
BACKUP ステートメントは既定で成否に関するログを SQL ログとアプリケーションログに記録しますよね。

-----
TLC が検証済みのコードはブログにアップしておきます。
まずは,ご自分で実験してみてください。

----------
TimberLandChapel
http://blogs.timberlandchapel.com/blogs/timberlandchapel/
kiyoharu
常連さん
会議室デビュー日: 2005/08/06
投稿数: 25
お住まい・勤務地: 神奈川県鎌倉市
投稿日時: 2005-10-02 17:01
TLC様、ご回答ありがとうございます。
(前回のDTSのvbs処理の質問の際はお世話になりました。)
教えていただきました内容を元にいろいろと試して
みました。そこで、以下のような仕組みを作りました。
(殆ど教えていただいた内容なので恐縮なのですが。。。)
バッチを使って、sqlスクリプトを呼ぶ処理です。

--sqlスクリプト呼び出しバッチ-----
cd d:\\osql -E -i D:\\BKtest.sql -n
-------------------------------

--BKtest.sql(sqlスクリプト)-----------------------------------------------------
EXEC sp_addmessage @msgnum = 50001, @severity =1,
@msgtext ='ID :%d, NAME:%s Backup success.',@with_log=True,@lang = 'us_english'

--lang = 'us_english' を追加しました。

EXEC sp_addmessage @msgnum =50002, @severity =1,
@msgtext ='ID :%d, NAME:%s Backup fail.',@with_log=True,@lang = 'us_english'

--lang = 'us_english' を追加しました。

USE testDB

DECLARE @DBID INT
DECLARE @DBNAME NVARCHAR(128)

SET @DBID = DB_ID()
SET @DBNAME = DB_NAME()

BACKUP DATABASE testDB TO DISK = 'D:\\test.bak'

IF @@ERROR = 0
BEGIN
RAISERROR (50001, 1, 1, @DBID, @DBNAME)
END
ELSE
BEGIN
RAISERROR (50002, 1, 1, @DBID, @DBNAME)
END
GO
---------------------------------------------------------------------
この処理を実行すると、一度目は正常に終了するのですが、続けて実行すると
バックアップ処理、ログ出力は成功するものの、下記のようなメッセージが
表示されます。

「既存のメッセージに上書きする場合は 'REPLACE' を指定してください。」

オンラインヘルプでREPLACEを調べたのですが、エラーメッセージの置き換え
を具体的にどうすればよいのかわかりませんでした。
また、バックアップしたファイルについてですが、処理の度にファイルサイズが
一度目のバックアップファイルの3倍、4倍となってしまうのです。
BACKUPコマンドはファイル上書きだったと思ったのですが、実はデータは既存の
ファイルに追加されていくのでしょうか?

お手数をおかけして申し訳ありませんが、情報お持ちでしたらご教授の程
よろしくお願いいたします。
TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2005-10-02 17:50
引用:

kiyoharuさんの書き込み (2005-10-02 17:01) より:

この処理を実行すると、一度目は正常に終了するのですが、続けて実行すると
バックアップ処理、ログ出力は成功するものの、下記のようなメッセージが
表示されます。

「既存のメッセージに上書きする場合は 'REPLACE' を指定してください。」




お疲れ様です。

このメッセージは,あらかじめ作成したカスタムエラーメッセージに対して,
2度目のバッチで同じ番号で新たにメッセージを作成しようとしていることで起こっています。

ですので,
BACKUP ステートメントの動作とは関連がないんですね。

sp_addmessage は,1度ログ記録するメッセージを作ってしまえば,後は実行する必要がありません。
ですので,
■バッチからは抜いておく必要があります。

バッチには
・バックアップ実行
・エラー情報の送信
だけを指定すればいいんですね。

もし,バッチの中でエラー情報を毎回定義するようであれば,
もう一つの例のアドホックエラーメッセージの手法を使うようにしてください。

----------
TimberLandChapel
http://blogs.timberlandchapel.com/blogs/timberlandchapel/
kiyoharu
常連さん
会議室デビュー日: 2005/08/06
投稿数: 25
お住まい・勤務地: 神奈川県鎌倉市
投稿日時: 2005-10-02 20:43
お世話になります。

>sp_addmessage は,1度ログ記録するメッセージを作ってしまえば,後は実行する
>必要がありません。
>ですので,
>■バッチからは抜いておく必要があります。

一度つくってしまえば後は必要ないのですか、ナットクです。
後は自分でなんとかできそうです。
バックアップファイルの上書きの方は WITH INIT をつけて
BACKUP DATABASE testDB TO DISK = 'D:\\test.bak' WITH INIT
とすることでできました。(BACKUPはデフォルトでは追加型のようですね。)

御忙しいところありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)