EDB/开源Postgres中ALTER SESSION SET CONSTRAINTS=DEFERRED等效语句
ALTER SESSION SET CONSTRAINTS = DEFERRED是Oracle生态的常用语法,作用是将当前会话内所有标记为DEFERRABLE(可延迟)的约束,检查时机从单条DML执行后立即校验,改为事务提交时统一校验。该语句在两类PostgreSQL数据库中的实现方式如下:
EDB Postgres 内置了完整的Oracle语法兼容层,直接原生支持原语句写法,执行逻辑和Oracle完全一致:设置生效后,当前会话后续所有事务内的可延迟约束,默认都会采用提交时检查的策略,无需每个事务重复配置。
直接执行原语句即可:
ALTER SESSION SET CONSTRAINTS = DEFERRED;
开源PostgreSQL没有提供会话级别的全局约束延迟配置语法,原生SET CONSTRAINTS命令的作用域仅为当前事务,事务提交或回滚后设置会自动失效。
要实现和原语句等效的效果,需要在每个事务的起始位置执行如下命令:
SET CONSTRAINTS ALL DEFERRED;
执行后当前事务内所有可延迟约束,都会在事务提交时统一校验,和Oracle原语句单事务内的行为完全一致。
如果需要实现会话层面自动生效的效果,可以通过连接层配置实现:比如在数据库连接建立的初始化回调中自动执行该命令,或者为业务使用的数据库账号配置对应事件触发器,在事务启动时自动执行该设置。开源PostgreSQL本身没有内置可直接持久化该配置的会话级参数。
注意:无论在EDB Postgres还是开源PostgreSQL中,只有创建约束时明确指定了DEFERRABLE属性的约束(含外键、唯一约束、检查约束等)才会受延迟设置影响;默认创建的NOT DEFERRABLE约束会始终在单条DML执行后立即校验,无法被延迟。
内容的提问来源于stack exchange,提问作者MD NASEEM

