2013-06-17 18 views
9

Bir Oracle veritabanı kullanıcıya ait dizilerin listesini almak için bu sorgu kullandık:bulma dizileri ve tetikleyiciler

SELECT * FROM all_sequences x,all_tables B 
WHERE x.sequence_owner=B.owner AND B.TABLE_NAME='my_table'; 

Ancak bu veri tabanı kullanıcı da çok daha fazla dizisine sahip olan, bu yüzden sorgu, veritabanı kullanıcısının tüm sırasını döndürür. Uygulamamda otomatik artış kimliğini alabilmem için my_table sorgusunu kullanmam için bana yardımcı olabilir.

+2

Bir sekans doğrudan bir tabloya bağlı değildir, sadece bir tetikleyici veya açık bir ek ifadeyle dolaylı olarak (saklı yordam/paket içinde olabilir). 'Otomatik artış' ifadesinden bahsetmiş olduğunuzdan, değeri ayarlayan bir tetikleyici arıyorsunuzdur. ama sonra bunu bilmenize gerek yok, kimlik arka planda otomatik olarak ayarlanacaktır. Sıra ismini tablo adıyla ilişkilendiren bir adlandırma kuralı yoksa, tetikleyici kodunu ('all_source'da) aramanız gerekir, eğer sizin için görünürse ve tablo formunu bu şekilde çalıştırırsanız - diğerine daha kolay sormanız gerekir kullanıcı, belki? –

+0

Aslında, veritabanı kullanıcımın tablosunun listesini tablodaki diziyi ve tetikleyicileri içeren sorguyu istiyorum. – user2492525

+2

@ user2492525, herhangi bir tablo için hangi sekansların kullanıldığını sorgulamanın bir yolu yoktur * çünkü bunlar arasında bağlantı yoktur.Uygulamanız * kimlikleri yerleştirmek için tetikleyicileri kullanabilir *, bu durumda Alex Poole'un cevabı yararlı olabilir; veya başka bir uygulama tetikleyicileri hiç kullanmayabilir ve uygulama kodunda diziyi çağırabilir. Alt satırda, sorununuza yönelik genel bir çözüm yoktur. –

cevap

7

i masaya

kullanılan dizisi ve tetikleyiciler ile benim veritabanı kullanıcı tablosunun listesi getirilemedi sorgu istiyorum Sen user_triggers görünümden tablolar ilişkilendirilmiş tetikleyicileri alabilirsiniz. Daha sonra size ilgilendiğiniz olanları göstermek sadece bu yüzden user_sequences görünümüne bu bağımlılıkları katılmadan, diziler (paketler vb) dışında nesneler içerebilir user_dependencies bu tetikleyiciler için kaydedilen herhangi bağımlılıkları, arayabilirsiniz.

böyle bir şey, kendi şema bakıyoruz varsayarak ve dizileri başvuruda bulunduğunu tetikleyiciler sadece ilginçler (illa 'otomatik artışı' yapmıyorlar, ama olması muhtemeldir):

select tabs.table_name, 
    trigs.trigger_name, 
    seqs.sequence_name 
from user_tables tabs 
join user_triggers trigs 
    on trigs.table_name = tabs.table_name 
join user_dependencies deps 
    on deps.name = trigs.trigger_name 
join user_sequences seqs 
    on seqs.sequence_name = deps.referenced_name; 

SQL Fiddle demo.

Aslında farklı bir şemaya bakıyorsanız, all_tables vb. Kullanmanız ve aradığınız kullanıcı için filtrelenip sahip sütununa katılmanız gerekir. Tetikleyicileri olmayan tabloları veya dizilere başvurmayan tetikleyicileri eklemek istiyorsanız, dış birleştirmeler kullanabilirsiniz. Farklı şema arayan


Sürüm, bu varsayar olsa veri sözlüğü bilgileri erişmek için gerekli privs var - vb tablolar bunlar olmayabilir, hangi size görünür olmasını:

select tabs.table_name, 
    trigs.trigger_name, 
    seqs.sequence_name 
from all_tables tabs 
join all_triggers trigs 
    on trigs.table_owner = tabs.owner 
    and trigs.table_name = tabs.table_name 
join all_dependencies deps 
    on deps.owner = trigs.owner 
    and deps.name = trigs.trigger_name 
join all_sequences seqs 
    on seqs.sequence_owner = deps.referenced_owner 
    and seqs.sequence_name = deps.referenced_name 
where tabs.owner = '<owner>'; 

o zaman onları göremiyorum Eğer yeterli privs var yine eğer, DBA görünümleri bakmak gerekebilir:

select tabs.table_name, 
    trigs.trigger_name, 
    seqs.sequence_name 
from dba_tables tabs 
join dba_triggers trigs 
    on trigs.table_owner = tabs.owner 
    and trigs.table_name = tabs.table_name 
join dba_dependencies deps 
    on deps.owner = trigs.owner 
    and deps.name = trigs.trigger_name 
join dba_sequences seqs 
    on seqs.sequence_owner = deps.referenced_owner 
    and seqs.sequence_name = deps.referenced_name 
where tabs.owner = '<owner>'; 
+0

@ user2492525 - Peki neden yapıyorsunuz? Neden birleştirmelerde tablo/tetikleyici/sıra adı dahil etmiyorsunuz? –

+0

Sadece bunlara ekledim ama benim sıra ismim tetikleyici ismimden farklıdır, bu yüzden bana herhangi bir değer getirmiyor – user2492525

+0

@ user2492525 - Neden bu bir sorun olduğunu bilmiyorum, bağlı olduğum SQL Fiddle farklı isimler vardı. Her aşamada sadece uygun isme katılmanız gerekiyor. –

1

ben ap dizisini tahmin etmek bu soruna bir çözüm buldu eklem dizisi

select * from SYS.ALL_SEQUENCES where SEQUENCE_OWNER='OWNER_NAME' and LAST_NUMBER between (select max(FIELD_NAME) from TABLE_NAME) and (select max(FIELD_NAME)+40 from TABLE_NAME); 

Bu sorgu sırasını ve Max değeri + 40 kullanılarak alanın MAX değeri arasındaki sekans değerinin LAST_NUMBER arama tarafından tahmin edecek (ki benim durumumda önbellek değerindeki 20, bu yüzden 40 koyun)