-- Create deployment tracking tableCREATETABLEdeployment_history(idSERIALPRIMARYKEY,deployment_idVARCHAR(50)UNIQUENOTNULL,environmentVARCHAR(20)NOTNULL,versionVARCHAR(20)NOTNULL,statusVARCHAR(20)DEFAULT'pending',started_atTIMESTAMPTZDEFAULTCURRENT_TIMESTAMP,completed_atTIMESTAMPTZ,rollback_versionVARCHAR(20),created_byVARCHAR(100)NOTNULL);-- Create function to switch trafficCREATEORREPLACEFUNCTIONswitch_traffic_to_green()RETURNSBOOLEANAS$$DECLAREcurrent_environmentVARCHAR(20);BEGIN-- Get current environmentSELECTenvironmentINTOcurrent_environmentFROMdeployment_historyWHEREstatus='active'ORDERBYstarted_atDESCLIMIT1;-- Switch to green environmentIFcurrent_environment='blue'THENUPDATEdeployment_historySETstatus='inactive'WHEREenvironment='blue'ANDstatus='active';UPDATEdeployment_historySETstatus='active'WHEREenvironment='green'ANDstatus='ready';RETURNTRUE;ELSERAISEEXCEPTION'Cannot switch from % environment',current_environment;ENDIF;END;$$LANGUAGEplpgsql;-- Create function to rollback to blueCREATEORREPLACEFUNCTIONrollback_to_blue()RETURNSBOOLEANAS$$BEGIN-- Switch back to blue environmentUPDATEdeployment_historySETstatus='inactive'WHEREenvironment='green'ANDstatus='active';UPDATEdeployment_historySETstatus='active'WHEREenvironment='blue'ANDstatus='ready';RETURNTRUE;END;$$LANGUAGEplpgsql;
-- Create canary deployment trackingCREATETABLEcanary_deployments(idSERIALPRIMARYKEY,deployment_idVARCHAR(50)UNIQUENOTNULL,versionVARCHAR(20)NOTNULL,canary_percentageINTEGERDEFAULT10,statusVARCHAR(20)DEFAULT'pending',started_atTIMESTAMPTZDEFAULTCURRENT_TIMESTAMP,completed_atTIMESTAMPTZ,metricsJSONB,created_byVARCHAR(100)NOTNULL);-- Create function to adjust canary trafficCREATEORREPLACEFUNCTIONadjust_canary_traffic(p_deployment_idVARCHAR(50),p_percentageINTEGER)RETURNSBOOLEANAS$$BEGIN-- Validate percentageIFp_percentage<0ORp_percentage>100THENRAISEEXCEPTION'Canary percentage must be between 0 and 100';ENDIF;-- Update canary percentageUPDATEcanary_deploymentsSETcanary_percentage=p_percentageWHEREdeployment_id=p_deployment_id;RETURNTRUE;END;$$LANGUAGEplpgsql;-- Create function to promote canaryCREATEORREPLACEFUNCTIONpromote_canary(p_deployment_idVARCHAR(50))RETURNSBOOLEANAS$$BEGIN-- Promote canary to full deploymentUPDATEcanary_deploymentsSETstatus='promoted',canary_percentage=100,completed_at=CURRENT_TIMESTAMPWHEREdeployment_id=p_deployment_id;RETURNTRUE;END;$$LANGUAGEplpgsql;
-- Create function for zero-downtime column additionCREATEORREPLACEFUNCTIONadd_column_zero_downtime(p_table_nameTEXT,p_column_nameTEXT,p_column_typeTEXT,p_default_valueTEXTDEFAULTNULL)RETURNSVOIDAS$$BEGIN-- Add column with default valueEXECUTEformat('ALTER TABLE %I ADD COLUMN %I %s',p_table_name,p_column_name,p_column_type);IFp_default_valueISNOTNULLTHENEXECUTEformat('UPDATE %I SET %I = %L',p_table_name,p_column_name,p_default_value);ENDIF;-- Add NOT NULL constraint if default value providedIFp_default_valueISNOTNULLTHENEXECUTEformat('ALTER TABLE %I ALTER COLUMN %I SET NOT NULL',p_table_name,p_column_name);ENDIF;END;$$LANGUAGEplpgsql;-- Create function for zero-downtime column removalCREATEORREPLACEFUNCTIONremove_column_zero_downtime(p_table_nameTEXT,p_column_nameTEXT)RETURNSVOIDAS$$BEGIN-- Remove columnEXECUTEformat('ALTER TABLE %I DROP COLUMN %I',p_table_name,p_column_name);END;$$LANGUAGEplpgsql;
-- Create environment configuration tableCREATETABLEenvironment_config(idSERIALPRIMARYKEY,environmentVARCHAR(20)NOTNULL,config_keyVARCHAR(100)NOTNULL,config_valueTEXTNOTNULL,is_secretBOOLEANDEFAULTFALSE,created_atTIMESTAMPTZDEFAULTCURRENT_TIMESTAMP,updated_atTIMESTAMPTZDEFAULTCURRENT_TIMESTAMP,UNIQUE(environment,config_key));-- Create function to get environment configCREATEORREPLACEFUNCTIONget_environment_config(p_environmentVARCHAR(20),p_config_keyVARCHAR(100))RETURNSTEXTAS$$DECLAREconfig_valueTEXT;BEGINSELECTconfig_valueINTOconfig_valueFROMenvironment_configWHEREenvironment=p_environmentANDconfig_key=p_config_key;RETURNconfig_value;END;$$LANGUAGEplpgsql;-- Create function to set environment configCREATEORREPLACEFUNCTIONset_environment_config(p_environmentVARCHAR(20),p_config_keyVARCHAR(100),p_config_valueTEXT,p_is_secretBOOLEANDEFAULTFALSE)RETURNSVOIDAS$$BEGININSERTINTOenvironment_config(environment,config_key,config_value,is_secret)VALUES(p_environment,p_config_key,p_config_value,p_is_secret)ONCONFLICT(environment,config_key)DOUPDATESETconfig_value=EXCLUDED.config_value,is_secret=EXCLUDED.is_secret,updated_at=CURRENT_TIMESTAMP;END;$$LANGUAGEplpgsql;