যদি আপডেট ক্যাসকেডের সাথে কোনও এফকে বাধার কারণে অপারেশনটি ঘটে তবে প্রায় প্রতিটি স্টেটেমেন্ট ট্রিগার কার্যকর করতে পারে?


11

আমি বুঝতে পারি যে সংজ্ঞায়িত টেবিল টিতে একটি ট্রিগার FOR EACH STATEMENTএকবার চালানো হবে যখন আমি কোনটিকে সম্পাদন করি UPDATE t ...

এখন, যখন tসংজ্ঞায়িত করা হয় FOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADE, এবং আমি এন সারিগুলিকে আপডেট করি তখন কি ট্রিগারটি aএকবার, বা এন বার বলা হবে?

অন্যভাবে বলতে গেলে, কোনও এফকে বাধা দিয়ে টেবিলের পরিবর্তনগুলি কি আরও বেশি একক UPDATE, বা আরও UPDATEঅনেকগুলি সিরিজের মতো হয় ?


4
আপনি একটি পরীক্ষা কেস তৈরি করতে পারে! ট্রিগারটির শরীরে অন্য একটি টেবিল sertোকান এবং দেখুন যে আপনি কত সারি পেয়েছেন। তারপরে এটিকে নিজের প্রশ্নের উত্তরে এটি লিখুন (এটি অনুমোদিত, এমনকি উত্সাহিত)!
কলিন 't হার্ট

2
শীর্ষস্থানীয় বাক্যটি উল্লেখ FOR EACH STATEMENTকরা বাকী অংশের অর্থেগোনাল। এফকে সীমাবদ্ধতাগুলি বিশেষ ট্রিগার সহ প্রয়োগ করা হয় FOR EACH ROW
এরউইন ব্র্যান্ডস্টেটার

1
@ ইরউইন "" প্রতিটি রো এর জন্য "বা" প্রতি রো এর জন্য "?
ypercubeᵀᴹ

@ টাইপারকিউব: আমি বিশদ সহ একটি উত্তর যুক্ত করেছি।
এরউইন ব্র্যান্ডস্টেটার

উত্তর:


6

বিদেশী মূল সীমাবদ্ধতাগুলি বর্তমানে বিশেষ অভ্যন্তরীণ ট্রিগারগুলির সাথে প্রয়োগ করা হয়। তাদের সব চালানো হয় FOR EACH ROW

নোট করুন যে এগুলি বাস্তবায়নের বিশদ যা পরিবর্তন করতে পারে, তাই এর উপর নির্ভর করবেন না। তবে কয়েকটি বড় সংস্করণে বেসিকগুলি পরিবর্তন হয়নি, তাই বড় পরিবর্তনগুলি অসম্ভব।

আমি থেকে একটি সহজ এফ কে বাধ্যতা সঙ্গে একটি দ্রুত পরীক্ষা দৌড়ে tblকরার tbltypeFOR EACH ROWপৃষ্ঠা 9.4 তে আমার পরীক্ষায় চারটি সাধারণ অভ্যন্তরীণ ট্রিগার সহ একটি সাধারণ এফকে বাস্তবায়ন করা হয় ।
কীভাবে তদন্ত করতে হবে তা সম্পর্কে এখানে একটি দ্রুত গতি রোধ করা হচ্ছে:

SELECT oid  -- 74791
FROM   pg_constraint
WHERE  conrelid = 'tbl'::regclass
AND    contype = 'f';

SELECT objid, classid::regclass  -- 74792,74793,74794,74795 / 'pg_trigger'
FROM   pg_depend
WHERE  refobjid = 74791
AND   deptype = 'i'

SELECT tgrelid::regclass, tgname, tgfoid, tgtype FROM pg_trigger
WHERE  oid IN (74792,74793,74794,74795) ORDER BY tgfoid;

'tbl'    ;'RI_ConstraintTrigger_c_74794';1644;5
'tbl'    ;'RI_ConstraintTrigger_c_74795';1645;17
'tbltype';'RI_ConstraintTrigger_a_74792';1654;9
'tbltype';'RI_ConstraintTrigger_a_74793';1655;17

SELECT oid, proname FROM pg_proc
WHERE oid IN (1654,1655,1644,1645);

1644;'RI_FKey_check_ins'
1645;'RI_FKey_check_upd'
1654;'RI_FKey_noaction_del'
1655;'RI_FKey_noaction_upd'

দুটি অভ্যন্তরীণ "কৌতুক" চালু করে tbltype
দুটি অভ্যন্তরীণ "চেক" চালু করে tbl। বিজোড় সংখ্যা দ্বারা ইঙ্গিত হিসাবে
এগুলি সমস্ত চালিত FOR EACH ROWহয় tgtype

পোস্টগ্রিসের 2 বাইটগুলি সি উত্স কোডে tgtype smallintএকটি উপস্থাপন করে int16যেখানে সর্বনিম্ন উল্লেখযোগ্য বিট এনকোড হয় TRIGGER_TYPE_ROW। বিস্তারিত ব্যাখ্যা এখানে:

আপনি সহজেই অভিন্ন ট্রিগার যেখানে আপনি শুধুমাত্র পরিবর্তন একজোড়া সঙ্গে এই পরীক্ষা করতে পারেন FOR ROW/ STATEMENT...


5

এটি এন বার কার্যকর করে এবং এটি দেখার সহজতম উপায় হ'ল একটি চাপ দেওয়া EXPLAIN ANALYZEঅর্থাত্ বিবৃতিটি কার্যকর করা

EXPLAIN ANALYZE UPDATE a SET col = 1 WHERE othercol = 'foo';

এটি আপনাকে এর অনুরূপ তথ্য দেবে:

Trigger for constraint t_col_fk on a: time=1.300 calls=9

(9.2 দিয়ে পরীক্ষিত)


1
এটা আমার কাছে কিছুটা অবাক করে দিয়েছে। একই ফলাফলের সাথে 9.4 এ পরীক্ষিত।
dezso
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.