VS環境では、常にデータベースプロジェクトを使用して更新スクリプトを実装してきました。スクリプトには、「DatabaseUpdate17.sql」や「PriceUpdateFebruary2010.sql」などの想像を絶する名前を使用する傾向があります。それらをデータベースプロジェクトとして使用すると、それらをTeam Serverのタスク、バグ(およびコードレビューを行った場合も同様)に結び付けることができます。また、スキーマに対する変更のコレクション専用のテーブル(各権限を持っている)を各データベースに含めます。
CREATE TABLE [dbo].[AuditDDL](
[EventID] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
[EventData] [xml] NULL, -- what did they do
[EventUser] varchar(100) NOT NULL, -- who did it
[EventTime] [datetime] DEFAULT (getdate()) -- when did they do it
)
GO
まあ、それは6 Wのうち3つを処理します。
CREATE TRIGGER [trgAuditDDL]
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS
AS
INSERT INTO AuditDDL(EventData, EventUser)
SELECT EVENTDATA(), original_login()
GO
パッチの開始と終了を記録するためのinsertステートメントを含めます。パッチの外で発生するイベントは、検討することです。
たとえば、「パッチ17」の「パッチの開始」挿入は次のようになります。
INSERT INTO [dbo].[AuditDDL]
([EventData]
,[EventUser])
VALUES
('<EVENT_INSTANCE><EventType>BEGIN PATCH 17</EventType></EVENT_INSTANCE>'
,ORIGINAL_LOGIN())
GO
インデックスが再構築されたときにもキャッチするため、これらのイベントをクリアするために、毎月以下を実行する必要があります。
DELETE FROM AuditDDL
WHERE [EventData].exist('/EVENT_INSTANCE/EventType/text()[fn:contains(.,"ALTER_INDEX")]') =1
GO
DELETE FROM AuditDDL
WHERE [EventData].exist('/EVENT_INSTANCE/EventType/text()[fn:contains(.,"UPDATE_STATISTICS")]') =1
GO
以前にServer Faultに投稿された以前のバージョン。
SOXおよびPCI-DSS準拠の環境では、運用サーバーにアクセスすることはありません。そのため、スクリプトは事前に明確にして実行する必要があります。更新スクリプトの上部にあるコメントには、新しいテーブル、ストアドプロシージャ、関数などのリストと、変更されたテーブル、ストアドプロシージャ、関数などのリストが含まれています。
2番目の問題は、2つの別々のタスクが同じデータベースオブジェクトを変更する場合、変更を手動で調整する必要が生じる場合があることです。これは単なる方法かもしれませんが、これらの問題または何かに「フラグを立てる」自動化された方法があるべきであるように見えます。
これを自動的に追跡できるツールに出会ったことはありません。以前の雇用主は「データベース所有者」の原則を使用していました-個人的にデータベースを管理しているのは一人だけです。このデータベースに対して作業する開発者はこの人だけではありませんが、すべての変更はそれらを経る必要があります。これは、変更が互いに衝突したり損傷したりするのを防ぐためにかなりうまく機能しました。