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' 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |