2010-09-13 13 views
9

Büyük bir Oracle veritabanının toplu olarak toplu olarak taşınmasını yapıyorum. Bunun ilk adımı, daha sonra onları bırakmaya hazırlanmak için bir tablo yükünü yeniden adlandırmayı içerir (ancak verileri şu ana kadar bunların içinde bulundurmam gerekir). Onlarda herhangi bir yabancı anahtar kısıtlaması bırakılmalıdır - bunlar veritabanının geri kalanına hiç bağlı olmamalıdır. Onları bırakıyor olsaydım şimdi CASCADE CONSTRAINTS olabilir, ancak yeniden adlandırmak sadece kısıtları değiştirir.Oracle - tabloları düşürmeden tablo kısıtlamalarını azaltma

CASCADE CONSTRAINTS tablonun kendisini bırakmadan tüm kısıtlamaları bırakabileceğim bir yol var mı?

cevap

18

Dinamik SQL ve veri sözlüğü ile yapabilirsiniz Beyan. Korkarım ki tüm tablolardan daha azına dokunmak istiyorsanız, adlarına bazı desenler olmadıkça, WHERE yan tümcesinde listeyi belirtmeniz gerekir.

+0

Bu iyi görünüyor. Hangi tabloları değiştirmek ve değiştirmek istediğimi yansıtmak için birkaç kısıtlama ekledim. Teşekkürler! – Submonoid

0

Kısıtlama yapmadan kısıtlamaları devre dışı bırakabilir/yeniden etkinleştirebilirsiniz. this article'a bir göz atın. tablolar birden çok kullanıcının sahip olduğu takdirde

begin 
    for r in (select table_name, constraint_name 
       from user_constraints 
       where constraint_type = 'R') 
    loop 
     execute immediate 'alter table '||r.table_name 
          ||' drop constraint '||r.constraint_name; 
    end loop; 
end loop; 

Eğer DBA_CONSTRAINTS gelen sürücü gerekir ve projeksiyon ve idam içinde SAHİBİ ekleriz:

+0

Doğru, ama bu bana gerçekten yardımcı olmuyor. Bireysel kısıtlamaların bırakılması/devre dışı bırakılması için gidebilirdim, ancak bu büyük bir veritabanı ve hareket ettiğim tablolara referans veren tüm kısıtlamaları bulmak istemiyorum. Tüm kısıtlamaları otomatik olarak 'DROP TABLE foo CASCADE CONSTRAINTS' kullanmış olmama rağmen bırakabilmeyi istiyorum. – Submonoid

İlgili konular