Neden bazı DBMS'lerin belirli DDL deyimleri için geri alınmasına izin vermiyor?


21

Son zamanlarda MySQL öğrendim gelmez böyle garip beni vurdu PostgreSQL Kullanılmakta olan "alter table" ... gibi DDL geri alma desteklemek, ama bir arkadaşım bile Oracle buna müsaade etmediğini söyledi .. Desteklememenin teknik sebepleri var mı? Bu sadece onlar için "ilginç" bir özellik mi?

Düzenleme: bu karşılaştırmayı yeni buldum . Birçok DBMSes var gibi görünüyor yapmak destek işlem DDL.


3
MySQL bir işlem içinde DDL'ye izin vermiyor. DDL ifadelerini çalıştırmadan önce, geçerli işlemi (bu işlem içindeki tüm geçerli DML ifadeleri!) Herhangi bir uyarı vermeden tamamlar.
Frank Heikens

Kesinlikle, oldukça sinir bozucu IMO :)
Joril

Şahsen Postgres'in buna izin vermesine şaşırdım - hatta bir DROPveya bir geri alabilir misiniz RENAME?
Joe

1
Veritabanının tamamını
bırakmadığınız sürece

Bu nedenle, yalnızca Oracle ve MySQL, işlemlerde DDL ifadelerine izin vermez. Bu özellik gerçekten kolay şema dağıtmalarına izin verir.
Marian

Yanıtlar:


19

Bunun PostgreSQL'de çalışmasının nedeni, sistem kataloglarının düzenli tablolar olması. Dolayısıyla, yeni bir işlev oluşturmak, örneğin, pg_proctabloya bir satır eklemeyi gerektirir , bir sütunun varsayılan değerini değiştirmek, sadece bazı satırlarda güncelleme yapmayı gerektirir pg_attrdef. Tablolar yine de işlemsel olduğu için, bu şekilde çalışmaması için neredeyse yolunuzun dışına çıkmak zorunda kalacaksınız. (Acılı uygulama detaylarının birçoğu burada atlanmıştır. ;-))

Kaynak kodunu bilmeden, diğer veritabanı motorlarının sistem katalog bilgilerini göstermek için bazı özel iç yapılar kullandığını farz ediyorum. Bu yüzden, işlemsel DDL'nin çalışması için fazladan çaba, muhtemelen fazladan çaba harcamak zorunda kalacaklardı ve görünüşe göre bu onlar için bir öncelik değil.

Bunun en önemli yanı, PostgreSQL'in büyük sürüm yükseltmelerinin bu kadar acı verici olmasının nedeni budur. Diğer ürünler muhtemelen iç meta veri yapılarını, değişiklikleri ve güncellemeleri göz önünde bulundurarak tasarlayabilir ve bu nedenle yeni bir ana sürüme yükseltme ile ilgili sorun yoktur. PostgreSQL'de, sistem katalog tablosunu yeni bir sürüm gibi görünecek şekilde değiştirmek için sistem katalog tablosunu değiştirmenin bir yolu yoktur, en azından sistemi çevrimiçi tutarken sistem kataloglarına erişim gerektirecektir. Urgh.


1
DB'mi, sürüm yükseltme kolaylığı boyunca sürekli olarak sürekli bir durumda tercih ederim, ancak sanırım bu bir fikir meselesi :) Açıklamanız için teşekkürler!
Joril

Bu, bazı veritabanları için sorunu açıklayabilir, ancak sistem katalogları Oracle'daki düzenli tablolardır.
Leigh Riffel

10

Çoğu değil mi? Aylak.

Ben esas olarak SQL Server kullanıyorum ve kullanıyor. Oracle'ın bilmediğini biliyorum ama Oracle'ın bir sapma olabileceğini düşündüm.

SQL Server'da, tek bir işlemde birden fazla DDL ifadesi çalıştırabileceğinizden eminim, ancak bir takım kısıtlamalar da var (ki bunu unuttum). İsterseniz bir şey yaratabilir, değiştirebilir ya da bir çok şeyi bırakıp geri alabilirsiniz. Red-Gate SQL Compare (sevdiğim bir araç) bundan yararlanıyor.

Bunu yapmanın sorunu, işlem kapsamınızın oldukça ilginç hale gelmesidir ... Sistem kataloglarını bir güncelleme işlemine dahil ettiğinizde (DDL), bazı önemli kilitleri alma riskiyle karşı karşıya kalırsınız ve sistem kataloglarına erişimi engelleyebilirsiniz. Kullanıcılar sorgularını kataloglarında bulamazlarsa yapamazlar!

Ancak, denge durumunda, DDL'yi çoklu hesap işlemine dahil edebilmek çok kullanışlı.

Daha faydalı TRUNCATE olanı , SQL Server DDL komutu ayrıca çoklu ifade işleminin bir elemanı olabilir . Bir hedef tabloyu kısaltabilir (çok hızlı), oluşturabilir ve sonucu isterseniz bir taahhütte bulunabilirsiniz. Eğer bir şeyler ters giderse, geri alma ve işten çıkarma !, masayı hiç rahatsız etmemiş gibisiniz. Günlük alanı da minimize edilir. Bundan oldukça sık faydalanırım.


2
İşte SQL Server'da işleme bağlı DDL örneğini gösteren bir cevap . Ayrıca, her zaman TRUNCATEgeri alınamayacağını düşündüm . Ben hatalıydım.
Nick Chammas

5

SQL Server'da DDL deyimlerini geri alabiliriz, deyimin sonunda otomatik işleme özelliğini kullanmaz. Diğer DBMS’lerde bilmiyorum, fakat Oracle’da aynı şeyi yapamayacağımı hatırlıyorum. Her DBMS'ye özgü olduğuna inanıyorum, SQL standardı bu konuda ne söyleyeceğinden emin değil, ancak üreticinin% 100 standardı uygulayacağından emin değilim.

SO'da benzer bir soru var: Bir işlem içinde birden fazla DDL ifadesi çalıştırmak mümkün müdür (SQL Server dahilinde)?


5

Oracle, sorgu ayrıştırma paylaştı, bu nedenle bir oturum tarafından yapılan bir SELECT * FROM tablo_a (normalde) başka bir oturumunki ile aynı. Bir oturum masada on sütun olduğunu ve bir diğerinin onbir olduğunu düşündüğünde kırılırdı.


İlginçtir ki, geçen gün benzer bir sorun yaşadım, uygulamanın "sıcak" konuşlandırılabilir olması gerekiyordu, ancak yeni sürüm için masa yapısını değiştirirken, JDBC Hazırlanan Durumlarını yeniden başlatmanın dışında derleme yolu yoktu , bunun için çok fazla!
Gaius

2
Bir kenara ek olarak, 11gR2 sürümü, sıcak yükseltmelere yardımcı olmak için Sürümler kavramını sunar. Etkili bir şekilde varolan bağlantılarda bir sürüm kullanılır (beş sütunlu). Yeni bir sürüm başlatır, bir sütun ekler ve yeni oturumlar için yeni sürümü kullanarak bazı yeni bağlantılar başlatırsınız. Tüm bekleyen oturumlar bittiğinde, eski baskı oldukça zararlıdır ve her şey yeni sürümü kullanır. Geri alma yok, ancak tümü yayınlanana kadar yeni sürümünüze yeni bir etkinlik koymuyorsunuz.
Gary
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.