pg_strict

防止不带WHERE条件的危险UPDATE和DELETE操作

概览

扩展包名版本分类许可证语言
pg_strict1.0.5ADMINMITRust
ID扩展名BinLibLoadCreateTrustReloc模式
5830pg_strict-
相关扩展safeupdate pg_savior pg_upless pg_drop_events pg_readonly table_log pgaudit pg_permissions

manually upgraded PGRX from 0.16.1 to 0.17.0 by Vonng

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.0.51817161514pg_strict-
RPMPIGSTY1.0.51817161514pg_strict_$v-
DEBPIGSTY1.0.51817161514postgresql-$v-pg-strict-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
PIGSTY 1.0.5
PIGSTY 1.0.5
PIGSTY 1.0.5
PIGSTY 1.0.5
PIGSTY 1.0.5
u22.x86_64
PIGSTY 1.0.5
PIGSTY 1.0.5
PIGSTY 1.0.5
PIGSTY 1.0.5
PIGSTY 1.0.5
u22.aarch64
PIGSTY 1.0.5
PIGSTY 1.0.5
PIGSTY 1.0.5
PIGSTY 1.0.5
PIGSTY 1.0.5
u24.x86_64
PIGSTY 1.0.5
PIGSTY 1.0.5
PIGSTY 1.0.5
PIGSTY 1.0.5
PIGSTY 1.0.5
u24.aarch64
PIGSTY 1.0.5
PIGSTY 1.0.5
PIGSTY 1.0.5
PIGSTY 1.0.5
PIGSTY 1.0.5
u26.x86_64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
u26.aarch64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS

构建

您可以使用 pig build 命令构建 pg_strict 扩展的 RPM / DEB 包:

pig build pkg pg_strict         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_strict 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_strict;          # 当前活跃 PG 版本安装
pig ext install -y pg_strict -v 18  # PG 18
pig ext install -y pg_strict -v 17  # PG 17
pig ext install -y pg_strict -v 16  # PG 16
pig ext install -y pg_strict -v 15  # PG 15
pig ext install -y pg_strict -v 14  # PG 14
dnf install -y pg_strict_18       # PG 18
dnf install -y pg_strict_17       # PG 17
dnf install -y pg_strict_16       # PG 16
dnf install -y pg_strict_15       # PG 15
dnf install -y pg_strict_14       # PG 14
apt install -y postgresql-18-pg-strict   # PG 18
apt install -y postgresql-17-pg-strict   # PG 17
apt install -y postgresql-16-pg-strict   # PG 16
apt install -y postgresql-15-pg-strict   # PG 15
apt install -y postgresql-14-pg-strict   # PG 14

预加载配置

shared_preload_libraries = 'pg_strict';

创建扩展

CREATE EXTENSION pg_strict;

用法

来源:READMERelease v1.0.5API source

pg_strict 会阻止或警告缺少 WHERE 子句的 UPDATEDELETE 语句。它通过 post_parse_analyze_hook 工作,因此必须从 shared_preload_libraries 加载。

所需设置

-- postgresql.conf
shared_preload_libraries = 'pg_strict'

CREATE EXTENSION pg_strict;

GUCs

  • pg_strict.require_where_on_update
  • pg_strict.require_where_on_delete

每个设置都支持 offwarnon

SET pg_strict.require_where_on_update = 'on';
SET pg_strict.require_where_on_delete = 'warn';

辅助函数

SELECT pg_strict_version();
SELECT * FROM pg_strict_config();

SELECT pg_strict_check_where_clause('DELETE FROM t', 'DELETE');
SELECT pg_strict_validate_update('UPDATE t SET x = 1 WHERE id = 42');
SELECT pg_strict_validate_delete('DELETE FROM t WHERE id = 42');

SELECT pg_strict_enable_update();
SELECT pg_strict_warn_delete();
SELECT pg_strict_disable_delete();
  • pg_strict_set_update_mode(mode)pg_strict_set_delete_mode(mode) 提供通用模式设置器。
  • SET LOCAL 可用于事务中的一次性 bulk operation。

注意事项

  • 它检查的是 WHERE 的存在性,而不是语义意图:任何非空 WHERE 子句都会满足规则。
  • 仅检查 UPDATEDELETE
  • 当前上游版本是 1.0.5;Pigsty 关于 pgrx 0.17.0 的说明属于打包或构建元数据,不是文档化的用户功能变化。