Översikt
Den här artikeln talar om hur man använder ögonblicksbilder av databasscheman för att underhålla olika versioner av en databas som ska distribueras till olika miljöer.
Databasschema ögonblicksbilder är punkt-i-tid kopior av det aktuella tillståndet i databasen som normalt används för att stämma överens med skillnaderna när man distribuerar ändringar från en miljö till en annan miljö.
Den här artikeln kommer att fokusera på ett särskilt scenario där ögonblicksbilder av databasscheman är mer än bara punkt-i-tid kopior av databasen istället för att de används för att skapa nya versioner av specifika miljöer.
Vad är Databas Schema Snapshot
En ögonblicksbild av ett databasschema är helt enkelt en sparad tidpunktkopia av en databas.
Med andra ord är en ögonblicksbild av ett databasschema en exakt kopia av databasens struktur som inte inkluderar data i sin ursprungliga form.
Databasschema hänvisar till alla databasobjekt inklusive tabeller, vyer och lagrade procedurer. Vi skapar en ögonblicksbild av databasschemat för att frysa objektdefinitionerna för senare användning.
Varför behövs en ögonblicksbild av databasschema
Ögonblicksbilder av databasschema kan användas för följande ändamål:
- Kopiera ett befintligt tillstånd för en databas för framtida referens eller framtida användning.
- Versionering av en databas genom flera ögonblicksbilder av databasscheman.
- Skapa en tidpunktkopia av databasstrukturen för snabb återställning.
- Skapa en kopia av måldatabasschemat innan nya ändringar implementeras.
- Skapa en senaste stabil kopia av databasschemat innan du fortsätter med fler ändringar.
- Skapa och dela databasändringar till en extern gruppmedlem som inte direkt kan komma åt databasmiljön.
- Önblicksbild av databasschema kan också användas för att jämföra skillnaderna mellan nuvarande arbete och det arbete som utförts tidigare.
- Önblicksbilder av databasschema kan också användas för frånkopplad publicering.
Krav på att behålla flera databasversioner
Om ditt databasutvecklingsteam har fått ett särskilt krav på att behålla och underhålla flera databasversioner som ska distribueras i flera miljöer då är en av lösningarna att använda ögonblicksbilder av databasschema för att uppfylla kravet.
Skapa flera databasversioner
Som diskuterats tidigare används ögonblicksbilder av databasscheman inte bara som punkt-i-tid kopior av databasstrukturen utan kan också användas för att skapa och distribuera flera databasversioner samtidigt.
Exempel på databasinställning (teknisk utbildning)
Öppna dbForge Studio för SQL Server eller SSMS (SQL Server Management Studio) för att ställa in en exempeldatabas som heter TechnicalTraining som innehåller information om tekniska kurser, studenter och utbildare med de få tabellerna som följer:
-- (1) Skapar TechnicalTraining exempeldatabas CREATE DATABASE TechnicalTraining;GOUSE TechnicalTraining-- (2) Skapar studenttabellCREATE 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) Skapar tränartabellCREATE TABLE Trainer ( TrainerId INT IDENTITY ,Name VARCHAR(50) NOT NULL ,Qualification VARCHAR 0,0LL)NotchAR(50,0ll)Nr. CONSTRAINT PK_Trainer_TrainerId PRIMARY KEY CLUSTERED (TrainerId))GO-- (4) Skapar kurstabellCREATE TABLE Kurs ( CourseId INT IDENTITY ,Namn VARCHAR(50) NOT NULL ,TrainerId INT NULL ,Detalj VARCHAR(200,CONSTRAINTCourse(200) CLUSTRAINTCourse(200) CLUSTRAINTCourse(200) CourseId)) PÅ [PRIMARY]GOALTER TABLE CourseADD CONSTRAINT FK_Course_TrainerId FOREIGN KEY (TrainerId) REFERENSER dbo.Trainer (TrainerId)GO-- (5) Skapa StudentCourse-tabell CREATE TABLE [dbo].[StudentCourse] ([StudentCourse] ( rseId] INT IDENTITY(1,1) NOT NULL, [StudentId] INT NULL, [CourseId] INT NULL, [PercentScore] DECIMAL (5, 2) NULL, BEGRÄNSNING [PK_StudentCourse_StudentCourseId] KEY CUSTERI PRIMARY (KURS] PRIMARY [FK_StudentCourse_Student_StudentId] FOREIGN KEY ([StudentId]) REFERENSER [dbo].[Student] ([StudentId]), BEGRÄNSNING [FK_StudentCourse_Course_CourseId] UTLÄNDSKURSNYCKEL (][CourdId](kurs). GO-- (6) Skapa vy för att se elevens framstegsrapport SKAPA VISA StudentProgress asSELECT s.Name AS StudentName,c.Name as CourseName,t.Name AS Trainer,sc.PercentScore FRÅN StudentCourse sc INNER JOIN Student son s.StudentId=sc. StudentIdINNER JOIN Kurs con c.CourseId=sc.CourseIdINNER JOIN Trainer ton t.TrainerId=c.TrainerIdGO
Observera att TechnicalTraining-databasen är uppbyggd på ett sådant sätt att många studenter kan ta många kurser medan varje kurs endast kan ha en tränare som visas nedan:
Observera att jag använder dbForge Studio för SQL Server så utdatautseendet kan skilja sig om du kör samma kod i SSMS (SQL Server Management Studio). Det finns dock ingen skillnad mellan skript och deras resultat.
Fyll i databasen med följande skript:
ANVÄND TechnicalTraining-- (1) Fyller tränartabellen SET IDENTITY_INSERT [dbo].[Trainer] ONINSERT I [dbo].[Trainer] ([TrainerId], [Namn], [Kvalifikation], [Noterar]) VÄRDEN (1) , N'George', N'MSc Computer Science', NULL)INSERT INTO [dbo].[Trainer] ([TrainerId], [Namn], [Kvalifikation], [Noter]) VÄRDEN (2, N'Akeel', N'MSc Database Management', NULL)INSERT INTO [dbo].[Trainer] ([TrainerId], [Namn], [Kvalifikation], [Noter]) VÄRDEN (3, N'Sarah', N'MSc Data Science' , NULL)INSERT INTO [dbo].[Trainer] ([TrainerId], [Name], [Qualification], [Notes]) VÄRDEN (4, N'Ben', N'BSc Computer Science', NULL)SET IDENTITY_INSERT [ dbo].[Tränare] AV-- (2) Fylla kurstabellSET IDENTITY_INSERT [dbo].[Kurs] ONINSERT I [dbo].[Kurs] ([CourseId], [Name], [TrainerId], [Detalj]) VÄRDEN (1, N'Databasutveckling', 1, NULL)INSERT INTO [dbo].[Course] ([CourseId], [Name], [TrainerId], [Detalj]) VÄRDEN (2, N'Data Analysis ', 2 , NULL)INSERT INTO [dbo].[Course] ([CourseId], [Name], [TrainerId], [Det ail]) VÄRDEN (3, N'Data Reports Development', 2, NULL)INSERT INTO [dbo].[Course] ([CourseId], [Name], [TrainerId], [Detalj]) VÄRDEN (4, N' Basics of Business Intelligence', 3, NULL)INSERT INTO [dbo].[Course] ([CourseId], [Name], [TrainerId], [Detalj]) VÄRDEN (5, N'Big Data Fundamentals', 4, NULL )SET IDENTITY_INSERT [dbo].[Kurs] AV-- (3) Fylla studenttabellSET IDENTITY_INSERT [dbo].[Student] ONINSERT I [dbo].[Student] ([StudentId], [Namn], [RegistrationDate], [ Notes]) VÄRDEN (1, N'Asif', N'2017-01-01 00:00:00', NULL)INSERT INTO [dbo].[Student] ([StudentId], [Name], [RegistrationDate], [Anteckningar]) VÄRDEN (2, N'Mike', N'2017-02-01 00:00:00', NULL)INSERT INTO [dbo].[Student] ([StudentId], [Namn], [RegistrationDate] , [Noter]) VÄRDEN (3, N'Naveed', N'2017-03-10 00:00:00', NULL)INSERT INTO [dbo].[Student] ([StudentId], [Name], [RegistrationDate] ], [Noter]) VÄRDEN (4, N'Sam', N'2017-04-15 00:00:00', NULL)INSERT INTO [dbo].[Student] ([StudentId], [Namn], [ Registreringsdatum], [Anteckningar]) VÄRDEN (5, N'Mona', N'2017-07-10 00:00:00', NULL)SET IDENTITY_INSERT [dbo].[Student] OFF-- (4) Fylla StudentCourse tableSET IDENTITY_INSERT [dbo].[StudentCourse] ] ONINSERT I [dbo].[StudentCourse] ([StudentCourseId], [StudentId], [CourseId], [PercentScore]) VÄRDEN (1, 1, 1, CAST(72.00 SOM Decimal(5, 2)))INSERT INTO [ dbo].[StudentCourse] ([StudentCourseId], [StudentId], [CourseId], [PercentScore]) VÄRDEN (2, 1, 2, CAST(75.00 AS Decimal(5, 2)))INSERT INTO [dbo].[ StudentCourse] ([StudentCourseId], [StudentId], [CourseId], [PercentScore]) VÄRDEN (3, 2, 2, CAST(80.00 AS Decimal(5, 2)))INSERT INTO [dbo].[StudentCourse] ([ StudentCourseId], [StudentId], [CourseId], [PercentScore]) VÄRDEN (4, 2, 3, CAST(70.00 AS Decimal(5, 2)))INSERT INTO [dbo].[StudentCourse] ([StudentCourseId], [ StudentId], [CourseId], [PercentScore]) VÄRDEN (5, 3, 5, CAST(80,00 AS Decimal(5, 2)))SET IDENTITY_INSERT [dbo].[StudentCourse] AV
Databaskontroll
Högerklicka på StudentProgress under Visningar och klicka på Hämta data eller skriv in följande T-SQL-kod:
-- Visa elevernas framsteg SELECT s.Name,c.Name as CourseName,t.Name,sc.PercentScore FROM StudentCourse scINNER JOIN Student son s.StudentId=sc.StudentIdINNER JOIN Kurs con c.CourseId=sc.CourseIdINNER JOIN Trainer ton t.TrainerId=c.TrainerIdorder av s.Name
Utgången är som följer:
Konfigurera version 1 genom att skapa ögonblicksbild av databasschema
Det är dags att spara tidpunktskopian av databasschemat eftersom den nuvarande databasstrukturen uppfyller kraven för version 1 av databasen.
Skapa ögonblicksbild schema version 1
Högerklicka på Teknisk utbildning databas i Databasutforskaren av dbForge Studio för SQL Server (eller så kan du använda valfritt liknande verktyg som kan skapa ögonblicksbild av databasschema), klicka på Uppgifter och klicka sedan på Skapa skriptmapp eller ögonblicksbild... som visas nedan:
Skapa en ögonblicksbild på önskad plats och döp den till TechnicalTraining-Version-001-StudentCourseTrainer.snap enligt följande:
Kontrollera Schema Snapshot Version 1
Kontrollera mappen för att se den nyligen skapade ögonblicksbilden av databasschemat av version 1:
Lägg till ny tabell CourseType
Låt oss nu lägga till en annan tabell som heter CourseType till den befintliga databasen med hjälp av följande skript:
-- Lägger till CourseType-tabell CREATE TABLE CourseType ( CourseTypeId INT IDENTITY ,Name VARCHAR(50) NOT NULL ,Detalj VARCHAR(250) NULL ,CONSTRAINT PK_CourseType_CourseId PRIMARY KEY CLUSTERED) Infoga data i tabellen enligt följande:SET IDENTITY_INSERT [dbo].[CourseType] ONINSERT INTO [dbo].[CourseType] ([CourseTypeId], [Name], [Detalj]) VÄRDEN (1, N'Basic', NULL)INSERT INTO [dbo] .[CourseType] ([CourseTypeId], [Name], [Detalj]) VÄRDEN (2, N'Intermediate', NULL)INSERT INTO [dbo].[CourseType] ([CourseTypeId], [Name], [Detalj]) VÄRDEN (3, N'Advanced', NULL)SET IDENTITY_INSERT [dbo].[CourseType] AVÄndra kurstabell för att lägga till kolumn CourseType
Uppdatera kurstabellen för att lägga till den främmande nyckeln CourseType:
-- Släpp främmande nyckel-begränsningALTER TABLE StudentCourseDrop Constraint [FK_StudentCourse_Course_CourseId]-- Släpp kurstabellDROP TABLE Course-- Skapa kurstabell med ny kolumn CourseTypeIdCREATE TABLE [dbo].[Course] ( [CourseId] (1, 1 ENTITY) 1 NOT NULL, [CourseTypeId] INT, [Name] VARCHAR (50) NOT NULL, [TrainerId] INT NULL, [Detalj] VARCHAR (200) NULL, CONSTRAINT [PK_Course_CourseId] PRIMARY KEY CLUSTERED ([ASCurseId] [ASCurseId] ] FOREIGN KEY ([TrainerId]) REFERENCER [dbo].[Trainer] ([TrainerId]), CONSTRAINT [FK_Course_CourseTypeId] FOREIGN KEY ([CourseTypeId]) REFERENSER [CourseType]([CourseTypeId]););Lägg till data i den nyligen ändrade kurstabellen enligt följande:
-- Lägg till data till kurstabellen SET IDENTITY_INSERT [dbo].[Course] ONINSERT INTO [dbo].[Course] ([CourseId], [CourseTypeId], [Name], [TrainerId], [Detalj]) VÄRDEN (1, 1, N'Databasutveckling', 1, NULL)INSERT INTO [dbo].[Course] ([CourseId], [CourseTypeId], [Name], [TrainerId], [Detalj]) VÄRDEN (2, 3) , N'Data Analysis ', 2, NULL)INSERT INTO [dbo].[Course] ([CourseId], [CourseTypeId], [Name], [TrainerId], [Detalj]) VÄRDEN (3, 2, N'Data Reports Development', 2, NULL)INSERT INTO [dbo].[Course] ([CourseId], [CourseTypeId], [Name], [TrainerId], [Detalj]) VÄRDEN (4, 1, N'Basics of Business Intelligence) ', 3, NULL)INSERT INTO [dbo].[Course] ([CourseId], [CourseTypeId], [Name], [TrainerId], [Detalj]) VÄRDEN (5, 1, N'Big Data Fundamentals', 4 , NULL)SET IDENTITY_INSERT [dbo].[Course] OFF-- Lägg till Foreign key constraint back to StudentCourse tableALTER TABLE StudentCourse ADD CONSTRAINT [FK_StudentCourse_Course_CourseId] FOREIGN KEY ([CourseId]) ([CourseId]) REFERENCER].[)Coursebod].[)Lägg till New View CoursesWithTypes
Lägg nu till en ny vy för att se alla kurser med deras typer enligt följande:
-- Skapa en vy för att se kurser med deras typerCreate 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.Course;GODatabaskontroll
Visa databasstrukturen för att se de senaste ändringarna:
Kör vyn CoursesWithTypes:
Konfigurera version 2 genom att skapa ögonblicksbild av databasschema
Skapa ytterligare en punkt-i-tid kopia av databasstrukturen för att markera version 2 av databasen.
Skapa en ögonblicksbild av databasschema och kalla den TechnicalTraining-Version-002-StudentCourseTrainerCourseType.snap enligt följande:
Distribuera flera databasversioner
Efter framgångsrikt skapande av ögonblicksbilder av databasschema för version 1 och version 2, kan vi nu distribuera vilken version som helst till vilken miljö som helst enligt kraven.
Skapa utvecklingsdatabas från Schema Snapshot version 1
Klicka på Jämförelse-> Ny schemajämförelse från menyraden i dbForge Studio för SQL Server:
Ställ sedan in källtyp som Snapshot och hitta ögonblicksbilden för databasschemat version 1 TechnicalTraining-Version-001-StudentCourseTrainer.snap vi skapade tidigare och klicka på plussymbolen för att skapa måldatabas i farten:
Skriv in databasnamnet TechnicalTrainingV1_DEV och klicka på OK:
Klicka på Nästa :
Klicka på Nästa igen för att välja standardalternativ och klicka sedan på Nästa för att fortsätta med standardalternativ för Schema Mapping och klicka sedan på Jämför :
Synkronisera källa och mål genom att klicka på den gröna ikonen i mitten som visas nedan:
Efter ytterligare några steg klickar du påSynkronisera :
Kör sedan skriptet för att slutligen skapa TechnicalTrainingV1_DEV databas från databasschemats ögonblicksbild som representerar version 1 av databasen:
Se den nyskapade databasen som är en kopia av TechnicalTraining-databas version 1:
Skapa utvecklingsdatabas från Schema Snapshot version 2
Skapa nu version 2 av databasen genom att följa stegen som nämns för att skapa version 1 genom att helt enkelt peka på översiktsbild av databasschema för version 2 TechnicalTraining-Version-002-StudentCourseTrainerCourseType denna gång:
Jämföra version 1 och version 2
Låt oss snabbt jämföra båda databaserna för att se skillnaderna.
Grattis! Du har framgångsrikt skapat flera versioner av databasen genom ögonblicksbilder av databasschema.
Saker att göra
Du kan nu enkelt använda ögonblicksbilder av databasschema för att skapa och distribuera flera versioner av databasen.
- Skapa flera versioner av SQLDevBlogTDD som nämndes i min tidigare artikel.
- Skapa flera versioner av databasen med version 1 möte Totalt antal artiklar per författarrapport krav och version 2 möte Totalt antal artiklar per årsrapport efter min tidigare artikel.
- Gå igenom min tidigare artikel Art of Isolating Dependencies and Data in Database Unit Testing och se om du kan skapa två olika versioner av databasen genom databasschema-ögonblicksbilder, den ena med tSQLt-enhetstester och den andra utan tSQLt-enhetstester.
Användbart verktyg:
dbForge Studio för SQL Server – kraftfull IDE för SQL Server-hantering, administration, utveckling, datarapportering och analys.