124 lines
4.4 KiB
Plaintext
124 lines
4.4 KiB
Plaintext
DATABASE MIGRATION PLAN
|
|
==================================================
|
|
Migration ID: a7b3c9d2
|
|
Created: 2024-02-16T15:30:00Z
|
|
Zero Downtime: false
|
|
|
|
MIGRATION SUMMARY
|
|
-----------------
|
|
Total Steps: 12
|
|
Tables Added: 1
|
|
Tables Dropped: 0
|
|
Tables Renamed: 0
|
|
Columns Added: 3
|
|
Columns Dropped: 1
|
|
Columns Modified: 2
|
|
Constraints Added: 4
|
|
Constraints Dropped: 1
|
|
Indexes Added: 2
|
|
Indexes Dropped: 1
|
|
|
|
RISK ASSESSMENT
|
|
---------------
|
|
High Risk Steps: 3
|
|
Medium Risk Steps: 4
|
|
Low Risk Steps: 5
|
|
|
|
MIGRATION STEPS
|
|
---------------
|
|
1. Create table brands with 4 columns (LOW risk)
|
|
Type: CREATE_TABLE
|
|
Forward SQL: CREATE TABLE brands (
|
|
id INTEGER PRIMARY KEY,
|
|
name VARCHAR(100) NOT NULL,
|
|
description TEXT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
Rollback SQL: DROP TABLE IF EXISTS brands;
|
|
|
|
2. Add column brand_id to products (LOW risk)
|
|
Type: ADD_COLUMN
|
|
Forward SQL: ALTER TABLE products ADD COLUMN brand_id INTEGER;
|
|
Rollback SQL: ALTER TABLE products DROP COLUMN brand_id;
|
|
|
|
3. Add column email_verified to users (LOW risk)
|
|
Type: ADD_COLUMN
|
|
Forward SQL: ALTER TABLE users ADD COLUMN email_verified BOOLEAN DEFAULT false;
|
|
Rollback SQL: ALTER TABLE users DROP COLUMN email_verified;
|
|
|
|
4. Add column last_login to users (LOW risk)
|
|
Type: ADD_COLUMN
|
|
Forward SQL: ALTER TABLE users ADD COLUMN last_login TIMESTAMP;
|
|
Rollback SQL: ALTER TABLE users DROP COLUMN last_login;
|
|
|
|
5. Modify column price: type: DECIMAL(10,2) -> DECIMAL(12,2) (LOW risk)
|
|
Type: MODIFY_COLUMN
|
|
Forward SQL: ALTER TABLE products
|
|
ALTER COLUMN price TYPE DECIMAL(12,2);
|
|
Rollback SQL: ALTER TABLE products
|
|
ALTER COLUMN price TYPE DECIMAL(10,2);
|
|
|
|
6. Modify column inventory_count: nullable: true -> false (HIGH risk)
|
|
Type: MODIFY_COLUMN
|
|
Forward SQL: ALTER TABLE products
|
|
ALTER COLUMN inventory_count SET NOT NULL;
|
|
Rollback SQL: ALTER TABLE products
|
|
ALTER COLUMN inventory_count DROP NOT NULL;
|
|
|
|
7. Add primary key on id (MEDIUM risk)
|
|
Type: ADD_CONSTRAINT
|
|
Forward SQL: ALTER TABLE brands ADD CONSTRAINT pk_brands PRIMARY KEY (id);
|
|
Rollback SQL: ALTER TABLE brands DROP CONSTRAINT pk_brands;
|
|
|
|
8. Add foreign key constraint on brand_id (MEDIUM risk)
|
|
Type: ADD_CONSTRAINT
|
|
Forward SQL: ALTER TABLE products ADD CONSTRAINT fk_products_brand_id FOREIGN KEY (brand_id) REFERENCES brands(id);
|
|
Rollback SQL: ALTER TABLE products DROP CONSTRAINT fk_products_brand_id;
|
|
|
|
9. Add unique constraint on name (MEDIUM risk)
|
|
Type: ADD_CONSTRAINT
|
|
Forward SQL: ALTER TABLE brands ADD CONSTRAINT uq_brands_name UNIQUE (name);
|
|
Rollback SQL: ALTER TABLE brands DROP CONSTRAINT uq_brands_name;
|
|
|
|
10. Add check constraint: price > 0 (MEDIUM risk)
|
|
Type: ADD_CONSTRAINT
|
|
Forward SQL: ALTER TABLE products ADD CONSTRAINT chk_products_price_positive CHECK (price > 0);
|
|
Rollback SQL: ALTER TABLE products DROP CONSTRAINT chk_products_price_positive;
|
|
|
|
11. Create index idx_products_brand_id on (brand_id) (LOW risk)
|
|
Type: ADD_INDEX
|
|
Forward SQL: CREATE INDEX idx_products_brand_id ON products (brand_id);
|
|
Rollback SQL: DROP INDEX idx_products_brand_id;
|
|
Estimated Time: 1-5 minutes depending on table size
|
|
|
|
12. Create index idx_users_email_verified on (email_verified) (LOW risk)
|
|
Type: ADD_INDEX
|
|
Forward SQL: CREATE INDEX idx_users_email_verified ON users (email_verified);
|
|
Rollback SQL: DROP INDEX idx_users_email_verified;
|
|
Estimated Time: 1-5 minutes depending on table size
|
|
|
|
VALIDATION CHECKS
|
|
-----------------
|
|
• Verify table brands exists
|
|
SQL: SELECT COUNT(*) FROM information_schema.tables WHERE table_name = 'brands';
|
|
Expected: 1
|
|
|
|
• Verify column brand_id exists in products
|
|
SQL: SELECT COUNT(*) FROM information_schema.columns WHERE table_name = 'products' AND column_name = 'brand_id';
|
|
Expected: 1
|
|
|
|
• Verify column email_verified exists in users
|
|
SQL: SELECT COUNT(*) FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'email_verified';
|
|
Expected: 1
|
|
|
|
• Verify column modification in products
|
|
SQL: SELECT data_type, is_nullable FROM information_schema.columns WHERE table_name = 'products' AND column_name = 'price';
|
|
Expected: 1
|
|
|
|
• Verify index idx_products_brand_id exists
|
|
SQL: SELECT COUNT(*) FROM information_schema.statistics WHERE index_name = 'idx_products_brand_id';
|
|
Expected: 1
|
|
|
|
• Verify index idx_users_email_verified exists
|
|
SQL: SELECT COUNT(*) FROM information_schema.statistics WHERE index_name = 'idx_users_email_verified';
|
|
Expected: 1 |