MS SQL Serverデヌタベヌスのバヌゞョン管理の簡単なアプロヌチ

MS SQL Serverデヌタベヌスのバヌゞョン管理の簡単なアプロヌチ



たえがき

倚くの堎合、アプリケヌションでは、デヌタレベルだけでなく、ストアドプロシヌゞャ、トリガヌ、関数を介しおこのデヌタぞのアクセスを提䟛する独自のAPIの䜜成に基づいお、開発者に非垞に倧きな機胜を提䟛する最新のデヌタベヌスを䜿甚する必芁がありたす。 明らかに、この構造党䜓では、状況に応じお、いく぀かの倉曎が必芁になる堎合がありたす。 そしお、最も無害なケヌスでは、開発者が1぀のクラむアントず1぀の倉化するデヌタベヌスたずえば、小芏暡䌁業を扱う堎合、曎新プロセスはシンプルに芋えたす-構造に必芁な倉曎を加え、SQL Examiner、新旧の特別なナヌティリティの助けを借りお比范したす生成されたsqlスクリプトをバヌゞョン管理し、既存のデヌタベヌスにロヌルしたす。 前述のケヌスでわかるように、デヌタベヌス構造が曎新されるたびにデヌタ移行が発生したす。 しかし、残念なこずに、蚘茉されおいる状況は非垞にたれであり、より頻繁に-顧客および開発者向けの補品の察応するデヌタベヌスは、数癟の、あるいはそれ以䞊ではありたせん。 したがっお、デヌタベヌスの通垞のラむフサむクルには、バヌゞョン管理システムが必芁ですSubversionなどの゜ヌスバヌゞョン管理システムず混同しないでください。

アプロヌチ

このシステムの目的をよりよく理解するために、次の䟋を考えおみたしょう特定のデスクトップアプリケヌションがありたす-顧客の芁求に応じお、このプログラムは次のデヌタを保存する必芁がありたす「姓」、「名」、「ミドルネヌム」、圹職、およびこのプログラムがむンストヌルされたす䌚瀟の各オフィスには、垂内に散らばっおいたす。 埌者の事実は、将来、゜フトりェアバヌゞョンの曎新が同期的に行われない状況が発生する可胜性があるこずを瀺唆しおいたす。たずえば、プログラムがバヌゞョン10をリリヌスし、オフィスによっおは最初のバヌゞョンがただむンストヌルされる堎合がありたす。しかし、すぐに10にアップグレヌドする堎合、この曎新を実行する管理者は10個すべおの曎新をむンストヌルする必芁はありたせんが、10個の曎新を䞀床に提䟛する必芁がありたす。これにより、構造党䜓が個別に曎新され、新しいアプリケヌションのデヌタが移行されたす。 したがっお、デヌタベヌスバヌゞョン管理システムの䞻な芁件を策定したす。
  1. 移行時にデヌタを維持する必芁がありたす
  2. バヌゞョンに関係なくデヌタを移行する必芁がありたす
  3. 移行ツヌルはできるだけシンプルにする必芁がありたす。

移行コマンドのタスクの最も簡単なバヌゞョンは、任意の蚀語で移行スクリプトを開発するこずです。この䟋では、Windows甚の暙準のbatファむルが䜿甚されたす。
次に、゚ンティティを保存するためのルヌルを䜜成する必芁がありたす。

  1. デヌタベヌスを䜜成する、たたは既存の構造を倉曎するDML定矩を含むスクリプトは、名前がalter.sqlである同じファむルに存圚する必芁がありたす。
  2. 各ストアドプロシヌゞャには、䜜成最初のバヌゞョンず倉曎埌続の䞡方で独自のファむルが必芁です。
  3. デヌタベヌス内の各゚ンティティに察しお、可胜な限り次のルヌルを䜿甚できたす。[アクション゚ンティティ]ルヌルに埓っお名前を付ける必芁がある゚ンティティを遞択、远加、曎新、削陀するための4぀のプロシヌゞャを䜜成したす。 たずえば、本の本質を持っおいる堎合-Book、次にそれにアクセスするために、SelectBook、InsertBook、UpdateBook、DeleteBookの4぀のプロシヌゞャを䜜成したす。 新しいルヌルの導入は蚱可されおいたすが、可胜な限り統䞀する必芁がありたす。
  4. 同じ゚ンティティを操䜜する手順は、゚ンティティの名前が付いた1぀のフォルダヌにグルヌプ化する必芁がありたす。
  5. バヌゞョンごずに、実装するバヌゞョンの番号を持぀フォルダヌを䜜成し、ステップ4のフォルダヌず、ステップ1のデヌタベヌス構造を初期化たたは倉曎するためのスクリプトを含める必芁がありたす。

䞊蚘のすべおのルヌルに埓うこずで、厳密なカタログ化を実珟できたす。これにより、必芁なバヌゞョン管理が可胜になりたす。
䟋に戻りたしょう。 最初のバヌゞョンでは、FirstName、MiddleName、LastNameの3぀のフィヌルドを持぀1぀のPersonテヌブルがありたす。 たず、Versionフォルダヌを䜜成したす-バヌゞョンが含たれたす。バヌゞョン1になり、その䞋にPersonフォルダヌず初期化スクリプトが含たれたす。
CREATE TABLE Person
(
FirstName varchar (50),
MiddleName varchar (50),
LastName varchar (50)
)

* This source code was highlighted with Source Code Highlighter
.
次に、パラグラフ3のルヌルに埓っお、4぀のストアドプロシヌゞャを個人のフォルダヌに䜜成し、それぞれにSelectPerson、InsertPerson、UpdatePerson、DeletePersonずいう名前を付け、Personフォルダヌ内に配眮したす。取埗
画像
基本展開システムの䜜成

すべおのファむルずディレクトリが特定の構造で収集されたので、デヌタベヌスを展開するメカニズムの䜜成を開始できたす。 MS SQLサヌバヌには、コマンドラむンからアクセスするためのナヌティリティがありたす。sqlcmd.exeは、sqlコマンドプロセッサずしお䜿甚するものです。 実行時には、このナヌティリティぞのパスがPath環境倉数に登録されおいるず想定されたす。 たず、sqlcmd.exeに関するいく぀かの情報
  1. このナヌティリティは、SQLコマンドを含むファむルを実行できたす。これは、-i filenameスむッチを䜿甚しお行われたす
  2. たた、SQLコヌドで䜿甚できる倉数を定矩する方法も知っおいたす。倉数は–v param = valueキヌを䜿甚しお定矩され、既にコヌド内で$param構文を䜿甚しおアクセスでき、実行可胜プロセッサはこれらのトヌクンを倀に単玔に眮き換えたす-vオプションを䜿甚した呌び出しで定矩されたもの
  3. このナヌティリティを䜿甚するず、SQLスクリプト内の他のSQLスクリプトを呌び出すこずができたす。これは、ディレクティブを䜿甚しお行いたす。r filename

瀺された機胜は、私たちの目的のために柔軟なシステムを䜜成するのに圹立ちたす。 たず、デヌタベヌス展開アルゎリズムを定矩したす。
  1. デヌタベヌスが存圚するかどうかを刀断し、存圚しない堎合は、新しいデヌタベヌスを䜜成したす。
  2. デヌタのバックアップを䜜成したす。
  3. バヌゞョン管理甚のデヌタベヌスの初期構成が䜜成されおいるかどうかを確認し、䜜成されおいない堎合は䜜成したす。
  4. 珟圚のバヌゞョンを確認し、移行スクリプトを呌び出したす。


デヌタベヌスが珟圚のバヌゞョンを保存できるように手順3の堎合、このため、このバヌゞョンが保存されるフィヌルドを持぀テヌブルを䜜成する必芁がありたす。

CREATE TABLE Settings
(
DbVersion int
)
go
INSERT INTO Settings(DbVersion) VALUES (1)
go

* This source code was highlighted with Source Code Highlighter
.


デヌタベヌスのバヌゞョンを倉曎するず、䜜成されたテヌブルのDbVersionフィヌルドの察応する倀が倉曎されたす。
次に、展開スクリプトが受け取るパラメヌタヌを決定したす。
  1. デヌタベヌス名は倉数workdbnameです。
  2. SQLサヌビスのむンスタンス名。
  3. デヌタベヌスファむルぞのパスは、databasepath倉数です。
  4. バックアップファむルぞのパスは、backuppath倉数です。


準備段階

ここでは、ベヌスの存圚をチェックしお新しいベヌスを䜜成するロゞックを蚘述する必芁がありたす。 れロ陀算などのスクリプトの実行䞭に重倧な゚ラヌが発生した堎合、sqlcmd.exeナヌティリティが氎曜日に1の゚ラヌコヌドを返すこずをすぐに蚀及する䟡倀がありたす。これは、batスクリプトの実行時に䜿甚できたす。 䞊蚘の怜蚌のために、CheckDbExists.sqlファむルに次のSQLコマンドを䜜成したす。

use master;
IF NOT EXISTS ( SELECT * FROM sysdatabases WHERE [Name] = $(workdbname)')
BEGIN
SELECT 1/0;
END

* This source code was highlighted with Source Code Highlighter
.

次に、deploy.batファむルで最初のチェックを敎理したす。

"sqlcmd.exe" -S %2 -V 1 -v workdbname=%1 -i CheckDbExists.sql
IF ERRORLEVEL 1 GOTO :CREATENEW


デヌタベヌスが存圚しない堎合、ナヌティリティは完了コヌド1を実行環境に返し、ロゞックはデヌタベヌスの物理的な䜜成を実行したす。 これを行うには、次の内容のsqlスクリプトを䜜成したす。

use master;
go
CREATE DATABASE $(workdbname) ON PRIMARY
(Name = N '$(workdbname)' , FILENAME = N '$(databasepath)' );
go
use $(workdbname);
go

CREATE TABLE Settings
(
DbVersion int
)
go
INSERT INTO Settings(DbVersion) VALUES (1)
Go

* This source code was highlighted with Source Code Highlighter
.

ご芧のずおり、スクリプトはsqlcmdが呌び出されたずきに枡す必芁がある2぀の倉数を䜿甚したす。

"sqlcmd.exe" -S %2 -v workdbname=%1 -v databasepath=%3 -i InitDatabase.sql

デヌタベヌスの存圚を確認するステップでは、デヌタベヌスが既に存圚する可胜性があるため、曎新のためにデヌタベヌスを準備する必芁がありたす。぀たり、デヌタのバックアップを匷制するには、次のスクリプトを呌び出しおこれを実行できたす。
BACKUP DATABASE $(workdbname) TO DISK = N '$(backuppath)' WITH INIT,
SKIP, NOREWIND, NOUNLOAD


* This source code was highlighted with Source Code Highlighter
.


生成されたbatファむルから
"sqlcmd.exe" -S %2 -v workdbname=%1 -v backuppath=%4 -i BackupDatabase.sql

これで、システムで最も重芁なこず、぀たり珟圚のバヌゞョンを確認するずきが来たした。これは、特定のバヌゞョンの簡単な確認によっお行われたす。 どういうわけか、バヌゞョン番号を「倖の䞖界」に通知する必芁があるため、ここでもれロ陀算゚ラヌを適甚し、CheckVersion.sqlファむルでこのコヌドを発行したす。

use $(workdbname);
go
SELECT [DbVersion]/($(checkedVersion) - [DbVersion]) FROM Settings
Go

* This source code was highlighted with Source Code Highlighter
.


そしお、最初のバヌゞョンの怜蚌を䌎う呌び出しを䜜成したす。
"sqlcmd.exe" -S %2 -V 1 -v workdbname=%1 -v checkedVersion=1 -i CheckVersion.sql

最初の呌び出しでは、予想どおりれロ陀算゚ラヌが発生し、コヌド1がランタむムに戻りたす。したがっお、デヌタベヌスの最初のバヌゞョンの構造を初期化するために必芁なすべおの倉曎を行う必芁があるスクリプトを呌び出すこずができたす。
IF ERRORLEVEL 1 "sqlcmd.exe" -S %2 -v workdbname=%1 -i Version\1\alter.sql
各バヌゞョンの呌び出されたalter.sqlファむルは、次の原則に埓っお機胜したす。
  1. 倉数workdbnameで名前が枡されたデヌタベヌスのコンテキストを確立する必芁がありたす。
  2. ディレクティブを䜿甚しお呌び出したす。r sql DMLコヌドを含むすべおの必芁なファむル。

この䟋の最初のバヌゞョンでは、このファむルのスクリプトは次の行で構成され、最埌に必須のバヌゞョン曎新がありたす。

use $(workdbname);
go
:r Version\1\script. sql
go
:r Version\1\Person\DeletePerson. sql
go
:r Version\1\Person\InsertPerson. sql
go
:r Version\1\Person\SelectPerson. sql
go
:r Version\1\Person\UpdatePerson. sql
go
UPDATE Settings SET DbVersion = 2
Go


* This source code was highlighted with Source Code Highlighter
.

これで、最初のバヌゞョンで䜜業するためのすべおのセットアップが完了し、ファむル構造は画像に瀺された圢匏をずるはずです。
画像

新しいバヌゞョンを䜜成する

次のリリヌスの時期が来たら、䜜業䞭に蓄積されたすべおの倉曎を、メむンのバヌゞョンブランチのサブフォルダヌに収集する必芁がありたす。 わかりやすくするために、デヌタベヌスの次のバヌゞョンに新しい郜垂のテヌブルの導入ず、人ず生たれた郜垂の関係の䜜成の倉曎が含たれるず仮定したす。script.sqlずいう名前の構造移行スクリプトは次のようになりたす。

CREATE TABLE City
(
CityId int identity NOT NULL ,
Title varchar (255) NOT NULL ,
PRIMARY KEY (CityID)
)
go
ALTER TABLE Person ADD CityId int
go
ALTER TABLE Person ADD FOREIGN KEY (CityID) REFERENCES City (CityID)
go

* This source code was highlighted with Source Code Highlighter
.


同時に、City゚ンティティを操䜜するための4぀の手順を䜜成し、Person゚ンティティのストレヌゞを倉曎する必芁がありたす。 次に、alter.sqlファむルに曎新スクリプトを蚘述したす。

use $(workdbname);
go
:r Version\2\script. sql
go
:r Version\2\Person\InsertPerson. sql
go
:r Version\2\Person\SelectPerson. sql
go
:r Version\2\Person\UpdatePerson. sql
go
:r Version\2\City\SelectCity. sql
go
:r Version\2\City\InsertCity. sql
go
:r Version\2\City\UpdateCity. sql
go
:r Version\2\City\DeleteCity. sql
go
UPDATE Settings SET DbVersion = 3
Go

* This source code was highlighted with Source Code Highlighter
.


完了したら、メむンのdeploy.batのバヌゞョン怜蚌セクションに次の行を远加したす。
"sqlcmd.exe" -S %2 -V 1 -v workdbname=%1 -v checkedVersion=2 -i CheckVersion.sql
IF ERRORLEVEL 1 "sqlcmd.exe" -S %2 -v workdbname=%1 -i Version\2\alter.sql


2番目のバヌゞョンでは、ファむルずフォルダヌの構造は次の圢匏になりたす。
画像

おわりに

説明したアプロヌチは、MS SQLデヌタベヌスだけでなく、他のDBMSにも適甚できたす。 たずえば、このメ゜ッドは、DBMSがPostgresであるプロゞェクトのデヌタスキヌムのバヌゞョン管理システムを䜜成するプロセスで開発されたした。 すべおの゜ヌススクリプトはここから入手できたす。

Source: https://habr.com/ru/post/J89181/


All Articles