enabling continuous delivery with database...

103
Enabling Continuous Delivery with Database Practices Pramod Sadalage @pramodsadalage ThoughtWorks Inc.

Upload: others

Post on 26-Jun-2020

16 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Enabling Continuous Delivery with

Database Practices

Pramod Sadalage @pramodsadalage ThoughtWorks Inc.

Page 2: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Agenda

Why Continuous Delivery

Collaboration with the data team

Automation for data

Refactoring databases

Deploying database changes

Page 3: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Why Continuous Delivery?

Page 4: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

To get fast feedback from users, release frequently

Page 5: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Reduce risk of releasing

Page 6: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Learning and responding to customer needs is critical

Page 7: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Achieve Continuous Delivery

Page 8: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Close collaboration between everyone involved in delivery

Page 9: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Extensive automation of all parts involved in delivery

process

Page 10: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Reduce the gap between development and operations

Page 11: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

CD should involve the database team

Page 12: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

How does continuous delivery apply to

databases?

Page 13: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Collaboration techniques

Page 14: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Pair the DBA’s and Developers

Page 15: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage
Page 16: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Version control all database scripts and artifacts

Page 17: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage
Page 18: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Automation techniques

Page 19: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Let developers provision application database

Page 20: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage
Page 21: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage
Page 22: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage
Page 23: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage
Page 24: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage
Page 25: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage
Page 26: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage
Page 27: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage
Page 28: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage
Page 29: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage
Page 30: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage
Page 31: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

√×

Page 32: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

√× JaiAndy

Laptop/Desktop

Application

Database

Page 33: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Continuously Integrate database changes

Page 34: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Integration environmentLocal dev environment

ANT Maven Gradle Rake

Continuous Integration Engine

Source Control

Dev Database

PROD UAT QA

Dev DB

PROD UAT QA

Environment

Check in application code and database migration scripts

Update and build

Database changes applied by DBA Team

Page 35: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Integration environmentLocal dev environment

ANT Maven Gradle Rake

Continuous Integration Engine

Source Control

Dev Database

PROD UAT QA

Dev DB

PROD UAT QA

Environment

Check in application code and database migration scripts

Update and build

Page 36: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Integration environmentLocal dev environment

ANT Maven Gradle Rake

Continuous Integration Engine

Source Control

PROD UAT QA

Dev DB

PROD UAT QA

Environment

Check in application code and database migration scripts

Update and build

Migration scripts (DBA)

Page 37: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Integration environmentLocal dev environment

ANT Maven Gradle Rake

Continuous Integration Engine

Source Control

PROD UAT QA

Dev DB

PROD UAT QA

Environment

Check in application code and database migration scripts

Update and build

Migration scripts (DBA)

Migration scripts

Integration Database

Page 38: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Integration environmentLocal dev environment

ANT Maven Gradle Rake

Continuous Integration Engine

Source Control

PROD UAT QA

Dev DB

PROD UAT QA

Environment

Check in application code and database migration scripts

Update and build

Migration scripts (DBA)

Migration scripts

Integration Database

Page 39: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Integration environmentLocal dev environment

ANT Maven Gradle Rake

Continuous Integration Engine

Source Control

PROD UAT QA

Dev DB

PROD UAT QA

Environment

Check in application code and database migration scripts

Update and build

Migration scripts (DBA)

Apply migration scripts

Migration scripts

Integration Database

Page 40: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Integration environmentLocal dev environment

ANT Maven Gradle Rake

Continuous Integration Engine

Source Control

PROD UAT QA

Dev DB

PROD UAT QA

Environment

Check in application code and database migration scripts

Update and build

Migration scripts (DBA)

Apply migration scripts

Migration scripts

Artifacts

Package Migration scripts

War Jar

Integration Database

Page 41: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Integration environmentLocal dev environment

ANT Maven Gradle Rake

Continuous Integration Engine

Source Control

PROD UAT QA

Dev DB

PROD UAT QA

Environment

Check in application code and database migration scripts

Update and build

Migration scripts (DBA)

Apply migration scripts

Migration scripts

Artifacts

Package Migration scripts

War Jar

Apply Migration scripts

War Jar

Integration Database

Page 42: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Benefits of CI with databases

Page 43: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Benefits of CI with databases

• Test application code and database at one place

Page 44: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Benefits of CI with databases

• Test application code and database at one place

• Generate code and database artifacts

Page 45: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Benefits of CI with databases

• Test application code and database at one place

• Generate code and database artifacts

• Integrate application and database changes in an independent environment

Page 46: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Benefits of CI with databases

• Test application code and database at one place

• Generate code and database artifacts

• Integrate application and database changes in an independent environment

• Show current state of application and database to all

Page 47: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

DB artifacts in CI

application artifact for build <<n>>

database artifact for build <<n>>

Page 48: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Deployment

Page 49: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Deployment

• Database migration/upgrade should be a development time task not deployment time task

Page 50: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Deployment

• Database migration/upgrade should be a development time task not deployment time task

• Package all the migration scripts, during Continuous Integration cycle

Page 51: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Deployment

• Database migration/upgrade should be a development time task not deployment time task

• Package all the migration scripts, during Continuous Integration cycle

• Apply the migration scripts

Page 52: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Deployment

• Database migration/upgrade should be a development time task not deployment time task

• Package all the migration scripts, during Continuous Integration cycle

• Apply the migration scripts

• Deploy frequently to reduce risk

Page 53: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Database refactoring

http://databaserefactoring.com/

Page 54: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage
Page 55: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

A database refactoring is a small change to your database schema (the DDL, data, and DB code) which improves its design without changing its semantics.

Page 56: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

A database refactoring is a small change to your database schema (the DDL, data, and DB code) which improves its design without changing its semantics.

Page 57: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

A database refactoring improves its design while retaining both its behavioral and informational semantics.

A database refactoring is a small change to your database schema (the DDL, data, and DB code) which improves its design without changing its semantics.

Page 58: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage
Page 59: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Timeline of Change

Page 60: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Timeline of Change

Start

Implement the refactoring

{Deploy new changes, migrate data, put in scaffolding code

Expand

Page 61: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Timeline of Change

Transition

Transition Period (old and new)

{Start

Implement the refactoring

{Deploy new changes, migrate data, put in scaffolding code

Expand

Page 62: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Timeline of Change

Transition

Transition Period (old and new)

{Start

Implement the refactoring

{Deploy new changes, migrate data, put in scaffolding code

Expand

End

Refactoring completed

{

Remove old schema, scaffolding code

Contract

Page 63: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Keeping Old and New alive

Page 64: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Keeping Old and New alive

• DB Should be able to handle multiple versions of the application

Page 65: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Keeping Old and New alive

• DB Should be able to handle multiple versions of the application

• Create Interfaces in the database

Page 66: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Keeping Old and New alive

• DB Should be able to handle multiple versions of the application

• Create Interfaces in the database

• Wrap tables with views

Page 67: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Keeping Old and New alive

• DB Should be able to handle multiple versions of the application

• Create Interfaces in the database

• Wrap tables with views

• Create calculated columns

Page 68: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Keeping Old and New alive

• DB Should be able to handle multiple versions of the application

• Create Interfaces in the database

• Wrap tables with views

• Create calculated columns

• Create triggers to sync data

Page 69: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Expand Contract an example

Page 70: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Expand Contract an example

Start name = “Pramod Sadalage”

Page 71: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Expand Contract an example

Start name = “Pramod Sadalage”

Expand name = “Pramod Sadalage” firstname = “Pramod” lastname = “Sadalage”

Page 72: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Expand Contract an example

Start name = “Pramod Sadalage”

Expand name = “Pramod Sadalage” firstname = “Pramod” lastname = “Sadalage”

Contract firstname = “Pramod” lastname = “Sadalage”

Page 73: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

More on expand contract

Page 74: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

More on expand contract

Start name = “Pramod Sadalage”

Page 75: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Expand

More on expand contract

Start name = “Pramod Sadalage”

Without data migration name = “Pramod Sadalage” firstname = null lastname = null

With data migration name = “Pramod Sadalage” firstname = “Pramod” lastname = “Sadalage”

Page 76: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Expand

More on expand contract

Start name = “Pramod Sadalage”

Without data migration name = “Pramod Sadalage” firstname = null lastname = null

With data migration name = “Pramod Sadalage” firstname = “Pramod” lastname = “Sadalage”

Page 77: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Expand

More on expand contract

Start name = “Pramod Sadalage”

Without data migration name = “Pramod Sadalage” firstname = null lastname = null

With data migration name = “Pramod Sadalage” firstname = “Pramod” lastname = “Sadalage”

Page 78: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Expand

More on expand contract

Start name = “Pramod Sadalage”

Contract firstname = “Pramod” lastname = “Sadalage”

Without data migration name = “Pramod Sadalage” firstname = null lastname = null

With data migration name = “Pramod Sadalage” firstname = “Pramod” lastname = “Sadalage”

Page 79: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Simple scenario - DBDeploy

ALTER TABLE Customer ADD firstname VARCHAR2(60); ALTER TABLE Customer ADD lastname VARCHAR2(60);

--//@UNDO

ALTER TABLE Customer DROP COLUMN firstname VARCHAR2(60); ALTER TABLE Customer DROP COLUMN lastname VARCHAR2(60);

Page 80: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

With synchronized dataALTER TABLE Customer ADD firstname VARCHAR2(60); ALTER TABLE Customer ADD lastname VARCHAR2(60); CREATE OR REPLACE TRIGGER SynchronizeName BEFORE INSERT OR UPDATE ON Customer REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW BEGIN IF :NEW.Name IS NULL THEN :NEW.Name := :NEW.firstname||' '||:NEW.lastname; END IF; IF :NEW.name IS NOT NULL THEN :NEW.firstname := extractfirstname(:NEW.name); :NEW.lastname := extractlastname(:NEW.name); END IF; END; /

—//@UNDO ……

Page 81: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Migrate and Synchronize data

ALTER TABLE Customer ADD firstname VARCHAR2(60); ALTER TABLE Customer ADD lastname VARCHAR2(60); UPDATE Customer set firstname = extractfirstname (name); UPDATE Customer set lastname = extractlastname (name);

CREATE OR REPLACE TRIGGER SynchronizeName BEFORE INSERT OR UPDATE …. —//@UNDO …… UPDATE Customer set name = firstname ||’ ‘||lastname WHERE name IS NULL; ALTER TABLE Customer DROP COLUMN firstname; ALTER TABLE Customer DROP COLUMN lastname;

Page 82: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Contract

ALTER TABLE Customer DROP COLUMN name;

—//@UNDO

ALTER TABLE Customer ADD name VARCHAR2(120); UPDATE Customer set name = firstname ||’ ‘||lastname WHERE name IS NULL;

Page 83: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Contract

ALTER TABLE Customer DROP COLUMN name;

—//@UNDO

ALTER TABLE Customer ADD name VARCHAR2(120); UPDATE Customer set name = firstname ||’ ‘||lastname WHERE name IS NULL;

SET UNUSED name; When drop takes

forever

Page 84: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Keep legacy apps happyALTER TABLE Customer DROP COLUMN name; ALTER TABLE CUSTOMER ADD (name AS (generatename (firstname,lastname)) );

—//@UNDO

ALTER TABEL Customer DROP COLUMN name; ALTER TABLE Customer ADD name VARCHAR2(120); UPDATE Customer set name = firstname ||’ ‘||lastname WHERE name IS NULL;

Virtual column in Oracle,

Generated Column in

MySQL.

Page 85: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Another example

Page 86: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Migration script

ALTER TABLE custordr rename to customerorder;

CREATE OR REPLACE VIEW custordr AS SELECT custordrid, ponumber, ordrdt, shipdate, sptoadid FROM customerorder ; --//@UNDO

DROP VIEW custordr; ALTER TABLE customerorder RENAME TO custordr;

Page 87: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

data in migrations

Page 88: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

data in migrationsINSERT INTO businessunit ( businessunitid, name, regionid ) VALUES ( 22, 'John Doe Services', 1 ); INSERT INTO businessunit ( businessunitid, name, regionid ) VALUES ( 23, 'Bob Products', 1 ); INSERT INTO businessunit ( businessunitid, name, regionid ) VALUES ( 24, 'Carr Machinery', 1 );

Page 89: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

data in migrations

INSERT INTO currency ( currencyid, name, code ) VALUES ( 2, 'Canadian Dollar', 'CAD' ); INSERT INTO currency ( currencyid, name, code ) VALUES ( 3, 'Australian Dollar', 'AUD' ); INSERT INTO currency ( currencyid, name, code ) VALUES ( 4, 'EMU Euro', 'EUR' );

Page 90: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

data in migrations

DELETE FROM contact ct WHERE NOT EXISTS (SELECT 1 FROM customer p WHERE ct.contactid=p.contactid) and EXISTS (SELECT 1 FROM (SELECT customerid, COUNT(*) FROM contact WHERE customerid IS NOT NULL GROUP BY customerid HAVING COUNT(*) >1) ct2 WHERE ct.customerid=ct2.customerid);

Page 91: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Tips

Page 92: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Tips

• Large refactorings are risky

Page 93: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Tips

• Large refactorings are risky

• Sequence of many small refactorings can create the desired change

Page 94: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Tips

• Large refactorings are risky

• Sequence of many small refactorings can create the desired change

• Migration scripts should be checked in and run on local dev/ci/qa/uat/prod etc.

Page 95: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Tips

• Large refactorings are risky

• Sequence of many small refactorings can create the desired change

• Migration scripts should be checked in and run on local dev/ci/qa/uat/prod etc.

• Changes to data are also migrations

Page 96: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Tracking Changes

Page 97: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Tracking Changes

• Each change is a delta/migration script

Page 98: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Tracking Changes

• Each change is a delta/

• Migration scripts are development time activity not deployment time tasks

Page 99: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Tracking Changes

• Each change is a delta/

• Migration scripts are development time activity not deployment time tasks

• Package migration scripts for automated deployment

Page 100: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Tracking Changes

• Each change is a delta/

• Migration scripts are development time activity not deployment time tasks

• Package migration scripts for automated deployment

• Same scripts for: developers, QA, UAT and Production

Page 101: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Continuous Delivery

ant -propertyfile qa.properties upgrade ant -propertyfile live.properties upgrade

Deployment should be easy

Page 102: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage
Page 103: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage

Thanks @pramodsadalage

sadalage.com databaserefactoring.com