データベースの展開では、バッチファイルですべてのdbスキーマの変更を呼び出し、ターゲットデータベースで実行します。
ビューやストアドプロシージャを変更するためのスクリプトがある場合があります。ビュー/ spが正常に変更されたかどうかを制御し、出力ログファイルのメッセージを介してそれを報告する最良の方法は何でしょうか。
以下の例は、私が実装したいものの疑似コードです:
IF
(
ALTER VIEW vw_abc
.
.
.
.
) Failed THEN
PRINT 'ALTER view vw_abc Failed'.
ELSE
PRINT 'ALTER view vw_abc Completed Successfully'
END
出力メッセージは、スクリプトを実行したバッチファイルによって生成されるスクリプトログファイルに記録されます。
それを行うために確認できるエラーコードがある場合はどうなりますか?何か案が?
ありがとう。
name
に正しい値がある行のsys.objects
を確認し、modify_date
列がスクリプトの開始時よりも新しいかどうかを確認します。
SELECT SYSDATETIME() AS ScriptStart
INTO #scriptstart;
GO
ALTER VIEW ...
GO
ALTER PROC ...
GO
SELECT name
FROM sys.objects
WHERE modify_date > (SELECT ScriptStart FROM #scriptstart);
これにより、スクリプトの開始以降に変更されたすべてのオブジェクトがリストされます。十分に気を付ければ、sys.schemas
に参加できます... :)
:on error exit
または -b
を使用します。これにより、ヒットしてエラーが発生した最初のバッチの後にsqlcmd
が終了し、%ERRORLEVEL%
が設定されます。
-b
エラーが発生すると、sqlcmdが終了し、DOS ERRORLEVEL値を返すことを指定します。 SQL Serverエラーメッセージの重大度レベルが10より大きい場合、DOS ERRORLEVEL変数に返される値は1です。それ以外の場合、返される値は0です。-bオプションに加えて-Vオプションが設定されている場合、重大度レベルが-Vを使用して設定された値よりも低くても、sqlcmdはエラーを報告しません。コマンドプロンプトバッチファイルは、ERRORLEVELの値をテストし、適切にエラーを処理できます。 sqlcmdは、重大度レベル10(情報メッセージ)のエラーを報告しません。
Sqlcmdスクリプトに不適切なコメント、構文エラーが含まれている場合、またはスクリプト変数がない場合、返されるERRORLEVELは1です。
次に、%%ERRORLEVEL%%
をチェックして、バッチで一般的なエラー処理を実行できます。 .sqlファイルでは、単にALTER VIEW
を実行します。
この例かもしれません、あなたを助けます:
ALTER VIEW dbo.vTest
AS
SELECT TOP(10) ProductName FROM [dbo].[TestData]
GO
IF @@ERROR <> 0
print 'ERR'
ELSE
print 'ok'
GO
ALTER VIEW dbo.vTest
AS
SELECT TOP(10) PoductName FROM [dbo].[TestData]
GO
IF @@ERROR <> 0
print 'ERR'
ELSE
print 'ok'
GO
メッセージを印刷する代わりに、オブジェクトの名前を付けて場所/テーブルに情報を記録できます。
IF @@ERROR <> 0
INSERT INTO Log_Table(L_ObjectName,L_ErrNumber)
VALUES('vTest',1)
ELSE
INSERT INTO Log_Table(L_ObjectName,L_ErrNumber)
VALUES('vTest',0)
GO
DDLトリガーを使用して、影響を受けたオブジェクトの出力を印刷したり、トリガーを使用して変更を監査テーブルに自動的に記録したり、DDL変更履歴を表示したりできます。
次に例を示します http://www.mssqltips.com/sqlservertip/2085/sql-server-ddl-triggers-to-track-all-database-changes/