Overzicht
Dit artikel gaat over het gebruik van snapshots van databaseschema's om verschillende versies van een database te onderhouden die in verschillende omgevingen kunnen worden geïmplementeerd.
Snapshots van databaseschema's zijn point-in-time kopieën van de huidige status van de database die normaal worden gebruikt om de verschillen te overbruggen bij het implementeren van wijzigingen van de ene omgeving naar een andere omgeving.
Dit artikel is gericht op een bepaald scenario waarin snapshots van databaseschema's meer zijn dan alleen point-in-time kopieën van de database, maar worden gebruikt om nieuwe versies van specifieke omgevingen te maken.
Wat is Database Schema Snapshot
Een momentopname van een databaseschema is gewoon een opgeslagen tijdstipkopie van een database.
Met andere woorden, een momentopname van een databaseschema is een exacte kopie van de structuur van de database die geen gegevens in de oorspronkelijke vorm bevat.
Databaseschema verwijst naar alle databaseobjecten, inclusief tabellen, views en opgeslagen procedures. We maken een momentopname van een databaseschema om de objectdefinities te bevriezen voor later gebruik.
Waarom is een momentopname van het databaseschema nodig
Snapshots van databaseschema's kunnen voor de volgende doeleinden worden gebruikt:
- Een bestaande status van een database kopiëren voor toekomstig gebruik of toekomstig gebruik.
- Versionering van een database via meerdere snapshots van databaseschema's.
- Een tijdkopie van de databasestructuur maken voor snel herstel.
- Een kopie maken van het doeldatabaseschema voordat nieuwe wijzigingen worden geïmplementeerd.
- Een meest recente stabiele kopie van het databaseschema maken voordat u verder gaat met meer wijzigingen.
- Databasewijzigingen maken en delen met een extern teamlid dat geen rechtstreekse toegang heeft tot de databaseomgeving.
- Snapshot van het databaseschema kan ook worden gebruikt om de verschillen te vergelijken tussen het huidige werk en het werk dat in het verleden is gedaan.
- Snapshots van databaseschema's kunnen ook worden gebruikt voor niet-verbonden publicatie.
Vereiste om meerdere databaseversies te behouden
Als uw database-ontwikkelingsteam een speciale vereiste heeft ontvangen om meerdere databaseversies te behouden en te onderhouden die in meerdere omgevingen moeten worden geïmplementeerd dan is een van de oplossingen het gebruik van snapshots van databaseschema's om aan de vereiste te voldoen.
Meerdere databaseversies maken
Zoals eerder besproken, worden momentopnamen van databaseschema's niet alleen gebruikt als point-in-time kopieën van de databasestructuur, maar kunnen ze ook worden gebruikt om meerdere databaseversies tegelijk te maken en te implementeren.
Voorbeeld van database-setup (technische training)
Open dbForge Studio voor SQL Server of SSMS (SQL Server Management Studio) om een voorbeelddatabase in te stellen met de naam TechnicalTraining die de informatie bevat over technische cursussen, studenten en trainers met de volgende tabellen:
-- (1) Aanmaken TechnicalTraining-voorbeelddatabase CREATE DATABASE TechnicalTraining;GOUSE TechnicalTraining-- (2) Creëren van studententabelCREATE 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) Trainertabel makenCREATE 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) Cursustabel makenCREATE TABLE Cursus ( CourseId INT IDENTITY ,Name VARCHAR(50) NOT NULL ,TrainerId INT NULL ,Detail VARCCHAR(200) NULL ,CONSTRAINTOUR CourseId)) OP [PRIMARY]GOALTER-TABEL CourseADD CONSTRAINT FK_Course_TrainerId FOREIGN KEY (TrainerId) REFERENTIES dbo.Trainer (TrainerId)GO-- (5) StudentCourse-tabel maken CREATE TABLE [dbo].[StudentCourseou] ( [StudentCourseou] ( [StudentCourseou] ( [StudentCourseou] ( [StudentCourseou] ( [StudentCourseou] ( [StudentCourseou] rseId] INT IDENTITY(1,1) NOT NULL, [StudentId] INT NULL, [CourseId] INT NULL, [PercentScore] DECIMAAL (5, 2) NULL, CONSTRAINT [PK_StudentCourse_StudentCourseId] PRIMARY KEY CLUSTERED), ([StudentCourseId] [FK_StudentCourse_Student_StudentId] FOREIGN KEY ([StudentId]) REFERENTIES [dbo].[Student] ([StudentId]), CONSTRAINT [FK_StudentCourse_Course_CourseId] BUITENLANDSE SLEUTEL ([REFERENTIE].[CourseId]) GO-- (6) Maak een weergave om het voortgangsrapport van de student te bekijkenCREATE VIEW StudentProgress asSELECT s.Name AS StudentName,c.Name as CourseName,t.Name AS Trainer,sc.PercentScore VAN StudentCourse sc INNER WORD LID Student zoon s.StudentId=sc. StudentIdINNER DEELNEEM AAN Cursus met c.CourseId=sc.CourseIdINNER WORD LID VAN Trainer ton t.TrainerId=c.TrainerIdGO
Houd er rekening mee dat de database van TechnicalTraining zo is gestructureerd dat veel studenten veel cursussen kunnen volgen, terwijl elke cursus slechts één trainer kan hebben, zoals hieronder weergegeven:
Houd er rekening mee dat ik dbForge Studio voor SQL Server gebruik, dus het uiterlijk van de uitvoer kan verschillen als u dezelfde code uitvoert in SSMS (SQL Server Management Studio). Er is echter geen verschil tussen scripts en hun resultaten.
Vul de database met het volgende script:
USE TechnicalTraining-- (1) Trainertabel invullenSET IDENTITY_INSERT [dbo].[Trainer] ONINSERT INTO [dbo].[Trainer] ([TrainerId], [Name], [Qualification], [Notes]) WAARDEN (1 , N'George', N'MSc Computer Science', NULL)INSERT INTO [dbo].[Trainer] ([TrainerId], [Name], [Qualification], [Notes]) WAARDEN (2, N'Akeel', N'MSc Database Management', NULL)INSERT INTO [dbo].[Trainer] ([TrainerId], [Name], [Qualification], [Notes]) WAARDEN (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) Cursustabel invullenSET IDENTITY_INSERT [dbo].[Course] ONINSERT INTO [dbo].[Course] ([CourseId], [Name], [TrainerId], [Detail]) WAARDEN (1, N'Database Development', 1, NULL)INSERT INTO [dbo].[Course] ([CourseId], [Name], [TrainerId], [Detail]) WAARDEN (2, N'Data Analysis ', 2 , NULL)INSERT INTO [dbo].[Course] ([CourseId], [Name], [TrainerId], [Det ail]) WAARDEN (3, N'Data Reports Development', 2, NULL)INSERT INTO [dbo].[Course] ([CourseId], [Name], [TrainerId], [Detail]) WAARDEN (4, N' Basisprincipes van Business Intelligence', 3, NULL)INSERT INTO [dbo].[Course] ([CourseId], [Name], [TrainerId], [Detail]) WAARDEN (5, N'Big Data Fundamentals', 4, NULL )SET IDENTITY_INSERT [dbo].[Course] OFF-- (3) Student-tabel vullenSET IDENTITY_INSERT [dbo].[Student] ONINSERT INTO [dbo].[Student] ([StudentId], [Name], [RegistrationDate], [ Notes]) WAARDEN (1, N'Asif', N'2017-01-01 00:00:00', NULL)INSERT INTO [dbo].[Student] ([StudentId], [Name], [RegistrationDate], [Opmerkingen]) WAARDEN (2, N'Mike', N'2017-02-01 00:00:00', NULL)INSERT INTO [dbo].[Student] ([StudentId], [Name], [RegistrationDate] , [Opmerkingen]) WAARDEN (3, N'Naveed', N'2017-03-10 00:00:00', NULL)INSERT INTO [dbo].[Student] ([StudentId], [Naam], [Registratiedatum ], [Opmerkingen]) WAARDEN (4, N'Sam', N'2017-04-15 00:00:00', NULL)INSERT INTO [dbo].[Student] ([StudentId], [Naam], [ Registratiedatum], [Opmerkingen]) VALUES (5, N'Mona', N'2017-07-10 00:00:00', NULL)SET IDENTITY_INSERT [dbo].[Student] OFF-- (4) StudentCourse-tabel invullenSET IDENTITY_INSERT [dbo].[StudentCourse] ] ONINSERT INTO [dbo].[StudentCourse] ([StudentCourseId], [StudentId], [CourseId], [PercentScore]) WAARDEN (1, 1, 1, CAST(72.00 AS Decimal(5, 2)))INSERT INTO [ dbo].[StudentCourse] ([StudentCourseId], [StudentId], [CourseId], [PercentScore]) WAARDEN (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]) WAARDEN (4, 2, 3, CAST(70.00 AS Decimal(5, 2)))INSERT INTO [dbo].[StudentCourse] ([StudentCourseId], [ StudentId], [CourseId], [PercentScore]) WAARDEN (5, 3, 5, CAST (80.00 AS Decimaal (5, 2)))SET IDENTITY_INSERT [dbo].[StudentCourse] UIT
Databasecontrole
Klik met de rechtermuisknop op StudentProgress onder de Weergaven map en klik op Gegevens ophalen of typ de volgende T-SQL-code:
-- Bekijk de voortgang van studentenSELECT s.Name,c.Name as CourseName,t.Name,sc.PercentScore FROM StudentCourse scINNER JOIN Student zoon s.StudentId=sc.StudentIdINNER JOIN Course con c.CourseId=sc.CourseIdINNER JOIN Trainer ton t.TrainerId=c.TrainerIdorder op s.Name
De uitvoer is als volgt:
Versie 1 instellen door momentopname van databaseschema te maken
Dit is het moment om de point-in-time kopie van het databaseschema op te slaan, aangezien de huidige databasestructuur voldoet aan de vereisten voor versie 1 van de database.
Maak Schema Snapshot Versie 1
Klik met de rechtermuisknop op de Technische training database in Database Explorer van dbForge Studio voor SQL Server (of u kunt een vergelijkbare tool naar keuze gebruiken die in staat is om snapshots van databaseschema's te maken), klik op Taken en klik vervolgens op Maak scriptmap of momentopname... zoals hieronder weergegeven:
Maak een momentopname op de door u gewenste locatie en noem deze TechnicalTraining-Version-001-StudentCourseTrainer.snap als volgt:
Controleer Schema Snapshot Versie 1
Controleer de map om de recent gemaakte momentopname van het databaseschema van versie 1 te bekijken:
Nieuw tabel cursustype toevoegen
Laten we nu nog een tabel toevoegen met de naam CourseType naar de bestaande database met behulp van het volgende script:
-- CourseType-tabel toevoegen CREATE TABLE CourseType ( CourseTypeId INT IDENTITY ,Name VARCHAR(50) NOT NULL ,Detail VARCHAR(250) NULL ,CONSTRAINT PK_CourseType_CourseId PRIMARY KEY CLUSTERED (CourseTypeId));GO
Voeg als volgt gegevens in de tabel in:
SET IDENTITY_INSERT [dbo].[CourseType] ONINSERT INTO [dbo].[CourseType] ([CourseTypeId], [Name], [Detail]) VALUES (1, N'Basic', NULL)INSERT INTO [dbo] .[CourseType] ([CourseTypeId], [Name], [Detail]) WAARDEN (2, N'Intermediate', NULL)INSERT INTO [dbo].[CourseType] ([CourseTypeId], [Name], [Detail]) VALUES (3, N'Advanced', NULL)SET IDENTITY_INSERT [dbo].[CourseType] UIT
Cursustabel wijzigen om kolom CourseType toe te voegen
Werk de cursustabel bij om de externe sleutel van CourseType toe te voegen:
-- Drop Foreign Key constraintALTER TABLE StudentCourseDrop Constraint [FK_StudentCourse_Course_CourseId]-- Drop Course tableDROP TABLE Course-- Cursustabel maken met nieuwe kolom CourseTypeIdCREATE TABLE [dbo].[Course] ( [CourseId] INT IDENTITEIT (1, 1) NOT NULL, [CourseTypeId] INT, [Name] VARCHAR (50) NOT NULL, [TrainerId] INT NULL, [Detail] VARCHAR (200) NULL, CONSTRAINT [PK_Course_CourseId] PRIMAIRE SLEUTEL CLUSTERED ([CourseId] ASC), CONSTRAINTse [FTraKinerCourse] ] FOREIGN KEY ([TrainerId]) REFERENTIES [dbo].[Trainer] ([TrainerId]), CONSTRAINT [FK_Course_CourseTypeId] FOREIGN KEY ([CourseTypeId]) REFERENTIES [CourseType]([CourseTypeId>));GOVoeg als volgt gegevens toe aan de zojuist gewijzigde cursustabel:
-- Gegevens toevoegen aan de cursustabelSET IDENTITY_INSERT [dbo].[Course] ONINSERT 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]) WAARDEN (2, 3 , N'Data Analysis ', 2, NULL)INSERT INTO [dbo].[Course] ([CourseId], [CourseTypeId], [Name], [TrainerId], [Detail]) WAARDEN (3, 2, N'Data Reports Development', 2, NULL)INSERT INTO [dbo].[Course] ([CourseId], [CourseTypeId], [Name], [TrainerId], [Detail]) WAARDEN (4, 1, N'Basics of Business Intelligence ', 3, NULL)INSERT INTO [dbo].[Course] ([CourseId], [CourseTypeId], [Name], [TrainerId], [Detail]) WAARDEN (5, 1, N'Big Data Fundamentals', 4 , NULL)SET IDENTITY_INSERT [dbo].[Course] OFF--Foreign key-beperking terug toevoegen aan StudentCourse-tabelALTER TABLE StudentCourse ADD CONSTRAINT [FK_StudentCourse_Course_CourseId] FOREIGN KEY ([CourseId]) REFERENCES [dbo].[CourseIdbo].[CourseIdbo].[CourseIdbo].[CourseIdbo].
Nieuwe weergave CoursesWithTypes toevoegen
Voeg nu een nieuwe weergave toe om alle cursussen met hun typen als volgt te zien:
-- Een weergave maken om cursussen met hun typen te zienCreate VIEW CoursesWithTypes ASSELECT c.CourseId,c.Name as CousreName,ct.Name as CourseType FROM dbo.Course c inner join dbo.CourseType cton c.CourseTypeId=ct.CourseTypeId;GO
Databasecontrole
Bekijk de databasestructuur om de meest recente wijzigingen te zien:
Voer de weergave CoursesWithTypes uit:
Versie 2 instellen door momentopname van databaseschema te maken
Maak nog een point-in-time kopie van de databasestructuur om versie 2 van de database te markeren.
Maak een momentopname van een databaseschema en noem deze TechnicalTraining-Version-002-StudentCourseTrainerCourseType.snap als volgt:
Meerdere databaseversies implementeren
Na succesvolle creatie van snapshots van databaseschema's voor versie 1 en versie 2, kunnen we nu elke versie in elke omgeving implementeren volgens de vereisten.
Dev-database maken van Schema Snapshot versie 1
Klik op Vergelijking-> Nieuwe schemavergelijking vanuit de menubalk in dbForge Studio voor SQL Server:
Stel vervolgens Brontype in als Momentopname en zoek de momentopname van het databaseschema versie 1 TechnicalTraining-Version-001-StudentCourseTrainer.snap die we eerder hebben gemaakt en klik op het plusteken om direct een doeldatabase te maken:
Typ de databasenaam TechnicalTrainingV1_DEV en klik op OK:
Klik op Volgende :
Klik op Volgende nogmaals om standaard Opties te selecteren en klik vervolgens op Volgende om door te gaan met de standaard Schema Mapping-opties en klik vervolgens op Vergelijken :
Synchroniseer bron en doel door op het groene pictogram in het midden te klikken, zoals hieronder weergegeven:
Klik na nog een paar stappen opSynchroniseren :
Voer vervolgens het script uit om uiteindelijk de TechnicalTrainingV1_DEV . te maken database uit het databaseschema snapshot die versie 1 van de database vertegenwoordigt:
Bekijk de nieuw aangemaakte database die een kopie is van TechnicalTraining database versie 1:
Dev-database maken van Schema Snapshot versie 2
Maak nu versie 2 van de database door de genoemde stappen te volgen om versie 1 te maken door simpelweg te verwijzen naar de versie 2 Database Schema Snapshot TechnicalTraining-Version-002-StudentCourseTrainerCourseType deze keer:
Versie 1 en versie 2 vergelijken
Laten we snel beide databases vergelijken om de verschillen te zien.
Gefeliciteerd! U hebt met succes meerdere versies van de database gemaakt via snapshots van databaseschema's.
Dingen om te doen
U kunt nu eenvoudig gebruik maken van momentopnamen van databaseschema's om meerdere versies van de database te maken en te implementeren.
- Maak meerdere versies van SQLDevBlogTDD die in mijn vorige artikel worden genoemd.
- Maak meerdere versies van de database met versie 1 meeting Totaal aantal artikelen per auteursrapport vereiste en versie 2 voldoen aan Totaal aantal artikelen per jaarrapport naar aanleiding van mijn vorige artikel.
- Bekijk mijn vorige artikel Kunst van het isoleren van afhankelijkheden en gegevens in het testen van database-eenheden en kijk of je twee verschillende versies van de database kunt maken door middel van snapshots van databaseschema's, één met tSQLt-eenheidstests en de andere zonder tSQLt-eenheidstests.
Handig hulpmiddel:
dbForge Studio voor SQL Server – krachtige IDE voor beheer, administratie, ontwikkeling, gegevensrapportage en analyse van SQL Server.