मैं PostgreSQL में अस्थायी रूप से ट्रिगर को कैसे अक्षम करूं?


131

मैं बल्क लोडिंग डेटा हूं और एक पंक्ति-दर-पंक्ति आधार पर तथ्य के बाद सभी ट्रिगर संशोधनों को बहुत सस्ते में फिर से गणना कर सकता हूं।

मैं PostgreSQL में सभी ट्रिगर को अस्थायी रूप से कैसे अक्षम कर सकता हूं?

जवाबों:


163

वैकल्पिक रूप से, यदि आप सभी ट्रिगर को अक्षम करना चाहते हैं, न कि केवल USER टेबल पर, आप उपयोग कर सकते हैं:

SET session_replication_role = replica;

यह वर्तमान सत्र के लिए ट्रिगर अक्षम करता है।

उसी सत्र के लिए फिर से सक्षम करने के लिए:

SET session_replication_role = DEFAULT;

स्रोत: http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporately/


2
बहुत बढ़िया। मेरा द्रव्यमान-विलोपन 30 मिनट से <1 सेकंड में चला गया :)
डैन लेन्स्की

7
यह भी आसान है कि यह कमांड
कॉन्स्टेंट

2
मैंने अपने परीक्षण के माहौल में "विदेशी प्रमुख बाधाओं का उल्लंघन" त्रुटि को बायपास करने के तरीके के लिए व्यर्थ की तलाश में पिछले आधे घंटे का समय बिताया है, और यह बिल्कुल यही है!
अमलगोविनस

एक चेतावनी: रनटाइम कॉन्फ़िग डॉक्स और अलर्ट टेबल डॉक्स के अनुसार, यह सामान्य ट्रिगर्स के साथ काम करेगा, लेकिन उन लोगों के साथ ENABLE REPLICAया जिनके साथ सेट नहीं है ENABLE ALWAYS
बेलाजज

मैं चालू हूं 10.4और यह उपरोक्त कथन की उपेक्षा करता है।
स्टीफन

129

PostgreSQL ALTER TABLE tblname DISABLE TRIGGER USERकमांड को जानता है , जो मुझे वह करने की आवश्यकता है जो लगता है। अन्य तालिका देखें ।


और फिर आप "सभी ट्रिगर संशोधनों की फिर से गणना" कैसे करते हैं?
वोजटेक क्रुज़ेव्स्की

15
समवर्ती भार के साथ सावधान: ALTER TABLE ... DISABLE TRIGGER USERमेज पर एक विशेष लॉक की आवश्यकता होती है।
इरविन ब्रान्डेसटेटर २ '

3
@WojtekKruszewski, मुझे लगता है कि डेविड का मतलब था कि वह मैन्युअल रूप से उन परिवर्तनों की गणना कर सकता है जो ट्रिगर द्वारा किए गए होंगे, कुछ पूर्व ज्ञान का उपयोग करके (उदाहरण के लिए, यदि ट्रिगर हर पंक्ति में एक ही बदलाव करेगा, जो अधिक कुशलता से हो सकता है एक एकल अद्यतन द्वारा नियंत्रित)। मुझे नहीं लगता कि उनका मतलब था कि आप हर स्थिति में ऐसा कर सकते हैं।
रौनी लिलेमेट्स

1
@ zyzof का समाधान सभी ट्रिगर को अक्षम करने के लिए बेहतर है।
उत्थमास

48

अक्षम ट्रिगर के लिए

ALTER TABLE table_name DISABLE TRIGGER trigger_name

सक्षम ट्रिगर के लिए

ALTER TABLE table_name ENABLE TRIGGER trigger_name

1
आप इसके लिए "सभी" का भी उपयोग कर सकते हैं:ALTER TABLE table_name DISABLE TRIGGER all
डेनिसनोवेक

8
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 प्रलेखन


ट्रिगर फायरिंग प्रक्रिया के अन्य नियंत्रण विकल्प हैं:

पहले से ही पढ़ें ... सक्षम प्रतिनिधि ... - ट्रिगर केवल प्रतिकृति मोड में आग लग जाएगी।

हमेशा के लिए ... सक्षम हमेशा ... ... ट्रिगर हमेशा (जाहिर है) आग जाएगा


7

आप ट्रिगर को pgAdmin (III) में भी अक्षम कर सकते हैं:

  1. अपनी तालिका खोजें
  2. + का विस्तार करें
  3. ट्रिगर में अपना ट्रिगर खोजें
  4. राइट-क्लिक करें, "ट्रिगर सक्षम" को अनचेक करें

4
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');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.