Einfache Einschränkung, um eine Oracle-Tabelle auf eine einzelne Zeile zu beschränken

7

Ich suche nach einer einfachen Möglichkeit, eine Anwendungskonfigurationstabelle auf 1 Zeile zu beschränken. Ich weiß, dass ich dies mit einer virtuellen Spalte tun kann, die eine Unterabfrage oder eine materialisierte Ansicht enthält, aber in Wirklichkeit ist es eine einfache Tabelle, für die ich eine Einschränkung brauche, die nicht mehr Zeilen benötigt, als die Tabelle zu erstellen. p>

Der einfachste Weg, an den ich gedacht habe, ist ein ID-Feld, das auf 1 gesetzt ist, und eine Check-Einschränkung, dass die ID 1 sein muss - aber das fügt der Tabelle ein verwirrendes zusätzliches Feld hinzu, also hoffe ich, dass etwas offensichtlich ist. m fehlt, wie eine Prüfbedingung, bei der UNIQUE_FIELD = MAX (UNIQUE_FIELD) nicht zulässig ist.

    
orbfish 29.03.2011, 19:38
quelle

3 Antworten

13

Am einfachsten ist ein eindeutiger funktionsbasierter Index für eine Konstante

%Vor%

Alternativen:

Statt einer Tabelle könnten Sie einen Blick auf DUAL werfen Das würde wirklich bedeuten, dass UPDATE tatsächlich eine CREATE- oder REPLACE-VIEW wäre, die möglicherweise nicht angemessen ist. Funktionen, die Werte aus einem Pakethauptteil oder aus globalen Anwendungskontexten zurückgeben, können eine Umgehung dafür sein, wenn dies zu Ungültigkeitsproblemen führt.

Mit 11g ist eine READ ONLY-Tabelle (oder in früheren Versionen eine Tabelle in einem schreibgeschützten Tablespace) eine Option.

    
Gary Myers 29.03.2011, 22:46
quelle
6

Hier sind einige Optionen:

  • Widerrufen Sie die INSERT-Berechtigungen für diese Tabelle.
  • Verwalten Sie den gesamten Zugriff auf die Konfigurationstabelle über Prozeduren
  • Ersetzen Sie die Konfigurationstabelle durch eine Ansicht, die eine Spalte mit einer Prüfbedingung (col = 1) und einer eindeutigen Integritätsbedingung ausblendet.
  • Erstellen Sie diese materialisierte Ansicht trotzdem
  • Erstellen Sie eine Tabelle, die die Feuer auf INSERT auslöst, die eine Ausnahme auslösen
  • Überdenken Sie die Tabellenstruktur und fügen Sie ein FROM_DATE hinzu, damit die Tabelle NICHT aktualisiert wird, sondern Sie jedes Mal eine neue Zeile erstellen. Ihre aktuelle Konfiguration ist die Zeile mit dem höchsten from_date. Eine current_config-Ansicht über diese Tabelle ist nützlich.
  • Ersetzen Sie die Tabelle durch eine als SELECT 1024 as buffer_size, '/var/tmp' as temp_dir, 'other constant' as other_constant from dual definierte Ansicht. Dies ist keine feste Lösung.
Ronnis 29.03.2011 20:10
quelle
0
%Vor%

(ungetestet)

SQL verfügt nicht über eine präzise Syntax, um die leere Gruppe von Attributen als Schlüssel anzugeben, was eine Schande ist, da die redundante zusätzliche Spalte nicht mehr benötigt wird. Der effektive Schlüssel hier ist tatsächlich die leere Menge, weshalb ich eine UNIQUE-Einschränkung anstelle von PRIMARY KEY für die Einschränkung auf x verwendet habe.

    
sqlvogel 30.03.2011 08:15
quelle