2017-02-02 5 views
0

Ich möchte eine Tabelle mit einer Spalte erstellen, die auf den Namen einer Sequenz verweist, die ich auch erstellt habe. Im Idealfall möchte ich eine Fremdschlüsseleinschränkung, die dies erzwingt. Ich habe versucht,Erstellen Sie eine Oracle-Fremdschlüsseleinschränkung, die auf USER_SEQUENCES (SEQUENCE_NAME) verweist?

create table testtable (
    sequence_name varchar2(128), 
    constraint testtableconstr 
    foreign key (sequence_name) 
    references user_sequences (sequence_name) 
    on delete set null 
); 

aber ich bin ein SQL Error: ORA-01031: insufficient privileges bekommen. Ich vermute, entweder ist das nicht möglich, oder ich muss etwas wie on update cascade hinzufügen. Was, wenn überhaupt, kann ich tun, um diese Einschränkung zu erzwingen, wenn ich Zeilen in diese Tabelle einfüge?

+0

Ich würde nicht empfehlen, einen Fremdschlüssel zu Metadatentabellen zu machen. Es würde XREF zwischen Ihrem Code und dem Datenbankmodell bringen. Nicht nur das, sondern USER_SEQUENCES ist ein Synonym, das auf eine Ansicht verweist. Sie müssten auf die zugrunde liegende physische Metadatentabelle verweisen. Sie können jedoch INSERT/UPDATE-Trigger für Ihre Tabelle verwenden, um zu überprüfen, ob die Sequenz in USER_SEQUENCES vorhanden ist, und eine Ausnahme auslösen, wenn sie nicht für Einfügungen und Aktualisierungen verwendet wird. Nun, was machst du mit der "DROP SEQUENCE" ... –

+0

@MarcoPolo Was genau meinst du mit XREF zwischen meinem Code und dem Datenbankmodell? Abhängig davon, dass es eine user_sequence synonym/view/table gibt? –

+0

Wenn Sie "SELECT * FROM USER_SEQUENCES" ausführen, verwenden Sie wirklich ein öffentliches Synonym namens "USER_SEQUENCES", das auf eine Ansicht namens "SYS.USER_SEQUENCES" verweist. Diese Ansicht verwendet SYS.SEQ $ und SYS.OBJ $, die Oracle-interne Tabellen sind. Wenn Sie direkt auf diese Tabellen verweisen, sind Sie jetzt von der Oracle-Version Ihrer Datenbank abhängig. Zukünftige Upgrades könnten dein Modell vermasseln. Ein Auslöser löst dich vom physischen Oracle-Tisch und ist eleganter und sicherer. –

Antwort

0

Ich nehme an, Sie versuchen, eine Art von Deployment-Management-System zu erstellen, um Ihre Schema-Objekte einschließlich Sequenzen zu verfolgen.

zu tun, was Sie fragen, können Sie eine der folgenden Optionen erkunden könnten:

  1. nach jedem Einsatz einen Bericht ausführen, um die Werte in der Tabelle gegenüber dem Data Dictionary-View vergleicht und listet alle Diskrepanzen .

  2. Erstellen Sie einen DDL-Trigger, der das Einfügen automatisch ausführt, wenn eine Sequenz erstellt wird.

  3. Fügen Sie der Tabelle einen Trigger hinzu, der eine Abfrage in der Sequenzansicht ausführt, und löst eine Ausnahme aus, wenn sie nicht gefunden wird.

+0

Sie müssen verstehen, was eine Sequenz ist und es ist typische Anwendungsfall. In der Regel verwenden Sie eine eindeutige Zahl, die als Primärschlüssel verwendet wird. Sie greifen darauf über .nextval zu. Sie können dann die Sequenz für Fremdschlüssel verwenden, über .currval – BobC

+0

Hi BobC, das ist richtig, aber das ist nicht wirklich, worüber wir hier reden - das könnte jedes Schema-Objekt sein, nicht nur eine Sequenz. –

+0

Option drei ist, was in meinem Fall gilt. Ich benutze tatsächlich verschiedene Sequenzen, um Unterkonten für verschiedene Konten zu generieren. Es gibt wahrscheinlich einen besseren Weg, aber es scheint einfacher zu sein, als direkt mit Sperren umzugehen. –

0

Ich bin etwas verwirrt in dem, was Sie hier erreichen wollen - eine Sequenz (effektiv) hat nur einen einzigen Wert, die nächste Nummer zuzuordnen, nicht alle Werte, die zuvor zugewiesen wurden.

Wenn Sie einfach sicherstellen möchten, dass ein Attribut in der Relation aus der Sequenz gefüllt wird, dann wäre ein Trigger der richtige Ansatz.

+0

Ich möchte Sequenznamen in meiner Tabelle referenzieren können.Ich möchte in der Lage sein, Sequenz seqA zu erstellen; Sequenz seqB erstellen; Einfügen in testable (sequence_name) Werte ('SEQA'); Einfügen in testable (sequence_name) -Werte ('SEQB') ', aber dann ein Fehler, wenn ich versuche, 'in testable (sequence_name) -Werte (' SEQC ') einzufügen;', vorausgesetzt, die Sequenz' SEQC 'wurde nicht erstellt . –

+0

Sorry, das hilft mir nicht zu verstehen, was Sie wollen. – symcbean

+1

@BenjaminBerman Warum nicht eine logische Erklärung (im Gegensatz zur Beschreibung einer Implementierung) versuchen, was Sie erreichen möchten. – BobC

Verwandte Themen