मैं बल्क लोडिंग डेटा हूं और एक पंक्ति-दर-पंक्ति आधार पर तथ्य के बाद सभी ट्रिगर संशोधनों को बहुत सस्ते में फिर से गणना कर सकता हूं।
मैं PostgreSQL में सभी ट्रिगर को अस्थायी रूप से कैसे अक्षम कर सकता हूं?
मैं बल्क लोडिंग डेटा हूं और एक पंक्ति-दर-पंक्ति आधार पर तथ्य के बाद सभी ट्रिगर संशोधनों को बहुत सस्ते में फिर से गणना कर सकता हूं।
मैं PostgreSQL में सभी ट्रिगर को अस्थायी रूप से कैसे अक्षम कर सकता हूं?
जवाबों:
वैकल्पिक रूप से, यदि आप सभी ट्रिगर को अक्षम करना चाहते हैं, न कि केवल USER टेबल पर, आप उपयोग कर सकते हैं:
SET session_replication_role = replica;
यह वर्तमान सत्र के लिए ट्रिगर अक्षम करता है।
उसी सत्र के लिए फिर से सक्षम करने के लिए:
SET session_replication_role = DEFAULT;
स्रोत: http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporately/
ENABLE REPLICA
या जिनके साथ सेट नहीं है ENABLE ALWAYS
।
10.4
और यह उपरोक्त कथन की उपेक्षा करता है।
PostgreSQL ALTER TABLE tblname DISABLE TRIGGER USER
कमांड को जानता है , जो मुझे वह करने की आवश्यकता है जो लगता है। अन्य तालिका देखें ।
ALTER TABLE ... DISABLE TRIGGER USER
मेज पर एक विशेष लॉक की आवश्यकता होती है।
अक्षम ट्रिगर के लिए
ALTER TABLE table_name DISABLE TRIGGER trigger_name
सक्षम ट्रिगर के लिए
ALTER TABLE table_name ENABLE TRIGGER trigger_name
ALTER TABLE table_name DISABLE TRIGGER all
SET session_replication_role = replica;
यह मेरे लिनक्स मशीन पर PostgreSQL 9.4 के साथ काम नहीं करता है अगर मैं pgAdmin में टेबल एडिटर के माध्यम से एक टेबल बदलता हूं और साधारण क्वेरी के माध्यम से टेबल बदलता हूं तो काम करता है। Pg_trigger तालिका में मैन्युअल परिवर्तन भी सर्वर पुनरारंभ के बिना काम नहीं करते हैं, लेकिन गतिशील क्वेरी जैसे कि postgresql.nabble.com पर सक्षम / DATABASE में सभी TRIGGERS काम करता है। यह उपयोगी हो सकता है जब आपको कुछ ट्यूनिंग की आवश्यकता होती है।
उदाहरण के लिए यदि आपके पास किसी विशेष नामस्थान में टेबल हैं तो यह हो सकता है:
create or replace function disable_triggers(a boolean, nsp character varying) returns void as
$$
declare
act character varying;
r record;
begin
if(a is true) then
act = 'disable';
else
act = 'enable';
end if;
for r in select c.relname from pg_namespace n
join pg_class c on c.relnamespace = n.oid and c.relhastriggers = true
where n.nspname = nsp
loop
execute format('alter table %I %s trigger all', r.relname, act);
end loop;
end;
$$
language plpgsql;
यदि आप कुछ ट्रिगर फ़ंक्शन के साथ सभी ट्रिगर को अक्षम करना चाहते हैं तो यह हो सकता है:
create or replace function disable_trigger_func(a boolean, f character varying) returns void as
$$
declare
act character varying;
r record;
begin
if(a is true) then
act = 'disable';
else
act = 'enable';
end if;
for r in select c.relname from pg_proc p
join pg_trigger t on t.tgfoid = p.oid
join pg_class c on c.oid = t.tgrelid
where p.proname = f
loop
execute format('alter table %I %s trigger all', r.relname, act);
end loop;
end;
$$
language plpgsql;
सिस्टम कैटलॉग के लिए PostgreSQL प्रलेखन
ट्रिगर फायरिंग प्रक्रिया के अन्य नियंत्रण विकल्प हैं:
पहले से ही पढ़ें ... सक्षम प्रतिनिधि ... - ट्रिगर केवल प्रतिकृति मोड में आग लग जाएगी।
हमेशा के लिए ... सक्षम हमेशा ... ... ट्रिगर हमेशा (जाहिर है) आग जाएगा
आप ट्रिगर को pgAdmin (III) में भी अक्षम कर सकते हैं:
SET session_replication_role = replica;
पोस्टग्रैस 9.1 में मेरे लिए भी काम नहीं किया। मैं कुछ संशोधन के साथ bartolo-otrit द्वारा वर्णित दो फ़ंक्शन का उपयोग करता हूं। मैंने इसके लिए काम करने के लिए पहले फ़ंक्शन को संशोधित किया क्योंकि तालिका को सही ढंग से पहचानने के लिए नाम स्थान या स्कीमा मौजूद होना चाहिए। नया कोड है:
CREATE OR REPLACE FUNCTION disable_triggers(a boolean, nsp character varying)
RETURNS void AS
$BODY$
declare
act character varying;
r record;
begin
if(a is true) then
act = 'disable';
else
act = 'enable';
end if;
for r in select c.relname from pg_namespace n
join pg_class c on c.relnamespace = n.oid and c.relhastriggers = true
where n.nspname = nsp
loop
execute format('alter table %I.%I %s trigger all', nsp,r.relname, act);
end loop;
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION disable_triggers(boolean, character varying)
OWNER TO postgres;
तब मैं बस हर स्कीमा के लिए एक चुनिंदा प्रश्न करता हूं:
SELECT disable_triggers(true,'public');
SELECT disable_triggers(true,'Adempiere');