2013-06-17 19 views
9

私は、Oracleデータベース・ユーザーに属する配列のリストを取得するために、このクエリを使用しているOracleテーブルに関連付けられているトリガー:シーケンスを見つけると

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

しかし、そのデータベース・ユーザーは、より多くの配列を有するされているので、クエリは、データベースユーザーのすべてのシーケンスを返します。誰でも私のアプリケーションで自動インクリメントIDを取得できるように、my_tableのクエリを使用して特定のシーケンスを見つけるのを助けることができます。

+2

シーケンスは、トリガーまたは明示的な挿入ステートメント(ストアドプロシージャ/パッケージ内にある可能性があります)を介して間接的にのみ、テーブルに直接リンクされません。おそらくあなたは値を設定しているトリガーを探しています。しかし、あなたはそれについて知る必要はなく、IDはバックグラウンドで自動的に設定されます。シーケンス名とテーブル名を関連付ける命名規則がない限り、(all_source'で)トリガーコードを見ることができればそれを検索し、他の人に尋ねやすいテーブルフォームを作成する必要がありますユーザー、多分? –

+0

実際には、テーブルで使用されるシーケンスとトリガを使用して、データベースユーザのテーブルのリストを取得するクエリが必要です。 – user2492525

+2

@ user2492525では、Oracleがそれらの間の接続を維持しないため、どの表にどの順序が使用されているかを照会する方法はありません。あなたのアプリケーション*はIDを生成するためにトリガを使用するかもしれません。その場合、Alex Pooleの答えは有用かもしれません。別のアプリケーションがトリガーをまったく使用せず、アプリケーションコード内のシーケンスを呼び出すことがあります。要するに、問題に対する一般的な解決策はありません。 –

答えて

7

iはテーブル

で使用されるシーケンスとトリガーと私のデータベースユーザーのテーブルのリストを取得クエリをしたいあなたはuser_triggersビューから、あなたのテーブルに関連付けられているトリガーを得ることができます。 user_dependenciesには、シーケンス(パッケージなど)以外のオブジェクトが含まれている可能性があるため、これらのトリガーに記録された依存関係は、user_sequencesビューに結合すると、興味のあるもののみが表示されます。

このような何か、あなたが自分のスキーマを見ている、とあなたはシーケンス参照トリガーでのみ興味深いです(必ずしも「自動インクリメント」を行っていないが、可能性が高い)と仮定:

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

実際に別のスキーマを見ている場合は、all_tablesなどを使用して、探しているユーザーの所有者の列をフィルタリングして結合する必要があります。また、トリガーを持たない表やシーケンスを参照しないトリガーを組み込む場合は、外部結合を使用できます。


バージョンこれは、データ・ディクショナリ情報にアクセスするために必要なPRIVSを持っていると仮定しても、異なるスキーマを探している - などのテーブルは、彼らができない可能性がある、あなたに表示されていること:

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>'; 

それはあなたが十分なPRIVSを持っている場合は、それらは、あなたがもう一度、DBAビューを見るために必要がある場合があります見ることができない場合は、次の

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 - なぜあなたはそれをやっていますか?なぜあなたはテーブル/トリガー/シーケンス名をジョインに含めませんか? –

+0

私はすべてこれに参加しましたが、私のシーケンス名は私のトリガー名とは異なりますので、私には何の値も返しません。 – user2492525

+0

@ user2492525 - なぜそれが問題なのか分かりません。あなたは各段階で適切な名前に参加する必要があります。 –

1

私はAPのシーケンスを推測するために、この問題への解決策を見つけました関節シーケンスこのクエリは、シーケンスを使用して、フィールドのMAX値と最大値+ 40の間の配列値のLAST_NUMBERを検索することにより、推測します

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); 

(私の場合、キャッシュ値が20であるので、私は40を置く)

関連する問題