web-dev-qa-db-ja.com

ビューの変更/ストアドプロシージャスクリプトが正常に実行されたかどうかを確認する方法

データベースの展開では、バッチファイルですべてのdbスキーマの変更を呼び出し、ターゲットデータベースで実行します。

ビューやストアドプロシージャを変更するためのスクリプトがある場合があります。ビュー/ spが正常に変更されたかどうかを制御し、出力ログファイルのメッセージを介してそれを報告する最良の方法は何でしょうか。

以下の例は、私が実装したいものの疑似コードです:

IF 
(
ALTER VIEW vw_abc
.
.
.
.
) Failed THEN 

PRINT 'ALTER view vw_abc Failed'.
ELSE
PRINT 'ALTER view vw_abc Completed Successfully'
END

出力メッセージは、スクリプトを実行したバッチファイルによって生成されるスクリプトログファイルに記録されます。

それを行うために確認できるエラーコードがある場合はどうなりますか?何か案が?

ありがとう。

5
Sky

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に参加できます... :)

3
Rob Farley

: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を実行します。

2
Remus Rusanu

この例かもしれません、あなたを助けます:

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
1
Sabin Bio

DDLトリガーを使用して、影響を受けたオブジェクトの出力を印刷したり、トリガーを使用して変更を監査テーブルに自動的に記録したり、DDL変更履歴を表示したりできます。

次に例を示します http://www.mssqltips.com/sqlservertip/2085/sql-server-ddl-triggers-to-track-all-database-changes/

1
BateTech