加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL忘记输入where条件update更新整张表的解决办法

发布时间:2020-12-13 17:15:09 所属栏目:百科 来源:网络整理
导读:虽然出现这个错误很挫,但有时候还是会被你或者你的同事碰到。为了避免这个错误,PostgreSQL数据库中可以通过触发器来解决,这里用的是plpgsql 。 1、修改postgresql.conf配置 增加:custom_variable_classes = 'limits' 重新加载:pg_ctl reload 2、创建触

虽然出现这个错误很挫,但有时候还是会被你或者你的同事碰到。为了避免这个错误,PostgreSQL数据库中可以通过触发器来解决,这里用的是plpgsql 。

1、修改postgresql.conf配置

增加:custom_variable_classes = 'limits'
重新加载:pg_ctl reload

2、创建触发器函数

CREATEORREPLACEFUNCTIONzero_counter()
RETURNSTRIGGER
LANGUAGEplpgsql
AS
$BODY$
DECLARE
BEGIN
PERFORMset_config('limits.test','0',true);
IFTG_OP='UPDATE'THEN
RETURNNEW;
ENDIF;
RETURNOLD;
END;
$BODY$;
CREATEORREPLACEFUNCTIONlimit_modifications()
RETURNSTRIGGER
LANGUAGEplpgsql
AS
$BODY$
DECLARE
iINT4;
BEGIN
i:=current_setting('limits.test')::INT4+1;
PERFORMset_config('limits.test',i::TEXT,true);
IFi>5000THEN
RAISEEXCEPTION'%ofmorethan5000rowisforbidden.',TG_OP;
ENDIF;
IFTG_OP='UPDATE'THEN
RETURNNEW;
ENDIF;
RETURNOLD;
END;
$BODY$;

3、测试

forummon=#createtabletestasselectiasid,'passwordfor:'||iaspassfromgenerate_series(1,10000)i;
forummon=#CREATETRIGGERzero_counterBEFOREUPDATEORDELETEONtestFOREACHSTATEMENTEXECUTEPROCEDUREzero_counter();
CREATETRIGGER
forummon=#CREATETRIGGERlimit_modificationsBEFOREUPDATEORDELETEONtestFOREACHROWEXECUTEPROCEDURElimit_modifications();
CREATETRIGGER
forummon=#d+test
Table"public.test"
Column|Type|Modifiers|Storage|Statstarget|Description
--------+---------+-----------+----------+--------------+-------------
id|integer||plain||
pass|text||extended||
Triggers:
limit_modificationsBEFOREDELETEORUPDATEONtestFOREACHROWEXECUTEPROCEDURElimit_modifications()
zero_counterBEFOREDELETEORUPDATEONtestFOREACHSTATEMENTEXECUTEPROCEDUREzero_counter()
HasOIDs:no
forummon=#updatetestsetpass='qq'whereid<5003;
ERROR:UPDATEofmorethan5000rowisforbidden.
forummon=#updatetestsetpass='qq'whereid<5000;
UPDATE4999
forummon=#droptabletest;
DROPTABLE

总结

批量操作的数量限制可以在limit_modifications中修改,切记在update不确定时先select再update。

参考连接:http://www.depesz.com/2007/07/27/update-account-set-password-new_password-oops/

原文地址:http://www.sijitao.net/1996.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读