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?
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" ... –
@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? –
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. –