পোস্টগ্রিস টেবিলে প্রতিটি রেকর্ডের জন্য ট্রিগার চালানোর কোনও ভাল উপায় আছে কি?


22

আমার এমন একটি সিস্টেম রয়েছে যেখানে আমি কয়েকটি সারণির নকশাকে নিয়ন্ত্রণ করতে পারি না (স্লনি -১ এর মাধ্যমে প্রতিলিপিযুক্ত) এবং তাই আমার 'শ্যাডো টেবিল' হিসাবে আমরা যা উল্লেখ করি তার একটি সিরিজ রয়েছে, যেখানে আমি প্রতিলিপিযুক্ত টেবিলগুলি থেকে কিছু তথ্য বের করি where , এবং আমার যে প্রক্রিয়াকরণ ফর্মটি প্রয়োজন তা সংরক্ষণ করুন, আমি যে রেকর্ডগুলি উপেক্ষা করতে চাইছি তা বের করার সময়।

এই মুহুর্তে, একটি নতুন প্রতিলিপি স্থাপন করার পরে, আমি একটি আপডেট চালিয়েছি এবং ট্রিগারটি চালিত UPDATE tablename SET field=fieldকরতে বাধ্য করার জন্য নিজেই একটি মান (যেমন, ) সেট করে রেখেছি , তবে কয়েকটি সারণী কয়েক মিলিয়ন রেকর্ড, এবং বাড়ছে, এবং এটি 30 মিনিট সময় নিতে পারে । (এবং তারপরে ভ্যাকুয়ামও রয়েছে)।

এটির ট্রিগার করার আরও ভাল কোনও উপায় আছে, বা কোনও ফাংশন লেখার জন্য এমন কোনও উপায় রয়েছে যা এটি কোনও ইনপুট দিয়ে গেছে বা NEWকলিং প্রসঙ্গে নির্ভর করে? আমি চারদিকে দুটি আলাদা ফাংশন রাখতে নারাজ, কারণ আমি অনেকবার দেখেছি যেখানে একজন আপডেট হয় এবং অন্যটি নয়।


আমি কীভাবে ট্রিগার চালাতে জানতাম ... আমি জিজ্ঞাসা করলাম ভাল উপায় আছে কিনা ?
জো

উত্তর:


19

নিম্নলিখিত টেমপ্লেট ব্যবহার করে এটি করা যেতে পারে:

CREATE TABLE tablename ( ... );

/* for direct invocation */
CREATE FUNCTION propagate_data(newrow tablename) RETURNS void
LANGUAGE plpgsql
AS $$
BEGIN
    INSERT INTO other_table VALUES (newrow.a, newrow.b, ...);
END:
$$;

/* trigger function wrapper */
CREATE FUNCTION propagate_data_trg() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
    PERFORM propagate_data(NEW);
END;
$$;

CREATE TRIGGER propagate_data AFTER INSERT ON tablename FOR EACH ROW
    EXECUTE PROCEDURE propagate_data_trg();

দোহ ... আমি পিছন দিকে এটি সম্পর্কে ভাবছিলাম (কোনও পদ্ধতি দ্বারা ট্রিগার ফাংশনকে কল করার জন্য চেষ্টা করা হয়েছিল, ভিসা-বিপরীতে নয়)।
জো

1
আমি যখন আসলে এটি করেছি তখন বুঝতে পেরেছিলাম যে 'সারি' একটি সংরক্ষিত শব্দ, তাই আমি উদাহরণটি সংশোধন করেছি যাতে অন্যরা দীর্ঘক্ষণ ডিবাগ করতে না পারে।
জো

1
আমার সত্যিই কয়েক বছর আগে অনুসরণ করা উচিত ছিল। আমার সিস্টেমে সমস্ত কিছু কাজ করার জন্য পরিচালিত হওয়ার আগে আমার কিছুটা সময় লেগেছে ... এবং এই পদ্ধতিটি কাজ করে, তবে অভিনয়টি godশ্বরকে ভয়ঙ্কর করেছিল। (এটি শেষ হতে 30 মিনিট থেকে এক দিনের বেশি হয়েছে)।
জো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.