You need to enable JavaScript to run this app.
文档中心
云数据库 PostgreSQL 版

云数据库 PostgreSQL 版

复制全文
下载 pdf
插件
DML 语句安全防护 (safeupdate)
复制全文
下载 pdf
DML 语句安全防护 (safeupdate)
简介​
safeupdate 是一款轻量级的 PostgreSQL 插件,旨在通过强制 UPDATE 和 DELETE 语句必须包含 WHERE 子句来提升数据库操作的安全性。当它检测到可能导致全表数据被意外修改或删除的 DML 语句时,会立即抛出错误并阻止其执行。​
此插件对于那些通过 PostgREST 等 API 网关向外部暴露数据库写入接口的场景尤其有用,能够有效防止因客户端错误或恶意攻击引发的灾难性数据丢失。​
适用场景​
  • 开放的 API 环境:防止通过 RESTful API 发送的请求意外地修改或删除了整张表。​
  • 开发与测试环境:帮助开发者养成良好的 SQL 编写习惯,避免在开发过程中误操作数据。​
  • 多人协作的数据库:为团队提供一个基础的安全防护层,减少人为错误的风险。​
创建与删除插件​
safeupdate 的启用和禁用是通过修改 PostgreSQL 的配置文件 postgresql.conf 中的 shared_preload_libraries 参数来控制的,修改后需要重启数据库服务才能生效。​
创建插件(启用)​
  1. 修改参数 shared_preload_libraries,新增 safeupdate 值。如果已有其他库,请使用逗号分隔。关于修改参数的详细信息,请参见修改参数。​
  1. 重启 PostgreSQL 服务以加载该插件。​
删除插件(禁用)​
  1. 修改参数 shared_preload_libraries,移除 safeupdate 值。​
  1. 重启 PostgreSQL 服务。​
基础使用​
启用插件后,任何不带 WHERE 子句的 UPDATE 或 DELETE 语句都将被拦截。​
  • 不带 WHERE 子句的 UPDATE 语句​
  • ​
    -- 准备一个测试表​
    CREATE TABLE products (id INT, name TEXT);​
    INSERT INTO products VALUES (1, 'Apple'), (2, 'Orange');​
    ​
    -- 尝试执行没有 WHERE 子句的 UPDATE(将被拦截)​
    UPDATE products SET name = 'Banana';​
    ​
  • 返回错误:​
  • ​
    ERROR: UPDATE requires a WHERE clause​
    ​
  • 不带 WHERE 子句的 DELETE 语句​
  • ​
    -- 尝试执行没有 WHERE 子句的 DELETE(将被拦截)​
    DELETE FROM products;​
    ​
  • 返回错误:​
  • ​
    ERROR: DELETE requires a WHERE clause​
    ​
正确的用法​
只有当 UPDATE 和 DELETE 语句包含 WHERE 子句时,才能成功执行。​
​
-- 带有 WHERE 子句的 UPDATE(成功执行)​
UPDATE products SET name = 'Golden Apple' WHERE id = 1;​
-- UPDATE 1​
​
-- 带有 WHERE 子句的 DELETE(成功执行)​
DELETE FROM products WHERE id = 2;​
-- DELETE 1​
​
注意​
safeupdate 的检查非常严格,即便是 WHERE 1=1 这样逻辑上等同于全表操作的条件也会被视为有效并通过检查。因此,它主要用于防止因忘记添加 WHERE 子句而导致的失误,而不是防止逻辑上错误的条件。​
插件参数​
  • safeupdate 的行为可以通过一个 GUC 参数进行运行时控制。​
  • safeupdate.enabled​
  • 作用:控制是否启用插件对 DML 语句的筛选条件强制检查。​
  • 类型:boolean​
  • 默认值:true (ON)​
​
​
最近更新时间:2026.03.31 10:39:12
这个页面对您有帮助吗?
有用
有用
无用
无用