Дмитрий Андреев
Введение Проект БД и жизненный цикл БД Генерация тестовых данных Юнит-тестирование Управление изменениями Развертывание Заключение
Где находится «истинная» схема? Эксплуатационная база? Что насчет исправлений? Что будем делать с следующей версией? Как вести версии базы данных? Что делать с тестовыми данными? Как проверить логику базы данных? Какие средства использовать для сравнения схем? Как развертывать БД и как делать апгрейд?
4 Проблема Где «истинная» схема? Как вести версии? Как проводить тестирование? Как управлять изменениями? Решение Где угодно. Схема это исходный проект. Так же как и в привычных программных проектах. Генерация тестовых данных. Юнит тестирование баз данных. Рефакторинг, сравнение схем.
Эксплуатационная база – единственная верная схема соответствующая версии вашей эксплуатационной системы Возможны исправления для этой базы. Разработка будущей версии ведется безотносительно к эксплуатационной версии Патч для эксплуатационной версии это возникновение: Новой эксплуатационной версии базы Новой версии эксплуатационной системы Патч+«Старая версия БД»=релиз билд
Введение Проект БД и жизненный цикл БД Генерация тестовых данных Юнит-тестирование Управление изменениями Развертывание Заключение
Проект базы данных (Visual Studio Project) отражает эволюционирующую схему Проект содержит DDL скрипты (*.SQL файлы) Контроль версий ведется на уровне исходных текстов этих скриптов Ключ к успеху: Автоматическая генерация тестовых данных Юнит тестирование
SQL Server Database Database Project Template SQL Script Database Project Импорт схемы Создание нового проекта Реверс существующего скрипта
Database Project Edit Refactor Compare Data Gen Test Compare Build Deploy
CREATE TABLE dbo.Auction ( id INT NOT NULL, name VARCHAR(25) NOT NULL, start DATETIME NULL, len INT NULL ) CREATE TABLE dbo.Auction ( id INT NOT NULL, name VARCHAR(25) NOT NULL, start DATETIME NULL, len INT NULL ) class AuctionApplication ( int id; void MethodA(); ) class AuctionApplication ( int id; void MethodA(); )DatabaseDatabase class AuctionApplication ( int id; void MethodA(); void MethodB(); ) class AuctionApplication ( int id; void MethodA(); void MethodB(); ) class AuctionApplication ( int id; string cacheTitle; void MethodA(); void MethodB(); ) class AuctionApplication ( int id; string cacheTitle; void MethodA(); void MethodB(); ) Revision HistoryAppApp V 1 V 2 V 3 ALTER TABLE dbo.Auction WITH CHECK ADD CONSTRAINT Au_PK PRIMARY KEY (id) ALTER TABLE dbo.Auction WITH CHECK ADD CONSTRAINT Au_PK PRIMARY KEY (id) ALTER TABLE dbo.Auction WITH CHECK ADD CONSTRAINT Au_SK UNIQUE (name) ALTER TABLE dbo.Auction WITH CHECK ADD CONSTRAINT Au_SK UNIQUE (name)
-- version 1 Add table dbo.Auction IF OBJECT_ID (N'dbo.Auction', N'U') IS NULL BEGIN CREATE TABLE dbo.Auction ( id INT NOT NULL, name VARCHAR(25) NOT NULL, start DATETIME NULL, len INT NULL ) END -- version 2 Add PK Au_PK IF NOT EXISTS (SELECT * FROM sys.key_constraints WHERE name = 'Au_PK' AND type = 'PK') BEGIN ALTER TABLE Auction WITH CHECK ADD CONSTRAINT Au_PK PRIMARY KEY (id) END -- version 3 Add UC Au_SK IF NOT EXISTS (SELECT * FROM sys.key_constraints WHERE name = 'Au_SK' AND type = UQ') BEGIN ALTER TABLE Auction WITH CHECK ADD CONSTRAINT Au_SK UNIQUE (name) END -- version 1 Add table dbo.Auction IF OBJECT_ID (N'dbo.Auction', N'U') IS NULL BEGIN CREATE TABLE dbo.Auction ( id INT NOT NULL, name VARCHAR(25) NOT NULL, start DATETIME NULL, len INT NULL ) END -- version 2 Add PK Au_PK IF NOT EXISTS (SELECT * FROM sys.key_constraints WHERE name = 'Au_PK' AND type = 'PK') BEGIN ALTER TABLE Auction WITH CHECK ADD CONSTRAINT Au_PK PRIMARY KEY (id) END -- version 3 Add UC Au_SK IF NOT EXISTS (SELECT * FROM sys.key_constraints WHERE name = 'Au_SK' AND type = UQ') BEGIN ALTER TABLE Auction WITH CHECK ADD CONSTRAINT Au_SK UNIQUE (name) END
CREATE TABLE dbo.Auction ( id INT NOT NULL, name VARCHAR(25) NOT NULL, start DATETIME NULL, len INT NULL ) CREATE TABLE dbo.Auction ( id INT NOT NULL, name VARCHAR(25) NOT NULL, start DATETIME NULL, len INT NULL ) Logical Database class AuctionApplication ( int id; void MethodA(); ) class AuctionApplication ( int id; void MethodA(); ) class AuctionApplication ( int id; void MethodA(); void MethodB(); ) class AuctionApplication ( int id; void MethodA(); void MethodB(); ) class AuctionApplication ( int id; string cacheTitle; void MethodA(); void MethodB(); ) class AuctionApplication ( int id; string cacheTitle; void MethodA(); void MethodB(); ) Revision HistoryAppApp V 1 V 2V 3 CREATE TABLE dbo.Auction ( id INT NOT NULL PRIMARY KEY, name VARCHAR(25) NOT NULL, start DATETIME NULL, len INT NULL ) CREATE TABLE dbo.Auction ( id INT NOT NULL PRIMARY KEY, name VARCHAR(25) NOT NULL, start DATETIME NULL, len INT NULL ) CREATE TABLE dbo.Auction ( id INT NOT NULL PRIMARY KEY, name VARCHAR(25) NOT NULL UNIQUE, start DATETIME NULL, len INT NULL ) CREATE TABLE dbo.Auction ( id INT NOT NULL PRIMARY KEY, name VARCHAR(25) NOT NULL UNIQUE, start DATETIME NULL, len INT NULL )
CREATE TABLE dbo.Auction ( id INT NOT NULL PRIMARY KEY, name VARCHAR(25) NOT NULL UNIQUE, start DATETIME NULL, len INT NULL ) CREATE TABLE dbo.Auction ( id INT NOT NULL, name VARCHAR(25) NOT NULL, start DATETIME NULL, len INT NULL ) CREATE TABLE dbo.Auction ( id INT NOT NULL, name VARCHAR(25) NOT NULL, start DATETIME NULL, len INT NULL ) CREATE TABLE dbo.Auction ( id INT NOT NULL PRIMARY KEY, name VARCHAR(25) NOT NULL, start DATETIME NULL, len INT NULL ) CREATE TABLE dbo.Auction ( id INT NOT NULL PRIMARY KEY, name VARCHAR(25) NOT NULL, start DATETIME NULL, len INT NULL ) Эксплуатируемая система Логическая база Revision HistoryV 1 V 2V 3 CREATE TABLE dbo.Auction ( id INT NOT NULL PRIMARY KEY, name VARCHAR(25) NOT NULL UNIQUE, start DATETIME NULL, len INT NULL ) CREATE TABLE dbo.Auction ( id INT NOT NULL PRIMARY KEY, name VARCHAR(25) NOT NULL UNIQUE, start DATETIME NULL, len INT NULL ) Новая система ALTER TABLE dbo.Auction WITH CHECK ADD CONSTRAINT Au_SK UNIQUE (name)
Введение Проект БД и жизненный цикл БД Генерация тестовых данных Юнит-тестирование Управление изменениями Развертывание Заключение
Почему бы не использовать эксплуатационные данные? Они могут быть не верны! Не позволят протестировать «острые углы». Не позволят проверить изменения в схемах данных! Какие тестовые данные необходимы? Случайные! Детерминируемые. Распределенные соответствующим образом Количественно (сто первичных ключей -> десять тысяч дочерних записей) Качественно (длина строк, границы числовых значений и дат,…)
Какие отличия необходимы для тестовых данных Функциональные Нагрузочные Версионирование Необходимы разные тестовые данные и тесты для разных схем Необходимы даже разные тестовые планы для одной и той же схемы
Основные инструменты Генерация данных для таблиц Количество записей Генераторы для различных типов полей String, RegEx, data bound Можно написать свой собственный генератор Тонкие настройки генераторов
Введение Проект БД и жизненный цикл БД Генерация тестовых данных Юнит-тестирование Управление изменениями Развертывание Заключение
Автоматическая генерация юнит-тестов для Хранимых процедур, Функций, Триггеров Валидация результатов тестов (asserts) T-SQL Server based RAISEERROR Ожидаемые значения Не пустые результаты Количество записей Время выполнения Предварительные и пост скрипты
Автоматизированное развертывание Перед запуском тестов будет сформирована БД По соответствующему плану генерации тестовых данных будет создана основа для проверки
Введение Проект БД и жизненный цикл БД Генерация тестовых данных Юнит-тестирование Управление изменениями Развертывание Заключение
Рефакторинг Сравнение схем Сравнение данных
Введение Проект БД и жизненный цикл БД Генерация тестовых данных Юнит-тестирование Управление изменениями Развертывание Заключение
Стандартный подход Генерация скриптов изменений Через сравнение схемы Взаимодействие с администратором БД Новый подход Представляем: Data Tier Application Project System
Data-tier Application Project V1 Visual Studio SQL Server 2008 R2 Build.dacpac Стандартный проект БД Visual Studio.dbschema SQL Server 2005, 2008, 2008 R2 Build Deploy Генерация скриптов
Стандартный проект БДData-tier Application Projects V1 Целевые приложенияБизнес критические системыПриложения уровня подразделения Поддержка БДSQL 2005, 2008, 2010 и БД третьих производителей SQL 2008 R2; планируется поддержка SQL Сложность схемыНе ограниченнаяДо тысячи обьектов Апгрейд (schema + data) Проект генерирует.sql скрипты которые обновляют схему. Данные остаются на месте или подвергаются миграционным операциям в зависимости от сценариев апгрейда..sql скриптов нет. Единый пакет для развертывания или апгрейда содержащий всю необходимую информацию. Данные сохраняются в автоматическом режиме. Типы поддерживаемых SQL обьектов Полная поддержкаЧастичная поддержка IntelliSense, Debugging, T-SQL Editor Одинаковые возможности
31 DBA SQL Server Management Studio Managed Instances HR Control Point SALES Разработка Развертывание MANAGE Visual Studio 2010 Разработчик FinApp Prod DB DBA SQL Server Management Studio FinApp Dev DB Reverse Engineer DAC Create policies Deploy / Upgrade DAC Deploy / Upgrade DAC.dacpac Compile + Build Compile + Build Hand-off to DBA Deploy / Upgrade DAC Deploy / Upgrade DAC Manage, Register, Uninstall, Extract, Upgrade DAC
Введение Проект БД и жизненный цикл БД Генерация тестовых данных Юнит-тестирование Управление изменениями Развертывание Заключение
Разработка БД может быть полностью интегрирована в стандартный процесс ALM Инструментальные средства позволяют легко создавать объекты БД благодаря IntelliSense, встроенному отладчику Гибкие варианты развертывания могут снизить затраты на управление эксплуатационными БД