मैं कुछ इस तरह बना लिया है:
begin;
create table test (
id integer
);
insert into test(id) select generate_series(1,100);
create or replace function trg_check_max_4_updated_records()
returns trigger as $$
declare
counter_ integer := 0;
tablename_ text := 'temptable';
begin
raise notice 'trigger fired';
select count(42) into counter_
from pg_catalog.pg_tables where tablename = tablename_;
if counter_ = 0 then
raise notice 'Creating table %', tablename_;
execute 'create temporary table ' || tablename_ || ' (counter integer) on commit drop';
execute 'insert into ' || tablename_ || ' (counter) values(1)';
execute 'select counter from ' || tablename_ into counter_;
raise notice 'Actual value for counter= [%]', counter_;
else
execute 'select counter from ' || tablename_ into counter_;
execute 'update ' || tablename_ || ' set counter = counter + 1';
raise notice 'updating';
execute 'select counter from ' || tablename_ into counter_;
raise notice 'Actual value for counter= [%]', counter_;
if counter_ > 4 then
raise exception 'Cannot change more than 4 rows in one trancation';
end if;
end if;
return new;
end; $$ language plpgsql;
create trigger trg_bu_test before
update on test
for each row
execute procedure trg_check_max_4_updated_records();
update test set id = 10 where id <= 1;
update test set id = 10 where id <= 2;
update test set id = 10 where id <= 3;
update test set id = 10 where id <= 4;
update test set id = 10 where id <= 5;
rollback;
मुख्य विचार पर एक ट्रिगर है कि बनाता है (यदि आवश्यक हो) 'प्रत्येक पंक्ति के लिए अद्यतन करने से पहले' अस्थायी तालिका (है कि कम से हटा दिया गया है लेनदेन का अंत)। इस तालिका में एक मूल्य के साथ केवल एक पंक्ति है, यह वर्तमान लेनदेन में अद्यतन पंक्तियों की संख्या है। प्रत्येक अद्यतन के लिए मूल्य बढ़ता है। यदि मान 4 से बड़ा है, तो लेनदेन बंद कर दिया गया है।
लेकिन मुझे लगता है कि यह आपकी समस्या का गलत समाधान है। ऐसी गलत क्वेरी को चलाने में कोई समस्या है जिसे आपने दो बार लिखा है, इसलिए आपके पास 8 पंक्तियां बदली जाएंगी। पंक्तियों को हटाने या उन्हें छेड़छाड़ करने के बारे में क्या?
स्रोत
2010-04-01 20:51:40
यदि सामान्य पंक्तियों की तुलना में प्रभावित पंक्तियां अधिक से अधिक हैं, तो मुझे सामान्य क्वेरी + रोलबैक का उपयोग करने पर विचार किया जाता है, और ऐसा लगता है कि यह सबसे अच्छा मूल्य है। ठीक है 99% + में अच्छी पूछताछ होगी (4 अद्यतन पंक्तियां अधिकतम) लेकिन यह सिस्टम के लिए केवल अतिरिक्त सुरक्षा है। इस 'समस्या' वाली तालिका प्रणाली के लिए काफी बड़ी और महत्वपूर्ण है, इसलिए इस तरह की गलत क्वेरी के बाद इसे पुनर्स्थापित करना हर किसी के लिए दर्दनाक हो सकता है। उत्तर के लिए सभी को धन्यवाद। पता नहीं कौन सा स्वीकार करना है क्योंकि उनमें से सभी सहायक जहां :) – sbczk
आप ऐसा क्यों करना चाहते हैं? हो सकता है कि ऐसी अजीब क्वेरी से ऐसा करने का कोई आसान तरीका हो। और क्या है ... तालिका बढ़ने के दौरान गिनती (यदि संभव हो) का उपयोग धीमा हो जाएगा। –
तो आपको लगता है कि जब आपके पास अधिकतम 4 पंक्तियां बदलती हैं तो क्वेरी को गलत टाइप नहीं किया जा सकता है? यह किसी तरह की झूठी सुरक्षा भावना की तरह लगता है। –