it-swarm.com.de

Ist es in Oracle möglich, einen Datensatz über eine Ansicht EINZUFÜGEN oder ZU AKTUALISIEREN?

Ist es in Oracle möglich, einen Datensatz (eine Zeile) über eine Ansicht einzufügen oder zu aktualisieren?

32

Ansichten in Oracle können unter bestimmten Bedingungen aktualisiert werden. Es kann schwierig sein und ist normalerweise nicht ratsam.

Aus der Oracle 10g SQL-Referenz :

Hinweise zu aktualisierbaren Ansichten

Eine aktualisierbare Ansicht kann zum Einfügen, Aktualisieren oder Löschen von Basistabellenzeilen verwendet werden. Sie können eine Ansicht erstellen, die von Natur aus aktualisierbar ist, oder Sie können einen INSTEAD OF-Trigger für jede Ansicht erstellen, um sie aktualisierbar zu machen.

Fragen Sie in der Data Dictionary-Ansicht USER_UPDATABLE_COLUMNS ab, ob und auf welche Weise die Spalten einer inhärent aktualisierbaren Ansicht geändert werden können. Die von dieser Ansicht angezeigten Informationen sind nur für inhärent aktualisierbare Ansichten von Bedeutung. Damit eine Ansicht von Natur aus aktualisiert werden kann, müssen die folgenden Bedingungen erfüllt sein:

  • Jede Spalte in der Ansicht muss einer Spalte einer einzelnen Tabelle zugeordnet sein. Wenn beispielsweise eine Ansichtsspalte der Ausgabe einer TABLE-Klausel (einer nicht verschachtelten Auflistung) zugeordnet ist, kann die Ansicht nicht automatisch aktualisiert werden.
  • Die Ansicht darf keines der folgenden Konstrukte enthalten:
    • Ein festgelegter Operator
    • ein DISTINCT-Operator
    • Eine aggregierte oder analytische Funktion
    • Eine GROUP BY-, ORDER BY-, MODEL-, CONNECT BY- oder START WITH-Klausel
    • Ein Sammlungsausdruck in einer SELECT-Liste
    • Eine Unterabfrage in einer SELECT-Liste
    • Eine Unterabfrage mit der Bezeichnung WITH READ ONLY
    • Beitritt, mit einigen Ausnahmen, wie im Oracle Database Administrator's Guide dokumentiert

Wenn eine inhärent aktualisierbare Ansicht Pseudospalten oder Ausdrücke enthält, können Sie Basistabellenzeilen nicht mit einer UPDATE-Anweisung aktualisieren, die auf eine dieser Pseudospalten oder Ausdrücke verweist.

Wenn eine Join-Ansicht aktualisiert werden soll, müssen alle folgenden Bedingungen erfüllt sein:

  • Die DML-Anweisung darf sich nur auf eine Tabelle auswirken, die dem Join zugrunde liegt.
  • Bei einer INSERT-Anweisung darf die Sicht nicht WITH CHECK OPTION erstellt werden, und alle Spalten, in die Werte eingefügt werden, müssen aus einer schlüsselkonservierten Tabelle stammen. Bei einer schlüsselkonservierten Tabelle ist jeder Primärschlüssel oder eindeutige Schlüsselwert in der Basistabelle auch in der Verknüpfungsansicht eindeutig.
  • Bei einer UPDATE-Anweisung müssen alle aktualisierten Spalten aus einer schlüsselkonservierten Tabelle extrahiert werden. Wenn die Ansicht WITH CHECK OPTION erstellt wurde, müssen Verknüpfungsspalten und Spalten aus Tabellen, auf die in der Ansicht mehrmals verwiesen wird, vor UPDATE geschützt werden.
  • Wenn bei einer DELETE-Anweisung der Join zu mehr als einer schlüsselerhaltenden Tabelle führt, löscht Oracle Database aus der ersten in der FROM-Klausel genannten Tabelle, ob die Sicht WITH CHECK OPTION erstellt wurde oder nicht.
42
DCookie

Oracle hat zwei verschiedene Möglichkeiten, Ansichten aktualisierbar zu machen:

  1. Die Ansicht ist in Bezug auf das, was Sie aktualisieren möchten, "Schlüssel erhalten". Dies bedeutet, dass sich der Primärschlüssel der zugrunde liegenden Tabelle in der Ansicht befindet und die Zeile nur einmal in der Ansicht angezeigt wird. Dies bedeutet, dass Oracle genau herausfinden kann, welche zugrunde liegende Tabellenzeile aktualisiert werden muss
  2. Sie schreiben einen statt eines Triggers.

Ich würde mich von Triggern fernhalten und Ihren Code dazu bringen, die zugrunde liegenden Tabellen direkt und nicht über die Ansicht zu aktualisieren.

10
WW.

Es gibt zwei Möglichkeiten, einen Datensatz über eine Ansicht zu aktualisieren:

  1. Wenn die Ansicht keine Joins oder Prozeduraufrufe hat und Daten aus einer einzelnen zugrunde liegenden Tabelle auswählt.
  2. Wenn der Ansicht ein INSTEAD OF INSERT-Trigger zugeordnet ist.

Im Allgemeinen sollten Sie sich nicht darauf verlassen, dass Sie eine Einfügung in eine Ansicht durchführen können, es sei denn, Sie haben speziell einen INSTEAD OF-Trigger dafür geschrieben. Beachten Sie, dass es auch STATT UPDATE-Trigger gibt, die zur Durchführung von Updates geschrieben werden können.

4
LBushkin

[~ # ~] ja [~ # ~] , Sie können aktualisieren und in die Ansicht einfügen, und diese Bearbeitung wird in der Originaltabelle wiedergegeben ....
[~ # ~] aber [~ # ~]
1-Die Ansicht sollte alle NOT NULL Werte in der Tabelle haben
2-das Update sollte die gleichen Regeln haben wie Tabelle ... "Aktualisierung des Primärschlüssels in Bezug auf einen anderen Fremdschlüssel .. etc" ...

0
Radi Soufan