Přehled
Tento článek pojednává o použití snímků schématu databáze k údržbě různých verzí databáze, které lze nasadit do různých prostředí.
Snímky schématu databáze jsou kopie aktuálního stavu databáze v určitém okamžiku, které se běžně používají k vyrovnání rozdílů při zavádění změn z jednoho prostředí do jiného.
Tento článek se zaměří na konkrétní scénář, kde jsou snímky databázového schématu více než jen kopie databáze v určitém okamžiku, spíše se používají k vytváření nových verzí konkrétních prostředí.
Co je snímek schématu databáze
Snímek schématu databáze je jednoduše uložená kopie databáze v určitém okamžiku.
Jinými slovy, snímek databázového schématu je přesnou kopií struktury databáze, která neobsahuje data v původní podobě.
Schéma databáze se týká všech databázových objektů včetně tabulek, pohledů a uložených procedur. Vytvoříme snímek schématu databáze, abychom zmrazili definice objektů pro pozdější použití.
Proč je nutný snímek schématu databáze
Snímky schématu databáze lze použít pro následující účely:
- Kopírování stávajícího stavu databáze pro budoucí použití nebo použití.
- Verze databáze prostřednictvím více snímků schématu databáze.
- Vytvoření časové kopie struktury databáze pro rychlé obnovení.
- Vytvoření kopie schématu cílové databáze před nasazením nových změn.
- Vytvoření nejnovější stabilní kopie schématu databáze, než budete pokračovat s dalšími změnami.
- Vytváření a sdílení změn databáze s externím členem týmu, který nemá přímý přístup k prostředí databáze.
- Snímek schématu databáze lze také použít k porovnání rozdílů mezi současnou prací a prací vykonanou v minulosti.
- Snímky schématu databáze lze také použít pro odpojené publikování.
Požadavek na zachování více verzí databáze
Pokud váš vývojový tým databází obdržel speciální požadavek udržovat a udržovat více verzí databáze, které lze nasadit ve více prostředích pak je jedním z řešení použití snímků schématu databáze ke splnění požadavku.
Vytvoření více verzí databáze
Jak již bylo zmíněno dříve, snímky databázového schématu se nepoužívají pouze jako kopie struktury databáze v určitém okamžiku, ale lze je také použít k vytvoření a nasazení více verzí databáze současně.
Ukázkové nastavení databáze (technické školení)
Otevřete dbForge Studio pro SQL Server nebo SSMS (SQL Server Management Studio) a nastavte ukázkovou databázi nazvanou TechnicalTraining který obsahuje informace o technických kurzech, studentech a školitelích s několika tabulkami takto:
-- (1) Vytvoření ukázkové databáze TechnicalTraining CREATE DATABASE TechnicalTraining;GOUSE TechnicalTraining-- (2) Vytvoření tabulky studentůCREATE TABLE Student (Id studenta INT IDENTITY ,Jméno VARCHAR(50) NOT NULL ,Datum registrace DATUMTIME2 NULL(200 VARCH) NULL ,CONSTRAINT PK_Student_StudentId PRIMÁRNÍ KLÍČ SE SLUSTROVANÝM (StudentId))GO-- (3) Vytvoření školící tabulkyCREATE TABLE Trenér ( TrainerId INT IDENTITY ,Jméno VARCHAR(50) NOT NULL ,Kvalifikace VARCHAR00 ,Č. NULL VARCHAR(50) Č. C CONSTRAINT PK_Trainer_TrainerId PRIMÁRNÍ KLÍČ SE SKUPINY (TrainerId))GO-- (4) Vytváření tabulky kurzůCREATE TABLE Kurz (Id kurzu INT IDENTITY ,Název VARCHAR(50) NOT NULL ,CrainerId INT NULL,Podrobnosti VARCHARSE CourseId)) NA [PRIMÁRNÍ] TABULCE BRANKÁŘŮ CourseADD OMEZENÍ FK_Course_TrainerId CIZÍ KLÍČ (TrainerId) REFERENCE dbo.Trainer (TrainerId)GO-- (5) Vytváření tabulky studentských kurzů [CREATE TABLE [dbo] (StudentCourse) rseId] INT IDENTITY(1,1) NOT NULL, [StudentId] INT NULL, [CourseId] INT NULL, [PercentScore] DECIMAL (5, 2) NULL, CONSTRAINT [PK_StudentCourse_StudentCourseId] AKTIVNÍ KLÍČ [tudentCourseId] PRIMARY [FK_StudentCourse_Student_StudentId] CIZÍ KLÍČ ([StudentId]) REFERENCE [dbo].[Student] ([StudentId]), OMEZENÍ [FK_StudentCourse_Course_CourseId] CIZÍ KLÍČ ([FERENCEId]][FERENCEId [CourseD]) REFERENCE GO-- (6) Vytvořte zobrazení pro zobrazení zprávy o pokroku studentaVYTVOŘIT ZOBRAZENÍ StudentProgress asSELECT s.Jmeno AS Jméno studenta,c.Jméno jako Jméno kurzu,t.Jméno AS Trenér,sc.PercentScore FROM StudentCourse sc VNITŘNÍ PŘIPOJENÍ Student syn s.StudentId=sc. StudentIdINNER JOIN Course con c.CourseId=sc.CourseIdINNER JOIN Trainer ton t.TrainerId=c.TrainerIdGO
Upozorňujeme, že databáze TechnicalTraining je strukturována takovým způsobem, že mnoho studentů může absolvovat mnoho kurzů, přičemž každý kurz může mít pouze jednoho školitele, jak je uvedeno níže:
Vezměte prosím na vědomí, že používám dbForge Studio pro SQL Server, takže vzhled výstupu se může lišit, pokud stejný kód spustíte v SSMS (SQL Server Management Studio). Mezi skripty a jejich výsledky však není žádný rozdíl.
Naplňte databázi pomocí následujícího skriptu:
USE TechnicalTraining-- (1) Vyplnění tabulky TrainSET IDENTITY_INSERT [dbo].[Trainer] ONINSERT INTO [dbo].[Trainer] ([TrainerId], [Jméno], [Kvalifikace], [Poznámky]) HODNOTY (1 , N'George', N'MSc Computer Science', NULL)INSERT INTO [dbo].[Trainer] ([TrainerId], [Jméno], [Kvalifikace], [Poznámky]) VALUES (2, N'Akeel', N'MSc Database Management', NULL)INSERT INTO [dbo].[Trainer] ([TrainerId], [Jméno], [Kvalifikace], [Poznámky]) VALUES (3, N'Sarah', N'MSc Data Science' [ dbo][Tréner] VYP-- (2) Vyplňování tabulky kurzuSET IDENTITY_INSERT [dbo].[Kurz] ONINSERT DO [dbo].[Kurz] ([Id kurzu], [Jméno], [Id trenéra], [Detail]) HODNOTY (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], [Det ail]) 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].[Kurz] VYPNUTO-- (3) Vyplňování studentské tabulkySET IDENTITY_INSERT [dbo].[Student] ONINSERT DO [dbo].[Student] ([StudentId], [Jméno], [Datum registrace], [ Poznámky]) 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 ], [Poznámky]) VALUES (4, N'Sam', N'2017-04-15 00:00:00', NULL)INSERT INTO [dbo].[Student] ([StudentId], [Jméno], [ Datum registrace], [Poznámky]) HODNOTY (5, N'Mona', N'2017-07-10 00:00:00', NULL)SET IDENTITY_INSERT [dbo].[Student] OFF-- (4) Vyplňování tabulky StudentCourseSET IDENTITY_INSERT [dbo].[StudentCourse ] ONINSERT 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
Kontrola databáze
Klikněte pravým tlačítkem na StudentProgress v části Zobrazení a klikněte na Obnovit data nebo případně zadejte následující kód T-SQL:
-- Zobrazit postup studentůSELECT s.Name,c.Name jako CourseName,t.Name,sc.PercentScore FROM StudentCourse scINNER JOIN Student son s.StudentId=sc.StudentIdINNER JOIN Course con c.CourseId=sc.CourseIdINNER JOIN Trainer ton t.TrainerId=c.TrainerIdorder by s.Name
Výstup je následující:
Nastavení verze 1 vytvořením snímku schématu databáze
Toto je čas na uložení kopie databázového schématu k určitému okamžiku, protože aktuální struktura databáze splňuje požadavky pro verzi 1 databáze.
Vytvořit snímek schématu verze 1
Klikněte pravým tlačítkem na Technické školení databáze v Průzkumníku databáze z dbForge Studio pro SQL Server (nebo můžete použít jakýkoli podobný nástroj podle vašeho výběru, který je schopen vytvořit snímek schématu databáze), klikněte na Úlohy a poté klikněte na Vytvořit složku skriptů nebo snímek… jak je uvedeno níže:
Vytvořte snímek na požadovaném místě a pojmenujte jej TechnicalTraining-Version-001-StudentCourseTrainer.snap takto:
Zkontrolujte snímek schématu verze 1
Zkontrolujte složku a zobrazte nedávno vytvořený snímek schématu databáze verze 1:
Přidat nový typ kurzu tabulky
Nyní přidáme další tabulku s názvem CourseType do existující databáze pomocí následujícího skriptu:
-- Přidání tabulky CourseType CREATE TABLE CourseType ( CourseTypeId INT IDENTITY ,Název VARCHAR(50) NOT NULL ,Detail VARCHAR(250) NULL ,CONSTRAINT PK_CourseType_CourseId PRIMARY KEY CLUSTERED (PRIMÁRNÍ KEY CLUSTERED);
Vložte data do tabulky následovně:
SET IDENTITY_INSERT [dbo].[CourseType] ONINSERT DO [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] VYPNUTO
Upravte tabulku kurzů a přidejte sloupec Typ kurzu
Aktualizujte tabulku Course a přidejte cizí klíč CourseType:
-- Zrušit omezení cizího klíčeALTER TABLE Omezení studentCourseDrop [FK_StudentCourse_Course_CourseId]-- Zrušit tabulku kurzuDROP TABLE Kurz-- Vytvořit tabulku kurzu s novým sloupcem CourseTypeIdCREATE TABLE [dbo].[Kurz] ( [CourseId, 1 ID kurzu] NOT NULL, [CourseTypeId] INT, [Name] VARCHAR (50) NOT NULL, [TrainerId] INT NULL, [Detail] VARCHAR (200) NULL, CONSTRAINT [PK_Course_CourseId] PRIMARY KEY CLUSTERED ([CourseFrainer_d] AINTSC_CourseFIKIerd) ] CIZÍ KLÍČ ([TrainerId]) REFERENCE [dbo].[Trainer] ([TrainerId]), OMEZENÍ [FK_Course_CourseTypeId] CIZÍ KLÍČ ([CourseTypeId]) REFERENCE [CourseType]([CourseTypeId]););Přidejte data do nově upravené tabulky kurzů následovně:
-- Přidejte data do tabulky kurzuSET IDENTITY_INSERT [dbo].[Kurz] ONINSERT DO [dbo].[Kurz] ([CourseId], [CourseTypeId], [Name], [TrainerId], [Detail]) HODNOTY (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].[Kurz] VYPNUTO-- Přidat omezení cizího klíče zpět do tabulky StudentCourseALTER TABLE StudentCourse PŘIDAT OMEZENÍ [FK_StudentCourse_Course_CourseId] CIZÍ KLÍČ ([CourseId]]) REFERENCE [Coursedbo] REFERENCE [Coursedbo]Přidat nové zobrazení CoursesWithTypes
Nyní přidejte nové zobrazení, abyste viděli všechny kurzy s jejich typy následovně:
-- Vytvoření zobrazení pro zobrazení kurzů s jejich typyCreate VIEW CoursesWithTypes ASSELECT c.CourseId,c.Name jako CousreName,ct.Name jako CourseType FROM dbo.Course c vnitřní spojení dbo.CourseType cton c.CourseTypeId=ct.Course;GOKontrola databáze
Prohlédněte si strukturu databáze, abyste viděli nejnovější změny:
Spusťte zobrazení CoursesWithTypes:
Nastavení verze 2 vytvořením snímku schématu databáze
Vytvořte další kopii struktury databáze k určitému časovému okamžiku, abyste označili verzi 2 databáze.
Vytvořte snímek schématu databáze a nazvěte jej TechnicalTraining-Version-002-StudentCourseTrainerCourseType.snap takto:
Nasazení více verzí databáze
Po úspěšném vytvoření snímků schématu databáze pro verzi 1 a verzi 2 můžeme nyní nasadit jakoukoli verzi do libovolného prostředí podle požadavků.
Vytvoření Dev databáze ze schématu Snapshot verze 1
Klikněte na Porovnání-> Porovnání nového schématu z panelu nabídek v dbForge Studio pro SQL Server:
Dále nastavte typ zdroje jako Snímek a vyhledejte snímek schématu databáze verze 1 TechnicalTraining-Version-001-StudentCourseTrainer.snap vytvořili jsme dříve a kliknutím na symbol plus vytvořte cílovou databázi za běhu:
Zadejte název databáze TechnicalTrainingV1_DEV a klikněte na OK:
Klikněte na Další :
Klikněte na Další znovu a vyberte výchozí Možnosti a poté klikněte na Další pokračujte s výchozími možnostmi mapování schématu a poté klikněte na Porovnat :
Synchronizujte zdroj a cíl kliknutím na zelenou ikonu uprostřed, jak je znázorněno níže:
Po několika dalších krocích klikněte na Synchronizovat :
Dále spusťte skript, abyste nakonec vytvořili TechnicalTrainingV1_DEV databáze ze snímku schématu databáze představující verzi 1 databáze:
Prohlédněte si nově vytvořenou databázi, která je kopií databáze TechnicalTraining verze 1:
Vytvoření Dev databáze ze schématu Snapshot verze 2
Nyní vytvořte verzi 2 databáze podle kroků uvedených pro vytvoření verze 1 jednoduše tak, že ukážete na Snímek schématu databáze verze 2 TechnicalTraining-Version-002-StudentCourseTrainerCourseType tentokrát:
Porovnání verze 1 a verze 2
Pojďme rychle porovnat obě databáze, abychom viděli rozdíly.
Gratulujeme! Úspěšně jste vytvořili několik verzí databáze prostřednictvím snímků schématu databáze.
Co dělat
Nyní můžete snadno používat snímky schématu databáze k vytvoření a nasazení více verzí databáze.
- Vytvořte více verzí SQLDevBlogTDD uvedených v mém předchozím článku.
- Vytvořte více verzí databáze se schůzkou verze 1 Celkový počet článků na zprávu autora požadavek a splnění verze 2 Celkový počet článků za roční zprávu v návaznosti na můj předchozí článek.
- Projděte si můj předchozí článek Umění izolace závislostí a dat v testování databázových jednotek a zjistěte, zda můžete vytvořit dvě různé verze databáze prostřednictvím snímků schématu databáze, jednu s jednotkovými testy tSQLt a druhou bez jednotkových testů tSQLt.
Užitečný nástroj:
dbForge Studio pro SQL Server – výkonné IDE pro správu, administraci, vývoj, sestavování dat a analýzu SQL Serveru.