আমি বাল্ক লোডিং ডেটা এবং একটি সারি-সারি ভিত্তিতে তুলনায় সত্যের পরে আরও সস্তায় সমস্ত ট্রিগার পরিবর্তনগুলি পুনরায় গণনা করতে পারি।
পোস্টগ্রিজ এসকিউএল-এ আমি কীভাবে সাময়িকভাবে সমস্ত ট্রিগার অক্ষম করতে পারি?
আমি বাল্ক লোডিং ডেটা এবং একটি সারি-সারি ভিত্তিতে তুলনায় সত্যের পরে আরও সস্তায় সমস্ত ট্রিগার পরিবর্তনগুলি পুনরায় গণনা করতে পারি।
পোস্টগ্রিজ এসকিউএল-এ আমি কীভাবে সাময়িকভাবে সমস্ত ট্রিগার অক্ষম করতে পারি?
উত্তর:
বিকল্পভাবে, আপনি যদি কেবলমাত্র টেবিলের উপরের নয়, সমস্ত ট্রিগারগুলি অক্ষম করতে চান তবে আপনি ব্যবহার করতে পারেন:
SET session_replication_role = replica;
এটি বর্তমান সেশনের জন্য ট্রিগারগুলি অক্ষম করে।
একই সেশনের জন্য পুনরায় সক্ষম করতে:
SET session_replication_role = DEFAULT;
সূত্র: http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/
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;
এটি আমার লিনাক্স মেশিনে পোস্টগ্রেএসকিউএল 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;
সিস্টেম ক্যাটালগগুলির জন্য পোস্টগ্রিএসকিউএল ডকুমেন্টেশন
ট্রিগার ফায়ারিং প্রক্রিয়ার আরও একটি নিয়ন্ত্রণ বিকল্প রয়েছে:
টেবিল পরিবর্তন করুন ... রেপ্লিকা ট্রিগার সক্ষম করুন ... - ট্রিগার কেবল রেপ্লিকা মোডে গুলি চালাবে।
টেবিল পরিবর্তন করুন ... সর্বদা ট্রিগার সক্ষম করুন ... - ট্রিগার সর্বদা চালিত হবে (স্পষ্টতই)
আপনি পিজএডমিন (তৃতীয়) এ ট্রিগারগুলি অক্ষম করতে পারেন:
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');