enabling continuous delivery with database...
TRANSCRIPT
![Page 1: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/1.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/2.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/3.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/4.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/5.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/6.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/7.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/8.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/9.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/10.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/11.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/12.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/13.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/14.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/15.jpg)
![Page 16: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/16.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/17.jpg)
![Page 18: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/18.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/19.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/20.jpg)
![Page 21: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/21.jpg)
![Page 22: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/22.jpg)
![Page 23: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/23.jpg)
![Page 24: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/24.jpg)
![Page 25: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/25.jpg)
![Page 26: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/26.jpg)
![Page 27: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/27.jpg)
![Page 28: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/28.jpg)
![Page 29: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/29.jpg)
![Page 30: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/30.jpg)
![Page 31: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/31.jpg)
√×
![Page 32: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/32.jpg)
√× 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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/33.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/34.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/35.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/36.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/37.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/38.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/39.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/40.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/41.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/42.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/43.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/44.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/45.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/46.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/47.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/48.jpg)
Deployment
![Page 49: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/49.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/50.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/51.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/52.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/53.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/54.jpg)
![Page 55: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/55.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/56.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/57.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/58.jpg)
![Page 59: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/59.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/60.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/61.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/62.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/63.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/64.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/65.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/66.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/67.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/68.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/69.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/70.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/71.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/72.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/73.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/74.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/75.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/76.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/77.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/78.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/79.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/80.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/81.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/82.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/83.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/84.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/85.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/86.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/87.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/88.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/89.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/90.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/91.jpg)
Tips
![Page 92: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/92.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/93.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/94.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/95.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/96.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/97.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/98.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/99.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/100.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/101.jpg)
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](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/102.jpg)
![Page 103: Enabling Continuous Delivery with Database Practicesfiles.meetup.com/107575/DatabasePractices_to_enableCD.pdf · Enabling Continuous Delivery with Database Practices Pramod Sadalage](https://reader035.vdocuments.net/reader035/viewer/2022081402/5f0e07c07e708231d43d45d4/html5/thumbnails/103.jpg)
Thanks @pramodsadalage
sadalage.com databaserefactoring.com