Finden Sie heraus, ob eine Spalte in Oracle eine Sequenz hat
Ich bin versucht, herauszufinden, ob eine Spalte in Oracle ist bevölkert von einer Sequenz. Mein Eindruck, wie die Oracle-Griffe-Sequenzierung die Sequenz und Spalte getrennte Einheiten sind, und man muss entweder manuell legen Sie die nächste sequence-Wert wie:
insert into tbl1 values(someseq.nextval, 'test')
oder legen Sie Sie in einer Tabelle auslösen. Das bedeutet, dass es ist nicht trivial zu sagen, wenn eine Spalte gefüllt ist, die in einer Sequenz. Ist das richtig? Irgendwelche Ideen, wie ich Vorgehen könnten, herauszufinden, ob eine Spalte gefüllt ist, die in einer Sequenz?
InformationsquelleAutor der Frage stimms | 2009-11-13
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie richtig; die Reihenfolge ist unabhängig von der Tabelle, und eine einzelne Sequenz kann verwendet werden, um füllen Sie jede Tabelle, und die Werte in einer Spalte in einer Tabelle können, stammen überwiegend aus einer Sequenz (oder Sequenzen), außer für die Werte, die manuell erzeugt werden.
In anderen Worten, es gibt keine zwingende Verbindung zwischen einer Spalte und einer Sequenz - und daher keine Möglichkeit zu entdecken, wie eine Beziehung aus dem schema.
Letztlich die Analyse wird der Quellcode aller Anwendungen, einfügen oder aktualisieren von Daten in der Tabelle. Sonst ist nichts garantiert. Reduzieren Sie den Umfang der Suche, wenn es eine gespeicherte Prozedur ist, dass ist der einzige Weg, um änderungen an der Tabelle, oder, wenn es einen trigger, der den Wert festlegt, oder andere solche Dinge. Aber die Allgemeine Lösung ist die "nicht-Lösung" der "Analyse der Quelle".
InformationsquelleAutor der Antwort Jonathan Leffler
Wenn die Sequenz in einem auslösen, ist es möglich zu ermitteln, welche Tabellen erstellt:
Variieren Sie diese Abfrage zu finden, stored procedures, etc, in der Reihenfolge.
InformationsquelleAutor der Antwort APC
Gibt es keine direkten Metadaten Verknüpfungen zwischen Oracle Sequenzen und jegliche Verwendung in der Datenbank. Sie könnten eine intelligente erraten, wenn eine Spalte die Werte beziehen sich auf eine Sequenz von Abfragen der USER_SEQUENCES Metadaten und vergleichen Sie die LAST_NUMBER-Spalte, um die Daten für die Spalte.
InformationsquelleAutor der Antwort dpbradley
Als Jonathan darauf hingewiesen: es gibt keinen direkten Weg, um sich sowohl Objekte. Jedoch, wenn Sie "führen Sie ein standard" für Primärschlüssel und Sequenzen/Trigger, die Sie finden konnte heraus finden, indem der primary key -, und ordnen Sie dann die Einschränkung auf den Tisch-Sequenz.
Ich war in der Notwendigkeit etwas ähnliches, da wir den Bau einer multi-db-Produkt, und ich habe versucht, zu replizieren, werden einige Klassen mit Eigenschaften gefunden, die in einem DataTable-Objekt aus .Net, die hat AutoIncrement, IncrementSeed und IncrementStep, die nur in den Sequenzen.
So, wie ich sagte, wenn Sie für Ihre Tabellen verwenden eine PK und haben immer eine Sequenz, verbunden mit einem Auslöser für inserts auf eine Tabelle, dann kann dies sehr praktisch sein:
Dass würde Ihnen die Liste der Spalten, für die ein schema/Tabelle mit:
Ich bin mir ziemlich sicher, dass der code optimiert werden kann, aber es funktioniert für mich, ich benutze es, um "laden der Metadaten", für Tabellen und dann darstellen, dass Metadaten, die als Entitäten auf meinem frontend.
Beachten Sie, dass ich die Filter nur Primärschlüssel und nicht abrufen compound key-Einschränkungen da ich nicht Pflege darüber. Wenn Sie das tun, werden Sie haben, ändern Sie den code so zu tun und stellen Sie sicher, dass Sie filter Duplikate, da konnte man eine Spalte zweimal (einer für die PK-constraint, ein anderes für den zusammengesetzten Schlüssel).
InformationsquelleAutor der Antwort Gustavo Rubio
InformationsquelleAutor der Antwort Ali