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

Oprettelse og implementering af flere versioner af databasen gennem skemasnapshots

Oversigt

Denne artikel taler om brug af databaseskema-øjebliksbilleder til at vedligeholde forskellige versioner af en database, der skal implementeres i forskellige miljøer.

Databaseskema-øjebliksbilleder er punkt-i-tids-kopier af databasens aktuelle tilstand, som normalt bruges til at afstemme forskellene ved implementering af ændringer fra et miljø til et andet miljø.

Denne artikel vil være fokuseret på et bestemt scenarie, hvor øjebliksbilleder af databaseskemaer er mere end blot tidspunkt-kopier af databasen, snarere bruges de til at skabe nye versioner af specifikke miljøer.

Hvad er Database Schema Snapshot

Et øjebliksbillede af et databaseskema er simpelthen en gemt kopi af en database.

Med andre ord er et øjebliksbillede af et databaseskema en nøjagtig kopi af strukturen i databasen, som ikke inkluderer data i dens oprindelige form.

Databaseskema refererer til alle databaseobjekter inklusive tabeller, visninger og lagrede procedurer. Vi opretter et øjebliksbillede af databaseskema for at fryse objektdefinitionerne til senere brug.

Hvorfor er der behov for et øjebliksbillede af databaseskema

Snapshots af databaseskemaer kan bruges til følgende formål:

  1. Kopiering af en eksisterende tilstand af en database til fremtidig reference eller fremtidig brug.
  2. Version af en database gennem flere databaseskema-øjebliksbilleder.
  3. Oprettelse af en tidspunktkopi af databasestrukturen til hurtig gendannelse.
  4. Oprettelse af en kopi af måldatabaseskemaet før implementering af nye ændringer.
  5. Oprettelse af en seneste stabil kopi af databaseskemaet, før du fortsætter med flere ændringer.
  6. Oprettelse og deling af databaseændringer til et eksternt teammedlem, som ikke kan få direkte adgang til databasemiljøet.
  7. Snapshot af databaseskema kan også bruges til at sammenligne forskellene mellem det nuværende arbejde og det arbejde, der er udført i fortiden.
  8. Snapshots af databaseskemaer kan også bruges til afbrudt udgivelse.

Krav om at beholde flere databaseversioner

Hvis dit databaseudviklingsteam har modtaget et særligt krav om at beholde og vedligeholde flere databaseversioner, der skal implementeres på tværs af flere miljøer så er en af ​​løsningerne at bruge databaseskema-øjebliksbilleder for at opfylde kravet.

Oprettelse af flere databaseversioner

Som diskuteret tidligere, bruges databaseskema-øjebliksbilleder ikke kun som punkt-i-tidskopier af databasestrukturen, men kan også bruges til at oprette og implementere flere databaseversioner på samme tid.

Eksempel på databaseopsætning (teknisk træning)

Åbn dbForge Studio til SQL Server eller SSMS (SQL Server Management Studio) for at opsætte en eksempeldatabase kaldet TechnicalTraining som indeholder oplysninger om tekniske kurser, studerende og undervisere med de få tabeller som følger:

-- (1) Oprettelse af TechnicalTraining-eksempeldatabase OPRET DATABASE TechnicalTraining;GOUSE TechnicalTraining-- (2) Oprettelse af elevtabelCREATE TABLE Student ( StudentId INT IDENTITY ,Name VARCHAR(50) NOT NULL ,RegistrationDate DATETIME2 NULL ,Notes NULL ,CONSTRAINT PK_Student_StudentId PRIMARY KEY CLUSTERED (StudentId))GO-- (3) Oprettelse af trænertabelCREATE TABLE Træner ( TrainerId INT IDENTITY ,Name VARCHAR(50) NOT NULL ,Kvalifikation VARCHAR 0,0LL)Nr. CONSTRAINT PK_Trainer_TrainerId PRIMARY KEY CLUSTERED (TrainerId))GO-- (4) Oprettelse af kursustabelCREATE TABLE Kursus ( CourseId INT IDENTITY ,Name VARCHAR(50) NOT NULL ,TrainerId INT NULL ,Detalje VARCHAR(200) CUSTRAINT 200,CONS CourseId)) PÅ [PRIMARY]GOALTER TABLE CourseADD CONSTRAINT FK_Course_TrainerId UDENLANDSKE NØGLE (TrainerId) REFERENCER dbo.Trainer (TrainerId)GO-- (5) Oprettelse af StudentCourse-tabel CREATE TABLE [dbo].[StudentCourse] ([StudentCourse] ( rseId] INT IDENTITY(1,1) IKKE NULL, [StudentId] INT NULL, [CourseId] INT NULL, [PercentScore] DECIMAL (5, 2) NULL, BEGRÆNSNING [PK_StudentCourse_StudentCourseId] KEY-CourseId] PRIMARY PRIMARY (KURSE) [FK_StudentCourse_Student_StudentId] UDENLANDSKE NØGLE ([StudentId]) REFERENCER [dbo].[Student] ([StudentId]), BEGRÆNSNING [FK_StudentCourse_Course_CourseId] UDENLANDSKE NØGLE (][kursus.](kursus)(kursus). GO-- (6) Opret visning for at se elevfremskridtsrapport OPRET VIS StudentProgress asSELECT s.Name AS StudentName,c.Name as CourseName,t.Name AS Trainer,sc.PercentScore FRA StudentCourse sc INNER JOIN Student søn s.StudentId=sc. StudentIdINNER JOIN Kursus con c.CourseId=sc.CourseIdINNER JOIN Træner ton t.TrainerId=c.TrainerIdGO

Bemærk venligst, at TechnicalTraining-databasen er struktureret på en sådan måde, at mange studerende kan tage mange kurser, mens hvert kursus kun kan have én træner som vist nedenfor:

Bemærk venligst, at jeg bruger dbForge Studio til SQL Server, så output-looket kan variere, hvis du kører den samme kode i SSMS (SQL Server Management Studio). Der er dog ingen forskel mellem scripts og deres resultater.

Udfyld databasen ved hjælp af følgende script:

BRUG TechnicalTraining-- (1) Udfylder trænertabelSET IDENTITY_INSERT [dbo].[Trainer] ONINSERT INTO [dbo].[Træner] ([TrainerId], [Navn], [Kvalifikation], [Noter]) VÆRDIER (1) , N'George', N'MSc Computer Science', NULL)INSERT INTO [dbo].[Trainer] ([TrainerId], [Navn], [Kvalifikation], [Noter]) 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].[Træner] FRA-- (2) Udfylder kursustabelSET IDENTITY_INSERT [dbo].[Kursus] ONINSERT INTO [dbo].[Kursus] ([CourseId], [Name], [TrainerId], [Detalje]) VÆRDI (1, N'Database Development', 1, NULL)INSERT INTO [dbo].[Course] ([CourseId], [Name], [TrainerId], [Detalje]) VÆRDIER (2, N'Data Analysis ', 2 , NULL)INSERT INTO [dbo].[Course] ([CourseId], [Name], [TrainerId], [Det ail]) VALUES (3, N'Data Reports Development', 2, NULL)INSERT INTO [dbo].[Course] ([CourseId], [Name], [TrainerId], [Detalje]) 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].[Kursus] FRA-- (3) Udfylder elevtabelSET IDENTITY_INSERT [dbo].[Student] ONINSERT I [dbo].[Student] ([StudentId], [Navn], [Registreringsdato], [ Bemærkninger]) VÆRDIER (1, N'Asif', N'2017-01-01 00:00:00', NULL)INSERT INTO [dbo].[Student] ([StudentId], [Name], [RegistrationDate], [Noter]) VALUES (2, N'Mike', N'2017-02-01 00:00:00', NULL)INSERT INTO [dbo].[Student] ([StudentId], [Name], [RegistrationDate] , [Noter]) VALUES (3, N'Naveed', N'2017-03-10 00:00:00', NULL)INSERT INTO [dbo].[Student] ([StudentId], [Name], [RegistrationDate] ], [Noter]) VALUES (4, N'Sam', N'2017-04-15 00:00:00', NULL)INSERT INTO [dbo].[Student] ([StudentId], [Name], [ Registreringsdato], [Noter]) VALUES (5, N'Mona', N'2017-07-10 00:00:00', NULL)SET IDENTITY_INSERT [dbo].[Student] OFF-- (4) Udfylder StudentCourse-tabelSET IDENTITY_INSERT [dbo].[StudentCourse] ] ONINSERT INTO [dbo].[StudentCourse] ([StudentCourseId], [StudentId], [CourseId], [PercentScore]) VÆRDIER (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] FRA

Databasetjek

Højreklik på StudentProgress under Visninger mappe og klik på Hent data eller skriv alternativt følgende T-SQL-kode:

-- Se elevernes fremskridt VÆLG s.Name,c.Name as CourseName,t.Name,sc.PercentScore FRA StudentCourse scINNER JOIN Student søn s.StudentId=sc.StudentIdINNER JOIN Kursus con c.CourseId=sc.CourseIdINNER JOIN Træner ton t.TrainerId=c.TrainerIdorder af s.Name

Outputtet er som følger:

Opsætning af version 1 ved at oprette et øjebliksbillede af databaseskema

Dette er tidspunktet for at gemme punkt-i-tid kopien af ​​databaseskemaet, da den aktuelle databasestruktur opfylder kravene til version 1 af databasen.

Opret Skema Snapshot Version 1

Højreklik på Teknisk træning database i Database Explorer af dbForge Studio til SQL Server (eller du kan bruge et hvilket som helst lignende værktøj efter eget valg, som er i stand til at oprette et øjebliksbillede af databaseskema), skal du klikke på Opgaver og klik derefter på Create Scripts Folder or Snapshot... som vist nedenfor:

Opret et øjebliksbillede på din ønskede placering, og navngiv det TechnicalTraining-Version-001-StudentCourseTrainer.snap som følger:

Tjek Skema Snapshot Version 1

Tjek mappen for at se det nyligt oprettede databaseskema-øjebliksbillede af version 1:

Tilføj ny tabel CourseType

Lad os nu tilføje endnu en tabel kaldet CourseType til den eksisterende database ved hjælp af følgende script:

-- Tilføjelse af CourseType-tabel CREATE TABLE CourseType ( CourseTypeId INT IDENTITY ,Name VARCHAR(50) NOT NULL ,Detalje VARCHAR(250) NULL ,CONSTRAINT PK_CourseType_CourseId PRIMARY KEY CLUSTERED (preICourse); 

Indsæt data i tabellen som følger:

SET IDENTITY_INSERT [dbo].[CourseType] ONINSERT INTO [dbo].[CourseType] ([CourseTypeId], [Name], [Detalje]) VÆRDIER (1, N'Basic', NULL)INSERT INTO [dbo] .[CourseType] ([CourseTypeId], [Name], [Detail]) VALUES (2, N'Intermediate', NULL)INSERT INTO [dbo].[CourseType] ([CourseTypeId], [Name], [Detalje]) VALUES (3, N'Advanced', NULL)SET IDENTITY_INSERT [dbo].[CourseType] FRA

Rediger kursustabel for at tilføje CourseType-kolonne

Opdater Course-tabellen for at tilføje CourseType-fremmednøglen:

-- Slip fremmednøglekonstraintALTER TABLE StudentCourseDrop Constraint [FK_StudentCourse_Course_CourseId]-- Drop Course tableDROP TABLE Course-- Opret kursustabel med ny kolonne CourseTypeIdCREATE TABLE [dbo].[Course] ( [CourseId] (1, 1 ENTITY) 1 NOT NULL, [CourseTypeId] INT, [Name] VARCHAR (50) NOT NULL, [TrainerId] INT NULL, [Detaljer] VARCHAR (200) NULL, CONSTRAINT [PK_Course_CourseId] PRIMÆR NØGLE KLUSTERET ([ASCurseId] [ASCurseId] [ASCurseId] ] FOREIGN KEY ([TrainerId]) REFERENCER [dbo].[Trainer] ([TrainerId]), CONSTRAINT [FK_Course_CourseTypeId] UDENLANDSKE NØGLE ([CourseTypeId]) REFERENCER [CourseType]([CourseTypeId])); 

Tilføj data til den nyligt ændrede kursustabel som følger:

-- Tilføj data til kursustabellen SET IDENTITY_INSERT [dbo].[Kursus] ONINSERT I [dbo].[Course] ([CourseId], [CourseTypeId], [Name], [TrainerId], [Detalje]) VÆRDIER (1, 1, N'Database Development', 1, NULL)INSERT INTO [dbo].[Course] ([CourseId], [CourseTypeId], [Name], [TrainerId], [Detalje]) VÆRDIER (2, 3) , N'Data Analysis ', 2, NULL)INSERT INTO [dbo].[Course] ([CourseId], [CourseTypeId], [Name], [TrainerId], [Detalje]) VÆRDIER (3, 2, N'Data Reports Development', 2, NULL)INSERT INTO [dbo].[Course] ([CourseId], [CourseTypeId], [Name], [TrainerId], [Detail]) VÆRDIER (4, 1, N'Basics of Business Intelligence) 3 , NULL)SET IDENTITY_INSERT [dbo].[Kursus] FRA-- Tilføj fremmednøglebegrænsning tilbage til StudentCourse-tabellenALTER TABLE StudentCourse ADD CONSTRAINT [FK_StudentCourse_Course_CourseId] UDENLANDSKE NØGLE ([CourseId]) REFERENCER].[)Coursebod].[) 

Tilføj New View CoursesWithTypes

Tilføj nu en ny visning for at se alle kurserne med deres typer som følger:

-- Oprettelse af en visning for at se kurser med deres typerCreate VIEW CoursesWithTypes ASSELECT c.CourseId,c.Name as CousreName,ct.Name as CourseType FROM dbo.Course c indre join dbo.CourseType cton c.CourseTypeId=ct.Course;GO

Databasetjek

Se databasestrukturen for at se de seneste ændringer:

Kør visningen CoursesWithTypes:

Opsætning af version 2 ved at oprette et øjebliksbillede af databaseskema

Opret endnu en kopi af databasestrukturen på tidspunktet for at markere version 2 af databasen.

Opret et øjebliksbillede af databaseskema, og kald det TechnicalTraining-Version-002-StudentCourseTrainerCourseType.snap som følger:

Implementering af flere databaseversioner

Efter vellykket oprettelse af databaseskema-øjebliksbilleder for version 1 og version 2, kan vi nu implementere enhver version til ethvert miljø efter krav.

Oprettelse af Dev-database fra Schema Snapshot Version 1

Klik påSammenligning-> Ny skemasammenligning fra menulinjen i dbForge Studio til SQL Server:

Indstil derefter Kildetype som Snapshot og find øjebliksbilledet af databaseskemaet version 1 TechnicalTraining-Version-001-StudentCourseTrainer.snap vi oprettede tidligere og klik på plus-symbolet for at oprette en måldatabase i farten:

Indtast databasenavnet TechnicalTrainingV1_DEV og klik på OK:

Klik på Næste :

Klik på Næste igen for at vælge standard Indstillinger og klik derefter på Næste for at fortsætte med standardindstillinger for Schema Mapping, og klik derefter på Sammenlign :

Synkroniser kilde og mål ved at klikke på det grønne ikon i midten som vist nedenfor:

Efter et par flere trin skal du klikke påSynkroniser :

Udfør derefter scriptet for endelig at oprette TechnicalTrainingV1_DEV database fra databaseskemaets snapshot, der repræsenterer version 1 af databasen:

Se den nyoprettede database, som er en kopi af TechnicalTraining-databasen version 1:

Oprettelse af Dev-database fra Schema Snapshot Version 2

Opret nu Version 2 af databasen ved at følge de nævnte trin for at oprette Version 1 blot ved at pege på Version 2 Database Schema Snapshot TechnicalTraining-Version-002-StudentCourseTrainerCourseType denne gang:

Sammenligning af version 1 og version 2

Lad os hurtigt sammenligne begge databaser for at se forskellene.

Tillykke! Du har oprettet flere versioner af databasen gennem databaseskema-øjebliksbilleder.

Ting at gøre

Du kan nu nemt gøre brug af databaseskema-øjebliksbilleder til at oprette og implementere flere versioner af databasen.

  1. Opret flere versioner af SQLDevBlogTDD nævnt i min tidligere artikel.
  2. Opret flere versioner af databasen med version 1-møde Samlet antal artikler pr. forfatterrapport krav og version 2-møde Samlet antal artikler pr. årsrapport efter min tidligere artikel.
  3. Gennem min tidligere artikel Art of Isolating Dependencies and Data in Database Unit Testing og se, om du kan oprette to forskellige versioner af databasen gennem databaseskema-snapshots, den ene med tSQLt-enhedstest og den anden uden tSQLt-enhedstests.

Nyttigt værktøj:

dbForge Studio til SQL Server – kraftfuld IDE til SQL Server-administration, administration, udvikling, datarapportering og analyse.


  1. Eksklusiv! Slut dig til os med vores gæste Michal Bar, Access Program Manager

  2. Vælg rækkenummer i postgres

  3. Sådan opdaterer du eksisterende data med SQLite

  4. Sådan installeres MySQL på macOS