PostgreSQL AWS蓝绿部署期间如何阻止Blue环境执行DDL?
解决AWS RDS PostgreSQL蓝绿部署期间禁止Blue环境DDL的方案
在AWS RDS PostgreSQL蓝绿部署的5小时懒加载阶段,必须阻止Blue环境的任何DDL操作以保证Green环境的一致性,同时要保留用户的正常DML操作权限,以下是几种可行方案:
一、数据库级DDL拦截触发器(推荐)
通过创建数据库级的事件触发器,精准拦截所有非超级用户的DDL操作,完全不影响用户登录和DML操作,侵入性极低。
步骤1:创建DDL拦截函数
CREATE OR REPLACE FUNCTION block_unauthorized_ddl() RETURNS event_trigger AS $$ BEGIN -- 仅允许超级用户执行DDL,替换rds_superuser为你的实际超级用户 IF current_user NOT IN ('rds_superuser') THEN RAISE EXCEPTION 'DDL操作已临时禁用,蓝绿部署完成后恢复'; END IF; END; $$ LANGUAGE plpgsql;
步骤2:创建事件触发器拦截所有DDL
CREATE EVENT TRIGGER block_all_ddl ON ddl_command_start EXECUTE FUNCTION block_unauthorized_ddl();
这个触发器会拦截所有DDL命令(包括CREATE、ALTER、DROP、TRUNCATE等),非超级用户执行时会抛出明确的错误提示。
步骤3:部署完成后清理触发器
DROP EVENT TRIGGER block_all_ddl; DROP FUNCTION block_unauthorized_ddl();
二、权限回收补充方案
如果担心部分拥有对象所有权的用户绕过触发器(比如对象所有者可以对自己的对象执行DDL),可以配合回收全局和Schema级的DDL权限:
-- 收回数据库级的CREATE权限 REVOKE CREATE ON DATABASE your_database_name FROM PUBLIC; -- 收回public schema的CREATE权限(如有自定义Schema需逐个处理) REVOKE CREATE ON SCHEMA public FROM PUBLIC;
部署完成后,重新授予这些权限:
GRANT CREATE ON DATABASE your_database_name TO PUBLIC; GRANT CREATE ON SCHEMA public TO PUBLIC;
注意:此方案仅限制没有对象所有权的用户,对象所有者仍需通过触发器拦截。
三、应用层临时限制(辅助方案)
如果你的应用有统一的数据库访问层,可以在蓝绿部署期间临时屏蔽所有DDL相关的接口(比如创建表、删除表的功能),从源头阻止DDL请求。这个方案需要应用配合修改,适合有成熟应用架构的场景。
方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| DDL触发器 | 精准拦截、不影响DML、侵入性低、配置简单 | 需超级用户谨慎操作 |
| 权限回收 | 补充拦截对象所有者外的DDL | 无法阻止对象所有者的DDL |
| 应用层限制 | 从源头控制 | 依赖应用修改,灵活性差 |
推荐优先使用DDL触发器方案,配合提前通知用户临时禁用DDL的规则,可以在保证Green环境安全的同时,最小化对业务的影响。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

