Database
 sql >> Database >  >> RDS >> Database

Creazione e distribuzione di più versioni di database tramite snapshot di schema

Panoramica

Questo articolo parla dell'utilizzo degli snapshot dello schema del database per mantenere diverse versioni di un database da distribuire in ambienti diversi.

Gli snapshot dello schema del database sono copie temporizzate dello stato corrente del database che vengono normalmente utilizzate per riconciliare le differenze durante la distribuzione delle modifiche da un ambiente a un altro.

Questo articolo sarà incentrato su uno scenario particolare in cui gli snapshot dello schema del database sono più che semplici copie temporizzate del database, ma vengono utilizzati per creare nuove versioni di ambienti specifici.

Che cos'è l'istantanea dello schema del database

Un'istantanea dello schema del database è semplicemente una copia salvata nel tempo di un database.

In altre parole, un'istantanea dello schema del database è una copia esatta della struttura del database che non include i dati nella sua forma originale.

Lo schema del database si riferisce a tutti gli oggetti del database, comprese le tabelle, le viste e le procedure memorizzate. Creiamo uno snapshot dello schema del database per bloccare le definizioni degli oggetti per un uso successivo.

Perché è necessaria l'istantanea dello schema del database

Gli snapshot dello schema del database possono essere utilizzati per i seguenti scopi:

  1. Copiare uno stato esistente di un database per riferimento futuro o uso futuro.
  2. Versionamento di un database tramite più snapshot dello schema del database.
  3. Creazione di una copia puntuale della struttura del database per un ripristino rapido.
  4. Creazione di una copia dello schema del database di destinazione prima di distribuire nuove modifiche.
  5. Creazione di una copia stabile più recente dello schema del database prima di procedere ulteriormente con ulteriori modifiche.
  6. Creazione e condivisione delle modifiche al database con un membro del team esterno che non può accedere direttamente all'ambiente del database.
  7. L'istantanea dello schema del database può essere utilizzata anche per confrontare le differenze tra il lavoro corrente e il lavoro svolto in passato.
  8. Gli snapshot dello schema del database possono essere utilizzati anche per la pubblicazione disconnessa.

Requisito per mantenere più versioni del database

Se il tuo team di sviluppo del database ha ricevuto un requisito speciale per conservare e mantenere più versioni del database da distribuire in più ambienti quindi una delle soluzioni consiste nell'utilizzare gli snapshot dello schema del database per soddisfare il requisito.

Creazione di più versioni di database

Come discusso in precedenza, gli snapshot dello schema del database non vengono utilizzati solo come copie temporizzate della struttura del database, ma possono anche essere utilizzati per creare e distribuire più versioni del database contemporaneamente.

Impostazione database di esempio (formazione tecnica)

Aprire dbForge Studio per SQL Server o SSMS (SQL Server Management Studio) per configurare un database di esempio chiamato TechnicalTraining che contiene le informazioni su corsi tecnici, studenti e formatori con le poche tabelle come segue:

-- (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

Si prega di notare che il database TechnicalTraining è strutturato in modo tale che molti studenti possano seguire molti corsi mentre ogni corso può avere un solo trainer come mostrato di seguito:

Si noti che sto usando dbForge Studio per SQL Server, quindi l'aspetto dell'output potrebbe differire se si esegue lo stesso codice in SSMS (SQL Server Management Studio). Tuttavia, non vi è alcuna differenza tra gli script ei relativi risultati.

Popolare il database utilizzando il seguente script:

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

Controllo database

Fai clic con il pulsante destro del mouse su Progresso studente sotto le Viste cartella e fai clic su Recupera dati o in alternativa digitare il seguente codice 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

L'output è il seguente:

Installazione della versione 1 tramite la creazione di un'istantanea dello schema del database

Questo è il momento di salvare la copia point-in-time dello schema del database poiché la struttura del database corrente soddisfa i requisiti per la versione 1 del database.

Crea istantanea dello schema versione 1

Fai clic con il pulsante destro del mouse su Formazione tecnica database in Esplora database di dbForge Studio per SQL Server (oppure puoi utilizzare qualsiasi strumento simile a tua scelta in grado di creare snapshot dello schema del database), fai clic su Attività quindi fai clic su Crea cartella o istantanea degli script... come mostrato di seguito:

Crea un'istantanea nella posizione desiderata e chiamala TechnicalTraining-Version-001-StudentCourseTrainer.snap come segue:

Controlla l'istantanea dello schema versione 1

Controllare la cartella per visualizzare lo snapshot dello schema del database creato di recente della versione 1:

Aggiungi una nuova tabella CourseType

Aggiungiamo ora un'altra tabella chiamata CourseType al database esistente con l'aiuto del seguente script:

-- 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

Inserisci i dati nella tabella come segue:

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

Modifica la tabella del corso per aggiungere la colonna CourseType

Aggiorna la tabella Course per aggiungere la chiave esterna 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

Aggiungi i dati alla tabella del corso appena modificata come segue:

-- 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])

Aggiungi nuova visualizzazione CoursesWithTypes

Ora aggiungi una nuova vista per vedere tutti i corsi con i loro tipi come segue:

-- 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

Controllo database

Visualizza la struttura del database per vedere le modifiche più recenti:

Esegui la visualizzazione CoursesWithTypes:

Installazione della versione 2 tramite la creazione di un'istantanea dello schema del database

Crea un'altra copia puntuale della struttura del database per contrassegnare la versione 2 del database.

Crea un'istantanea dello schema del database e chiamala TechnicalTraining-Version-002-StudentCourseTrainerCourseType.snap come segue:

Distribuzione di più versioni di database

Dopo aver creato correttamente gli snapshot dello schema del database per la versione 1 e la versione 2, ora possiamo distribuire qualsiasi versione in qualsiasi ambiente secondo i requisiti.

Creazione di un database di sviluppo dall'istantanea dello schema versione 1

Fare clic su Confronto-> Confronto nuovo schema dalla barra dei menu in dbForge Studio per SQL Server:

Quindi imposta Tipo di origine come Istantanea e individuare l'istantanea dello schema del database versione 1 TechnicalTraining-Version-001-StudentCourseTrainer.snap abbiamo creato in precedenza e fare clic sul simbolo più per creare al volo il database di destinazione:

Digita il nome del database TechnicalTrainingV1_DEV e fare clic su OK:

Fai clic su Avanti :

Fai clic su Avanti di nuovo per selezionare le Opzioni predefinite e quindi fare clic su Avanti per continuare con le opzioni predefinite di Schema Mapping, quindi fare clic su Confronta :

Sincronizza Sorgente e Destinazione facendo clic sull'icona verde al centro come mostrato di seguito:

Dopo qualche altro passaggio, fai clic su Sincronizza :

Quindi, esegui lo script per creare finalmente il TechnicalTrainingV1_DEV database dall'istantanea dello schema del database che rappresenta la versione 1 del database:

Visualizza il database appena creato che è una copia del database TechnicalTraining versione 1:

Creazione di un database di sviluppo dall'istantanea dello schema versione 2

Ora crea la versione 2 del database seguendo i passaggi indicati per creare la versione 1 semplicemente puntando all'istantanea dello schema del database della versione 2 TechnicalTraining-Version-002-StudentCourseTrainerCourseType questa volta:

Confronto tra la versione 1 e la versione 2

Confrontiamo rapidamente entrambi i database per vedere le differenze.

Congratulazioni! Hai creato con successo più versioni del database tramite snapshot dello schema del database.

Cose da fare

Ora puoi utilizzare facilmente gli snapshot dello schema del database per creare e distribuire più versioni del database.

  1. Crea più versioni di SQLDevBlogTDD menzionate nel mio articolo precedente.
  2. Crea più versioni del database con la riunione della versione 1 Numero totale di articoli per rapporto dell'autore requisito e versione 2 che soddisfano il Rapporto sul numero totale di articoli per anno seguendo il mio precedente articolo.
  3. Esamina il mio precedente articolo Art of Isolating Dependencies and Data in Database Unit Testing e verifica se puoi creare due diverse versioni del database tramite snapshot dello schema del database, una con unit test tSQLt e l'altra senza unit test tSQLt.

Strumento utile:

dbForge Studio per SQL Server:potente IDE per la gestione, l'amministrazione, lo sviluppo, il reporting e l'analisi dei dati di SQL Server.