سؤال

وأنا أعمل على النصوص التي تنطبق التحديثات مخطط قاعدة البيانات. لقد الإعداد كل ما عندي من تحديث البرامج النصية SQL باستخدام الصفقة بداية / الالتزام. أمرر هذه البرامج النصية لpsql على سطر الأوامر.

وأنا الآن بحاجة إلى تطبيق نصوص متعددة في نفس الوقت، وفي صفقة واحدة. حتى الآن الحل الوحيد جئت مع هو إزالة الصفقة بداية / الالتزام من المجموعة الأصلية من البرامج النصية، ثم مربى معا داخل معاملة بداية جديدة / الالتزام كتلة. أنا أكتب مخطوطات برل للقيام بذلك على الطاير.

وفعال أريد المعاملات المتداخلة، وهو ما لا يمكن معرفة كيفية القيام في كيو.

هل هناك أي طريقة للقيام أو محاكاة المعاملات المتداخلة لهذا الغرض؟ لدي أشياء الإعداد لإنقاذ تلقائيا على أي خطأ، لذلك أنا لست بحاجة إلى الاستمرار في الصفقة مستوى أعلى إذا كان أي من أقل منها تفشل.

هل كانت مفيدة؟

المحلول

وحسنا لديك إمكانية لاستخدام المعاملات المتداخلة داخل كيو باستخدام SavePoints.

وخذ هذا المثال رمز:

CREATE TABLE t1 (a integer PRIMARY KEY);

CREATE FUNCTION test_exception() RETURNS boolean LANGUAGE plpgsql AS
$$BEGIN
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (2);
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (3);
   RETURN TRUE;
EXCEPTION
   WHEN integrity_constraint_violation THEN
      RAISE NOTICE 'Rollback to savepoint';
      RETURN FALSE;
END;$$;

BEGIN;

SELECT test_exception();
NOTICE:  Rollback to savepoint
 test_exception 
----------------
 f
(1 row)

COMMIT;

SELECT count(*) FROM t1;
 count 
-------
     0
(1 row)

وربما هذا سوف تساعدك على الخروج قليلا.

نصائح أخرى

ولقد انتهى 'حل' مشكلتي خارج النطاق - I استخدام المخطوطة لإعادة عمل البرامج النصية مساهمة في القضاء على المعاملة بدايتهم / الالتزام المكالمات، ثم دفع كل منهم في ملف واحد، والذي يحصل هو نفسه بدء المعاملة / الالتزام.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top