পোস্টগ্রিএসকিউএল-এ আমি কীভাবে অস্থায়ীভাবে ট্রিগারগুলি অক্ষম করব?


131

আমি বাল্ক লোডিং ডেটা এবং একটি সারি-সারি ভিত্তিতে তুলনায় সত্যের পরে আরও সস্তায় সমস্ত ট্রিগার পরিবর্তনগুলি পুনরায় গণনা করতে পারি।

পোস্টগ্রিজ এসকিউএল-এ আমি কীভাবে সাময়িকভাবে সমস্ত ট্রিগার অক্ষম করতে পারি?

উত্তর:


163

বিকল্পভাবে, আপনি যদি কেবলমাত্র টেবিলের উপরের নয়, সমস্ত ট্রিগারগুলি অক্ষম করতে চান তবে আপনি ব্যবহার করতে পারেন:

SET session_replication_role = replica;

এটি বর্তমান সেশনের জন্য ট্রিগারগুলি অক্ষম করে।

একই সেশনের জন্য পুনরায় সক্ষম করতে:

SET session_replication_role = DEFAULT;

সূত্র: http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/


2
অসাধারণ. আমার গণ-বিলোপটি 30 মিনিট থেকে <1 সেকেন্ড :)
ড্যান লেন্সকি

7
এছাড়া কুশলী যে এই কমান্ড না অক্ষম বাধ্যতা ট্রিগার নেই
Bartolo-otrit

2
আমি আমার পরীক্ষার পরিবেশে "বিদেশী কী বাধা লঙ্ঘন" ত্রুটিটি বাইপাস করার উপায়ের জন্য ব্যর্থ হয়ে তাকিয়ে শেষ আধ ঘন্টা ব্যয় করেছি এবং এটি ঠিক এটিই!
অমলগোভিনাস

এক সতর্কীকরণ: অনুযায়ী রানটাইম কনফিগ ডক্স এবং ALTER টেবিল ডক্স এই স্বাভাবিক ট্রিগার কিন্তু যাদের সেট সঙ্গে কাজ করবে ENABLE REPLICAবা ENABLE ALWAYS
বেলডাজ

আমি চালু আছি 10.4এবং মনে হচ্ছে এটি উপরের বিবৃতিটিকে উপেক্ষা করবে।
স্টিফেন

129

PostgreSQL ALTER TABLE tblname DISABLE TRIGGER USERকমান্ডটি জানে , যা আমার যা প্রয়োজন তা মনে করে। বিকল্প টেবিল দেখুন ।


এবং তারপরে আপনি কীভাবে "সমস্ত ট্রিগার পরিবর্তনগুলি পুনরায় গণনা করবেন"?
ওয়াজটেক ক্রুসজেউস্কি

15
একযোগে লোড সহ সতর্কতা: ALTER TABLE ... DISABLE TRIGGER USERটেবিলে একচেটিয়া লক প্রয়োজন।
এরউইন ব্র্যান্ডসেটেটার

3
@ ওয়াজটেক ক্রুজেজেউস্কি, আমি মনে করি যে ডেভিডের অর্থ হ'ল তিনি ট্রিগার দ্বারা যে পরিবর্তনগুলি ম্যানুয়ালি করেছিলেন তা পূর্বে কিছু জ্ঞান ব্যবহার করে পুনরায় গণনা করতে পারবেন (উদাহরণস্বরূপ, যদি ট্রিগার প্রতিটি সারিতে একই পরিবর্তন করে, যা আরও দক্ষতার সাথে হতে পারে) একক আপডেট দ্বারা পরিচালিত)। আমি মনে করি না যে তিনি বোঝাতে চেয়েছিলেন যে আপনি প্রতিটি পরিস্থিতিতে এটি করতে পারেন।
রুনি লিলিমেটস

1
সমস্ত ট্রিগার অক্ষম করার জন্য @ জাইজফের সমাধান আরও ভাল।
টোমাস

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; 

এটি আমার লিনাক্স মেশিনে পোস্টগ্রেএসকিউএল 9.4 এর সাথে কাজ করে না যদি আমি পিজএডমিনে টেবিল সম্পাদকের মাধ্যমে কোনও টেবিল পরিবর্তন করি এবং আমি যদি সাধারণ কোয়েরির মাধ্যমে টেবিল পরিবর্তন করি তবে তা কাজ করে। Pg_trigger টেবিলের ম্যানুয়াল পরিবর্তনগুলি সার্ভার পুনরায় আরম্ভ না করেও ডাইনামিক ক্যোয়ারির মতো postgresql.nabble.com এ কাজ করে না / ডেটাবাসের সমস্ত ট্রিগারগুলি অক্ষম / অক্ষম করে। আপনার কিছু টিউন করার প্রয়োজন হলে এটি কার্যকর হতে পারে।

উদাহরণস্বরূপ, যদি আপনার কোনও নির্দিষ্ট নেমস্পেসে টেবিল থাকে তবে তা হতে পারে:

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;

সিস্টেম ক্যাটালগগুলির জন্য পোস্টগ্রিএসকিউএল ডকুমেন্টেশন


ট্রিগার ফায়ারিং প্রক্রিয়ার আরও একটি নিয়ন্ত্রণ বিকল্প রয়েছে:

টেবিল পরিবর্তন করুন ... রেপ্লিকা ট্রিগার সক্ষম করুন ... - ট্রিগার কেবল রেপ্লিকা মোডে গুলি চালাবে।

টেবিল পরিবর্তন করুন ... সর্বদা ট্রিগার সক্ষম করুন ... - ট্রিগার সর্বদা চালিত হবে (স্পষ্টতই)


7

আপনি পিজএডমিন (তৃতীয়) এ ট্রিগারগুলি অক্ষম করতে পারেন:

  1. আপনার টেবিলটি সন্ধান করুন
  2. + প্রসারিত করুন
  3. ট্রিগারগুলিতে আপনার ট্রিগারটি সন্ধান করুন
  4. ডান-ক্লিক করুন, "ট্রিগার সক্ষম হয়েছে?"

4
SET session_replication_role = replica;  

পোস্টগ্রিস 9.1 এ আমার জন্য নিরব কাজও। আমি বার্টোলো-ওত্রিট দ্বারা বর্ণিত দুটি ফাংশনটি কিছু সংশোধন করে ব্যবহার করি। এটি আমার পক্ষে কাজ করার জন্য আমি প্রথম ফাংশনটি সংশোধন করেছি কারণ টেবিলটি সঠিকভাবে সনাক্ত করতে নামপঞ্জি বা স্কিমা উপস্থিত থাকতে হবে। নতুন কোডটি হ'ল:

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');
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.