You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 03:35:55