-- Enable essential extensions for productionCREATEEXTENSIONIFNOTEXISTS"uuid-ossp";CREATEEXTENSIONIFNOTEXISTS"pgcrypto";CREATEEXTENSIONIFNOTEXISTS"pg_stat_statements";CREATEEXTENSIONIFNOTEXISTS"btree_gin";CREATEEXTENSIONIFNOTEXISTS"btree_gist";CREATEEXTENSIONIFNOTEXISTS"hstore";CREATEEXTENSIONIFNOTEXISTS"ltree";CREATEEXTENSIONIFNOTEXISTS"unaccent";CREATEEXTENSIONIFNOTEXISTS"pg_trgm";-- Verify extensions are installedSELECT*FROMpg_extensionORDERBYextname;
-- Create custom extensionCREATEEXTENSIONIFNOTEXISTS"plpgsql";-- Custom function for data validationCREATEORREPLACEFUNCTIONvalidate_email(emailTEXT)RETURNSBOOLEANAS$$BEGINRETURNemail~*'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$';END;$$LANGUAGEplpgsql;-- Custom function for data transformationCREATEORREPLACEFUNCTIONnormalize_phone(phoneTEXT)RETURNSTEXTAS$$BEGIN-- Remove all non-digit charactersRETURNregexp_replace(phone,'[^0-9]','','g');END;$$LANGUAGEplpgsql;-- Custom aggregate functionCREATEORREPLACEFUNCTIONarray_accum(anyarray,anyelement)RETURNSanyarrayAS$$BEGINRETURNarray_append($1,$2);END;$$LANGUAGEplpgsql;CREATEAGGREGATEarray_agg_custom(anyelement)(SFUNC=array_accum,STYPE=anyarray,INITCOND='{}');
# extensions/extension_manager.pyimportpsycopg2importloggingfromtypingimportList,Dict,AnyclassPostgreSQLExtensionManager:def__init__(self,connection_params):self.conn_params=connection_paramsself.setup_logging()defsetup_logging(self):"""Setup logging."""logging.basicConfig(level=logging.INFO)self.logger=logging.getLogger(__name__)deflist_installed_extensions(self):"""List all installed extensions."""conn=psycopg2.connect(**self.conn_params)try:withconn.cursor()ascur:cur.execute(""" SELECT extname, extversion, extrelocatable, extconfig, extcondition FROM pg_extension ORDER BY extname; """)extensions=cur.fetchall()returnextensionsexceptExceptionase:self.logger.error(f"Error listing extensions: {e}")return[]finally:conn.close()definstall_extension(self,extension_name,version=None):"""Install a PostgreSQL extension."""conn=psycopg2.connect(**self.conn_params)try:withconn.cursor()ascur:ifversion:sql=f"CREATE EXTENSION IF NOT EXISTS {extension_name} VERSION '{version}';"else:sql=f"CREATE EXTENSION IF NOT EXISTS {extension_name};"cur.execute(sql)conn.commit()self.logger.info(f"Extension {extension_name} installed successfully")returnTrueexceptExceptionase:self.logger.error(f"Error installing extension {extension_name}: {e}")conn.rollback()returnFalsefinally:conn.close()defuninstall_extension(self,extension_name):"""Uninstall a PostgreSQL extension."""conn=psycopg2.connect(**self.conn_params)try:withconn.cursor()ascur:cur.execute(f"DROP EXTENSION IF EXISTS {extension_name};")conn.commit()self.logger.info(f"Extension {extension_name} uninstalled successfully")returnTrueexceptExceptionase:self.logger.error(f"Error uninstalling extension {extension_name}: {e}")conn.rollback()returnFalsefinally:conn.close()defcheck_extension_availability(self,extension_name):"""Check if an extension is available for installation."""conn=psycopg2.connect(**self.conn_params)try:withconn.cursor()ascur:cur.execute(""" SELECT EXISTS( SELECT 1 FROM pg_available_extensions WHERE name = %s ); """,(extension_name,))available=cur.fetchone()[0]returnavailableexceptExceptionase:self.logger.error(f"Error checking extension availability: {e}")returnFalsefinally:conn.close()defget_extension_dependencies(self,extension_name):"""Get dependencies for an extension."""conn=psycopg2.connect(**self.conn_params)try:withconn.cursor()ascur:cur.execute(""" SELECT depname, deptype FROM pg_depend d JOIN pg_extension e ON d.refobjid = e.oid WHERE e.extname = %s; """,(extension_name,))dependencies=cur.fetchall()returndependenciesexceptExceptionase:self.logger.error(f"Error getting extension dependencies: {e}")return[]finally:conn.close()defupdate_extension(self,extension_name,new_version):"""Update an extension to a new version."""conn=psycopg2.connect(**self.conn_params)try:withconn.cursor()ascur:cur.execute(f"ALTER EXTENSION {extension_name} UPDATE TO '{new_version}';")conn.commit()self.logger.info(f"Extension {extension_name} updated to version {new_version}")returnTrueexceptExceptionase:self.logger.error(f"Error updating extension {extension_name}: {e}")conn.rollback()returnFalsefinally:conn.close()# Usageif__name__=="__main__":manager=PostgreSQLExtensionManager({'host':'localhost','database':'production','user':'extension_manager','password':'extension_password'})# List installed extensionsextensions=manager.list_installed_extensions()forextinextensions:print(f"Extension: {ext[0]}, Version: {ext[1]}")# Install new extensionifmanager.check_extension_availability('pg_stat_statements'):manager.install_extension('pg_stat_statements')
-- Install TimescaleDB extensionCREATEEXTENSIONIFNOTEXISTS"timescaledb";-- Create hypertable for time series dataCREATETABLEsensor_readings(timeTIMESTAMPTZNOTNULL,sensor_idINTEGERNOTNULL,temperatureDOUBLEPRECISION,humidityDOUBLEPRECISION,pressureDOUBLEPRECISION);-- Convert to hypertableSELECTcreate_hypertable('sensor_readings','time');-- Create indexesCREATEINDEXidx_sensor_readings_sensor_id_timeONsensor_readings(sensor_id,timeDESC);-- Insert time series dataINSERTINTOsensor_readings(time,sensor_id,temperature,humidity,pressure)SELECTgenerate_series('2024-01-01'::timestamptz,'2024-01-31'::timestamptz,'1 hour'::interval),(random()*10)::integer,(random()*30+10)::doubleprecision,(random()*50+30)::doubleprecision,(random()*100+900)::doubleprecision;-- Time series queriesSELECTtime_bucket('1 day',time)asday,sensor_id,AVG(temperature)asavg_temp,MAX(temperature)asmax_temp,MIN(temperature)asmin_tempFROMsensor_readingsWHEREtime>='2024-01-01'ANDtime<'2024-02-01'GROUPBYday,sensor_idORDERBYday,sensor_id;
-- Create extension management roleCREATEROLEextension_managerWITHLOGINPASSWORD'secure_password';-- Grant necessary privilegesGRANTCREATEONDATABASEproductionTOextension_manager;GRANTUSAGEONSCHEMApublicTOextension_manager;-- Restrict extension installation to specific schemasCREATESCHEMAIFNOTEXISTSextensions;GRANTUSAGEONSCHEMAextensionsTOextension_manager;-- Create extension whitelistCREATETABLEextension_whitelist(idSERIALPRIMARYKEY,extension_nameVARCHAR(100)NOTNULLUNIQUE,allowed_versionsTEXT[],security_levelVARCHAR(20)DEFAULT'medium',created_atTIMESTAMPTZDEFAULTCURRENT_TIMESTAMP);-- Insert allowed extensionsINSERTINTOextension_whitelist(extension_name,allowed_versions,security_level)VALUES('pg_stat_statements',ARRAY['1.8','1.9'],'low'),('postgis',ARRAY['3.0','3.1'],'medium'),('uuid-ossp',ARRAY['1.1'],'low'),('pgcrypto',ARRAY['1.3'],'medium');-- Function to check extension whitelistCREATEORREPLACEFUNCTIONis_extension_allowed(ext_nameTEXT,ext_versionTEXTDEFAULTNULL)RETURNSBOOLEANAS$$BEGINIFext_versionISNULLTHENRETURNEXISTS(SELECT1FROMextension_whitelistWHEREextension_name=ext_name);ELSERETURNEXISTS(SELECT1FROMextension_whitelistWHEREextension_name=ext_nameAND(allowed_versionsISNULLORext_version=ANY(allowed_versions)));ENDIF;END;$$LANGUAGEplpgsql;
# monitoring/extension_monitor.pyimportpsycopg2importjsonfromdatetimeimportdatetimeimportloggingclassExtensionMonitor:def__init__(self,connection_params):self.conn_params=connection_paramsself.setup_logging()defsetup_logging(self):"""Setup logging."""logging.basicConfig(level=logging.INFO)self.logger=logging.getLogger(__name__)defmonitor_extension_performance(self):"""Monitor extension performance impact."""conn=psycopg2.connect(**self.conn_params)try:withconn.cursor()ascur:# Get extension usage statisticscur.execute(""" SELECT extname, extversion, pg_size_pretty(pg_relation_size(oid)) as size FROM pg_extension ORDER BY pg_relation_size(oid) DESC; """)extension_stats=cur.fetchall()# Get extension function usagecur.execute(""" SELECT n.nspname as schema_name, p.proname as function_name, pg_stat_get_function_calls(p.oid) as calls, pg_stat_get_function_total_time(p.oid) as total_time FROM pg_proc p JOIN pg_namespace n ON p.pronamespace = n.oid WHERE n.nspname IN ( SELECT extnamespace::regnamespace::text FROM pg_extension ) ORDER BY pg_stat_get_function_total_time(p.oid) DESC; """)function_stats=cur.fetchall()return{'extension_stats':extension_stats,'function_stats':function_stats,'monitor_timestamp':datetime.now().isoformat()}exceptExceptionase:self.logger.error(f"Error monitoring extensions: {e}")return{}finally:conn.close()defcheck_extension_health(self):"""Check extension health and issues."""conn=psycopg2.connect(**self.conn_params)try:withconn.cursor()ascur:# Check for extension errorscur.execute(""" SELECT extname, extversion, extrelocatable FROM pg_extension WHERE extname NOT IN ( SELECT name FROM pg_available_extensions ); """)unavailable_extensions=cur.fetchall()# Check for extension conflictscur.execute(""" SELECT extname, COUNT(*) as dependency_count FROM pg_depend d JOIN pg_extension e ON d.refobjid = e.oid GROUP BY extname HAVING COUNT(*) > 10; """)high_dependency_extensions=cur.fetchall()return{'unavailable_extensions':unavailable_extensions,'high_dependency_extensions':high_dependency_extensions,'health_check_timestamp':datetime.now().isoformat()}exceptExceptionase:self.logger.error(f"Error checking extension health: {e}")return{}finally:conn.close()# Usageif__name__=="__main__":monitor=ExtensionMonitor({'host':'localhost','database':'production','user':'monitor_user','password':'monitor_password'})# Monitor extension performanceperformance_data=monitor.monitor_extension_performance()print(json.dumps(performance_data,indent=2))# Check extension healthhealth_data=monitor.check_extension_health()print(json.dumps(health_data,indent=2))