概要
この記事では、データベーススキーマスナップショットを使用して、さまざまなバージョンのデータベースを維持し、さまざまな環境に展開する方法について説明します。
データベーススキーマスナップショットは、データベースの現在の状態のポイントインタイムコピーであり、通常、ある環境から別の環境に変更を展開するときに違いを調整するために使用されます。
この記事では、データベーススキーマのスナップショットがデータベースの特定の時点のコピーではなく、特定の環境の新しいバージョンを作成するために使用される特定のシナリオに焦点を当てます。
データベーススキーマスナップショットとは
データベーススキーマスナップショットは、単にデータベースの特定の時点のコピーを保存したものです。
つまり、データベーススキーマスナップショットは、データベースの構造の正確なコピーであり、元の形式のデータは含まれていません。
データベーススキーマは、テーブル、ビュー、およびストアドプロシージャを含むすべてのデータベースオブジェクトを参照します。後で使用するためにオブジェクト定義をフリーズするデータベーススキーマスナップショットを作成します。
データベーススキーマスナップショットが必要な理由
データベーススキーマスナップショットは、次の目的で使用できます。
- 将来の参照または将来の使用のためにデータベースの既存の状態をコピーします。
- 複数のデータベーススキーマスナップショットを使用したデータベースのバージョン管理。
- データベース構造のポイントインタイムコピーを作成して、すばやく復元します。
- 新しい変更をデプロイする前に、ターゲットデータベーススキーマのコピーを作成します。
- さらに変更を進める前に、データベーススキーマの最新の安定したコピーを作成します。
- データベースの変更を作成して、データベース環境に直接アクセスできない外部のチームメンバーに共有します。
- データベーススキーマスナップショットを使用して、現在の作業と過去に行われた作業の違いを比較することもできます。
- データベーススキーマのスナップショットは、切断された公開にも使用できます。
複数のデータベースバージョンを保持するための要件
データベース開発チームが、複数の環境に展開される複数のデータベースバージョンを維持および維持するという特別な要件を受け取った場合 次に、解決策の1つは、データベーススキーマスナップショットを使用して要件を満たすことです。
複数のデータベースバージョンの作成
前に説明したように、データベーススキーマスナップショットは、データベース構造のポイントインタイムコピーとして使用されるだけでなく、複数のデータベースバージョンを同時に作成および展開するためにも使用できます。
サンプルデータベースのセットアップ(TechnicalTraining)
dbForge Studio for SQL ServerまたはSSMS(SQL Server Management Studio)を開いて、 TechnicalTrainingというサンプルデータベースをセットアップします。 これには、技術コース、学生、トレーナーに関する情報が含まれており、次のような表がいくつかあります。
-- (1) Creating TechnicalTraining sample database CREATE DATABASE TechnicalTraining; GO USE TechnicalTraining -- (2) Creating Student table CREATE TABLE Student ( StudentId INT IDENTITY ,Name VARCHAR(50) NOT NULL ,RegistrationDate DATETIME2 NULL ,Notes VARCHAR(200) NULL ,CONSTRAINT PK_Student_StudentId PRIMARY KEY CLUSTERED (StudentId) ) GO -- (3) Creating Trainer table CREATE TABLE Trainer ( TrainerId INT IDENTITY ,Name VARCHAR(50) NOT NULL ,Qualification VARCHAR(50) NOT NULL ,Notes VARCHAR(200) NULL ,CONSTRAINT PK_Trainer_TrainerId PRIMARY KEY CLUSTERED (TrainerId) ) GO -- (4) Creating Course table CREATE TABLE Course ( CourseId INT IDENTITY ,Name VARCHAR(50) NOT NULL ,TrainerId INT NULL ,Detail VARCHAR(200) NULL ,CONSTRAINT PK_Course_CourseId PRIMARY KEY CLUSTERED (CourseId) ) ON [PRIMARY] GO ALTER TABLE Course ADD CONSTRAINT FK_Course_TrainerId FOREIGN KEY (TrainerId) REFERENCES dbo.Trainer (TrainerId) GO -- (5) Creating StudentCourse table CREATE TABLE [dbo].[StudentCourse] ( [StudentCourseId] INT IDENTITY(1,1) NOT NULL, [StudentId] INT NULL, [CourseId] INT NULL, [PercentScore] DECIMAL (5, 2) NULL, CONSTRAINT [PK_StudentCourse_StudentCourseId] PRIMARY KEY CLUSTERED ([StudentCourseId] ASC), CONSTRAINT [FK_StudentCourse_Student_StudentId] FOREIGN KEY ([StudentId]) REFERENCES [dbo].[Student] ([StudentId]), CONSTRAINT [FK_StudentCourse_Course_CourseId] FOREIGN KEY ([CourseId]) REFERENCES [dbo].[Course] ([CourseId]) ); GO -- (6) Create view to see student progress report CREATE VIEW StudentProgress as SELECT s.Name AS StudentName,c.Name as CourseName,t.Name AS Trainer,sc.PercentScore FROM StudentCourse sc INNER JOIN Student s on s.StudentId=sc.StudentId INNER JOIN Course c on c.CourseId=sc.CourseId INNER JOIN Trainer t on t.TrainerId=c.TrainerId GO
TechnicalTrainingデータベースは、以下に示すように、多くの学生が多くのコースを受講できるように構成されていますが、各コースには1人のトレーナーしか持てないことに注意してください。
SQLServer用のdbForgeStudioを使用しているため、SSMS(SQL Server Management Studio)で同じコードを実行すると、出力の外観が異なる場合があることに注意してください。ただし、スクリプトとその結果に違いはありません。
次のスクリプトを使用してデータベースにデータを入力します。
USE TechnicalTraining -- (1) Populating Trainer table SET IDENTITY_INSERT [dbo].[Trainer] ON INSERT INTO [dbo].[Trainer] ([TrainerId], [Name], [Qualification], [Notes]) VALUES (1, N'George', N'MSc Computer Science', NULL) INSERT INTO [dbo].[Trainer] ([TrainerId], [Name], [Qualification], [Notes]) VALUES (2, N'Akeel', N'MSc Database Management', NULL) INSERT INTO [dbo].[Trainer] ([TrainerId], [Name], [Qualification], [Notes]) VALUES (3, N'Sarah', N'MSc Data Science', NULL) INSERT INTO [dbo].[Trainer] ([TrainerId], [Name], [Qualification], [Notes]) VALUES (4, N'Ben', N'BSc Computer Science', NULL) SET IDENTITY_INSERT [dbo].[Trainer] OFF -- (2) Populating Course table SET IDENTITY_INSERT [dbo].[Course] ON INSERT INTO [dbo].[Course] ([CourseId], [Name], [TrainerId], [Detail]) VALUES (1, N'Database Development', 1, NULL) INSERT INTO [dbo].[Course] ([CourseId], [Name], [TrainerId], [Detail]) VALUES (2, N'Data Analysis ', 2, NULL) INSERT INTO [dbo].[Course] ([CourseId], [Name], [TrainerId], [Detail]) VALUES (3, N'Data Reports Development', 2, NULL) INSERT INTO [dbo].[Course] ([CourseId], [Name], [TrainerId], [Detail]) VALUES (4, N'Basics of Business Intelligence', 3, NULL) INSERT INTO [dbo].[Course] ([CourseId], [Name], [TrainerId], [Detail]) VALUES (5, N'Big Data Fundamentals', 4, NULL) SET IDENTITY_INSERT [dbo].[Course] OFF -- (3) Populating Student table SET IDENTITY_INSERT [dbo].[Student] ON INSERT INTO [dbo].[Student] ([StudentId], [Name], [RegistrationDate], [Notes]) VALUES (1, N'Asif', N'2017-01-01 00:00:00', NULL) INSERT INTO [dbo].[Student] ([StudentId], [Name], [RegistrationDate], [Notes]) VALUES (2, N'Mike', N'2017-02-01 00:00:00', NULL) INSERT INTO [dbo].[Student] ([StudentId], [Name], [RegistrationDate], [Notes]) VALUES (3, N'Naveed', N'2017-03-10 00:00:00', NULL) INSERT INTO [dbo].[Student] ([StudentId], [Name], [RegistrationDate], [Notes]) VALUES (4, N'Sam', N'2017-04-15 00:00:00', NULL) INSERT INTO [dbo].[Student] ([StudentId], [Name], [RegistrationDate], [Notes]) VALUES (5, N'Mona', N'2017-07-10 00:00:00', NULL) SET IDENTITY_INSERT [dbo].[Student] OFF -- (4) Populating StudentCourse table SET IDENTITY_INSERT [dbo].[StudentCourse] ON INSERT INTO [dbo].[StudentCourse] ([StudentCourseId], [StudentId], [CourseId], [PercentScore]) VALUES (1, 1, 1, CAST(72.00 AS Decimal(5, 2))) INSERT INTO [dbo].[StudentCourse] ([StudentCourseId], [StudentId], [CourseId], [PercentScore]) VALUES (2, 1, 2, CAST(75.00 AS Decimal(5, 2))) INSERT INTO [dbo].[StudentCourse] ([StudentCourseId], [StudentId], [CourseId], [PercentScore]) VALUES (3, 2, 2, CAST(80.00 AS Decimal(5, 2))) INSERT INTO [dbo].[StudentCourse] ([StudentCourseId], [StudentId], [CourseId], [PercentScore]) VALUES (4, 2, 3, CAST(70.00 AS Decimal(5, 2))) INSERT INTO [dbo].[StudentCourse] ([StudentCourseId], [StudentId], [CourseId], [PercentScore]) VALUES (5, 3, 5, CAST(80.00 AS Decimal(5, 2))) SET IDENTITY_INSERT [dbo].[StudentCourse] OFF
データベースチェック
StudentProgressを右クリックします ビューの下 フォルダをクリックし、データの取得をクリックします または、次のT-SQLコードを入力します。
-- View students progress SELECT s.Name,c.Name as CourseName,t.Name,sc.PercentScore FROM StudentCourse sc INNER JOIN Student s on s.StudentId=sc.StudentId INNER JOIN Course c on c.CourseId=sc.CourseId INNER JOIN Trainer t on t.TrainerId=c.TrainerId order by s.Name
出力は次のとおりです。
データベーススキーマスナップショットを作成してバージョン1をセットアップする
現在のデータベース構造はデータベースのバージョン1の要件を満たしているため、これはデータベーススキーマのポイントインタイムコピーを保存するときです。
スキーマスナップショットバージョン1の作成
TechnicalTrainingを右クリックします データベースエクスプローラーのデータベース dbForge Studio for SQL Server(または、データベーススキーマスナップショットを作成できる同様のツールを使用できます)の場合は、[タスク]をクリックします。 次に、スクリプトフォルダまたはスナップショットの作成…をクリックします。 以下に示すように:
目的の場所にスナップショットを作成し、 TechnicalTraining-Version-001-StudentCourseTrainer.snapという名前を付けます。 次のように:
スキーマスナップショットバージョン1を確認する
フォルダをチェックして、バージョン1の最近作成されたデータベーススキーマスナップショットを表示します:
新しいテーブルCourseTypeを追加
ここで、 CourseTypeという別のテーブルを追加しましょう。 次のスクリプトを使用して、既存のデータベースに追加します。
-- Adding CourseType table CREATE TABLE CourseType ( CourseTypeId INT IDENTITY ,Name VARCHAR(50) NOT NULL ,Detail VARCHAR(250) NULL ,CONSTRAINT PK_CourseType_CourseId PRIMARY KEY CLUSTERED (CourseTypeId) ); GO
次のようにテーブルにデータを挿入します。
SET IDENTITY_INSERT [dbo].[CourseType] ON INSERT INTO [dbo].[CourseType] ([CourseTypeId], [Name], [Detail]) VALUES (1, N'Basic', NULL) INSERT INTO [dbo].[CourseType] ([CourseTypeId], [Name], [Detail]) VALUES (2, N'Intermediate', NULL) INSERT INTO [dbo].[CourseType] ([CourseTypeId], [Name], [Detail]) VALUES (3, N'Advanced', NULL) SET IDENTITY_INSERT [dbo].[CourseType] OFF
コーステーブルを変更してCourseType列を追加する
Courseテーブルを更新して、CourseType外部キーを追加します:
-- Drop foreign key constraint ALTER TABLE StudentCourse Drop Constraint [FK_StudentCourse_Course_CourseId] -- Drop Course table DROP TABLE Course -- Create Course table with new column CourseTypeId CREATE TABLE [dbo].[Course] ( [CourseId] INT IDENTITY (1, 1) NOT NULL, [CourseTypeId] INT, [Name] VARCHAR (50) NOT NULL, [TrainerId] INT NULL, [Detail] VARCHAR (200) NULL, CONSTRAINT [PK_Course_CourseId] PRIMARY KEY CLUSTERED ([CourseId] ASC), CONSTRAINT [FK_Course_TrainerId] FOREIGN KEY ([TrainerId]) REFERENCES [dbo].[Trainer] ([TrainerId]), CONSTRAINT [FK_Course_CourseTypeId] FOREIGN KEY ([CourseTypeId]) REFERENCES [CourseType]([CourseTypeId]) ); GO
次のように、新しく変更されたコーステーブルにデータを追加します。
-- Add data to the Course table SET IDENTITY_INSERT [dbo].[Course] ON INSERT INTO [dbo].[Course] ([CourseId], [CourseTypeId], [Name], [TrainerId], [Detail]) VALUES (1, 1, N'Database Development', 1, NULL) INSERT INTO [dbo].[Course] ([CourseId], [CourseTypeId], [Name], [TrainerId], [Detail]) VALUES (2, 3, N'Data Analysis ', 2, NULL) INSERT INTO [dbo].[Course] ([CourseId], [CourseTypeId], [Name], [TrainerId], [Detail]) VALUES (3, 2, N'Data Reports Development', 2, NULL) INSERT INTO [dbo].[Course] ([CourseId], [CourseTypeId], [Name], [TrainerId], [Detail]) VALUES (4, 1, N'Basics of Business Intelligence', 3, NULL) INSERT INTO [dbo].[Course] ([CourseId], [CourseTypeId], [Name], [TrainerId], [Detail]) VALUES (5, 1, N'Big Data Fundamentals', 4, NULL) SET IDENTITY_INSERT [dbo].[Course] OFF -- Add Foreign key constraint back to StudentCourse table ALTER TABLE StudentCourse ADD CONSTRAINT [FK_StudentCourse_Course_CourseId] FOREIGN KEY ([CourseId]) REFERENCES [dbo].[Course] ([CourseId])
新しいビューCoursesWithTypesを追加
次に、新しいビューを追加して、次のようにすべてのコースとそのタイプを表示します。
-- Creating a view to see courses with their types Create VIEW CoursesWithTypes AS SELECT c.CourseId,c.Name as CousreName,ct.Name as CourseType FROM dbo.Course c inner join dbo.CourseType ct on c.CourseTypeId=ct.CourseTypeId; GO
データベースチェック
データベース構造を表示して、最新の変更を確認します。
ビューCoursesWithTypesを実行します:
データベーススキーマスナップショットを作成してバージョン2をセットアップする
データベース構造の別のポイントインタイムコピーを作成して、データベースのバージョン2をマークします。
データベーススキーマスナップショットを作成し、それを TechnicalTraining-Version-002-StudentCourseTrainerCourseType.snapと呼びます。 次のように:
複数のデータベースバージョンの導入
バージョン1およびバージョン2のデータベーススキーマスナップショットの作成に成功すると、要件に応じて任意のバージョンを任意の環境にデプロイできるようになります。
スキーマスナップショットバージョン1からの開発データベースの作成
比較->新しいスキーマの比較をクリックします dbForge Studio for SQL Serverのメニューバーから:
次に、ソースタイプをスナップショットに設定します データベーススキーマスナップショットバージョン1を見つけますTechnicalTraining-Version-001-StudentCourseTrainer.snap 以前に作成し、プラス記号をクリックして、その場でターゲットデータベースを作成します:
データベース名を入力しますTechnicalTrainingV1_DEV [OK]をクリックします:
次へをクリックします :
次へをクリックします もう一度デフォルトのオプションを選択します 次に、[次へ]をクリックします デフォルトのスキーママッピングオプションを続行するには、[比較]をクリックします :
以下に示すように、中央の緑色のアイコンをクリックして、ソースとターゲットを同期します。
さらにいくつかの手順を実行したら、[同期]をクリックします :
次に、スクリプトを実行して、最終的に TechnicalTrainingV1_DEVを作成します。 データベースのバージョン1を表すデータベーススキーマスナップショットからのデータベース:
TechnicalTrainingデータベースバージョン1のコピーである新しく作成されたデータベースを表示します:
スキーマスナップショットバージョン2からの開発データベースの作成
次に、バージョン2データベーススキーマスナップショット TechnicalTraining-Version-002-StudentCourseTrainerCourseType をポイントするだけで、バージョン1を作成するために説明した手順に従って、データベースのバージョン2を作成します。 今回:
バージョン1とバージョン2の比較
両方のデータベースをすばやく比較して、違いを確認しましょう。
おめでとう!データベーススキーマのスナップショットを使用して、データベースの複数のバージョンを正常に作成しました。
やるべきこと
データベーススキーマスナップショットを簡単に利用して、データベースの複数のバージョンを作成および展開できるようになりました。
- 前回の記事で説明したSQLDevBlogTDDの複数のバージョンを作成します。
- バージョン1の会議でデータベースの複数のバージョンを作成します著者レポートごとの記事の総数 要件とバージョン2の会議年間レポートの総数 前回の記事に続いて。
- 以前の記事「データベース単体テストで依存関係とデータを分離する方法」に目を通し、データベーススキーマスナップショットを使用して、1つはtSQLt単体テストあり、もう1つはtSQLt単体テストなしで2つの異なるバージョンのデータベースを作成できるかどうかを確認します。 >
便利なツール:
dbForge Studio for SQL Server – SQL Serverの管理、管理、開発、データレポート、および分析のための強力なIDE。