سؤال

لدي برنامج يقوم بتحديث مخطط قاعدة البيانات بشكل دوري.في بعض الأحيان، قد تفشل إحدى عبارات DDL، وإذا حدث ذلك، أريد التراجع عن كافة التغييرات.أقوم بلف التحديث في معاملة مثل هذا:

BEGIN TRAN;

CREATE TABLE A (PKey int NOT NULL IDENTITY, NewFieldKey int NULL, CONSTRAINT PK_A PRIMARY KEY (PKey));
CREATE INDEX A_2 ON A (NewFieldKey);
CREATE TABLE B (PKey int NOT NULL IDENTITY, CONSTRAINT PK_B PRIMARY KEY (PKey));
ALTER TABLE A ADD CONSTRAINT FK_B_A FOREIGN KEY (NewFieldKey) REFERENCES B (PKey);

COMMIT TRAN;

أثناء التنفيذ، إذا فشل أحد العبارات، أقوم بإجراء ROLLBACK بدلاً من COMMIT.يعمل هذا بشكل رائع على SQL Server، لكن ليس له التأثير المطلوب على Oracle.يبدو أن Oracle تقوم بالتزام ضمني بعد كل عبارة DDL:

هل هناك أي طريقة لإيقاف هذا الالتزام الضمني؟

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

المحلول

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

يمكنك الاطلاع على استخدام قاعدة بيانات FLASHBACK، وأعتقد أنه يمكنك القيام بذلك على مستوى المخطط/الكائن ولكن تحقق من المستندات لتأكيد ذلك.ستحتاج إلى أن تكون على 10G حتى يعمل ذلك.

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