PostgreSQL忘記輸入where條件update更新整張表的解決辦法

雖然出現這個錯誤很挫,但有時候仍是會被你或者你的同事碰到。爲了不這個錯誤,PostgreSQL數據庫中能夠經過觸發器來解決,這裏用的是plpgsql 。html

一、修改postgresql.conf配置

增長:custom_variable_classes = 'limits'
從新加載:pg_ctl reloadweb

二、建立觸發器函數

CREATE OR REPLACE FUNCTION zero_counter()
 RETURNS TRIGGER
 LANGUAGE plpgsql
 AS
$BODY$
DECLARE
BEGIN
 PERFORM set_config('limits.test', '0', true);
 IF TG_OP = 'UPDATE' THEN
 RETURN NEW;
 END IF;
 RETURN OLD;
END;
$BODY$;
CREATE OR REPLACE FUNCTION limit_modifications()
 RETURNS TRIGGER
 LANGUAGE plpgsql
 AS
$BODY$
DECLARE
 i INT4;
BEGIN
 i := current_setting('limits.test')::INT4 + 1;
 PERFORM set_config('limits.test', i::TEXT, true);
 IF i > 5000 THEN
 RAISE EXCEPTION '% of more than 5000 row is forbidden.', TG_OP;
 END IF;
 IF TG_OP = 'UPDATE' THEN
 RETURN NEW;
 END IF;
 RETURN OLD;
END;
$BODY$;

三、測試

forummon=# create table test as select i as id, 'password for: ' || i as pass from generate_series(1,10000) i;
forummon=# CREATE TRIGGER zero_counter BEFORE UPDATE OR DELETE ON test FOR EACH STATEMENT EXECUTE PROCEDURE zero_counter();
CREATE TRIGGER
forummon=# CREATE TRIGGER limit_modifications BEFORE UPDATE OR DELETE ON test FOR EACH ROW EXECUTE PROCEDURE limit_modifications();
CREATE TRIGGER
forummon=# \d+ test 
 Table "public.test"
 Column | Type | Modifiers | Storage | Stats target | Description 
--------+---------+-----------+----------+--------------+-------------
 id | integer | | plain | | 
 pass | text | | extended | | 
Triggers:
 limit_modifications BEFORE DELETE OR UPDATE ON test FOR EACH ROW EXECUTE PROCEDURE limit_modifications()
 zero_counter BEFORE DELETE OR UPDATE ON test FOR EACH STATEMENT EXECUTE PROCEDURE zero_counter()
Has OIDs: no
forummon=# update test set pass = 'qq' where id<5003 ;
ERROR: UPDATE of more than 5000 row is forbidden.
forummon=# update test set pass = 'qq' where id<5000 ;
UPDATE 4999
forummon=# drop table test ;
DROP TABLE

總結

批量操做的數量限制能夠在limit_modifications中修改,切記在update不肯定時先select再update。sql

參考鏈接:http://www.depesz.com/2007/07/27/update-account-set-password-new_password-oops/數據庫

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

相關文章
相關標籤/搜索